Updated TGK/PROV to no longer hard‑require neighbors

This commit is contained in:
Carl Niklas Rydberg 2025-12-21 20:16:46 +01:00
parent d7b456654b
commit 8f3282bbce

View file

@ -283,6 +283,84 @@ static void amduat_tgk_prov_reference_list_free(amduat_reference_t *nodes,
free(nodes);
}
static bool amduat_tgk_prov_collect_neighbors(
amduat_tgk_store_t *store,
amduat_reference_t node,
amduat_tgk_edge_type_filter_t type_filter,
amduat_tgk_graph_direction_t direction,
amduat_tgk_node_list_t *out_nodes) {
amduat_reference_t *nodes = NULL;
size_t nodes_len = 0;
size_t nodes_cap = 0;
amduat_tgk_graph_edge_view_list_t edges = {0};
size_t i;
size_t j;
if (store == NULL || out_nodes == NULL) {
return false;
}
out_nodes->nodes = NULL;
out_nodes->len = 0;
if (store->ops.neighbors != NULL) {
return store->ops.neighbors(store->ctx, node, type_filter, direction,
out_nodes);
}
if (direction == AMDUAT_TGK_GRAPH_DIR_OUT ||
direction == AMDUAT_TGK_GRAPH_DIR_BOTH) {
if (!amduat_tgk_store_edges_from(store, node, type_filter, &edges)) {
goto cleanup;
}
for (i = 0; i < edges.len; ++i) {
const amduat_tgk_edge_body_t *body = &edges.edges[i].body;
for (j = 0; j < body->to_len; ++j) {
if (!amduat_tgk_prov_node_set_add(body->to[j], &nodes, &nodes_len,
&nodes_cap)) {
amduat_tgk_graph_edge_view_list_free(&edges);
goto cleanup;
}
}
}
amduat_tgk_graph_edge_view_list_free(&edges);
edges.edges = NULL;
edges.len = 0;
}
if (direction == AMDUAT_TGK_GRAPH_DIR_IN ||
direction == AMDUAT_TGK_GRAPH_DIR_BOTH) {
if (!amduat_tgk_store_edges_to(store, node, type_filter, &edges)) {
goto cleanup;
}
for (i = 0; i < edges.len; ++i) {
const amduat_tgk_edge_body_t *body = &edges.edges[i].body;
for (j = 0; j < body->from_len; ++j) {
if (!amduat_tgk_prov_node_set_add(body->from[j], &nodes, &nodes_len,
&nodes_cap)) {
amduat_tgk_graph_edge_view_list_free(&edges);
goto cleanup;
}
}
}
amduat_tgk_graph_edge_view_list_free(&edges);
edges.edges = NULL;
edges.len = 0;
}
if (nodes_len > 1) {
qsort(nodes, nodes_len, sizeof(*nodes), amduat_tgk_prov_ref_ptr_cmp);
}
out_nodes->nodes = nodes;
out_nodes->len = nodes_len;
return true;
cleanup:
amduat_tgk_graph_edge_view_list_free(&edges);
amduat_tgk_prov_reference_list_free(nodes, nodes_len);
return false;
}
static bool amduat_tgk_prov_edge_body_clone(const amduat_tgk_edge_body_t *src,
amduat_tgk_edge_body_t *dst) {
size_t i;
@ -471,8 +549,9 @@ static bool amduat_tgk_prov_build_depth_entries(
neighbors.nodes = NULL;
neighbors.len = 0;
if (!amduat_tgk_store_neighbors(store, builder.entries[index].node,
query.type_filter, dir, &neighbors)) {
if (!amduat_tgk_prov_collect_neighbors(store, builder.entries[index].node,
query.type_filter, dir,
&neighbors)) {
amduat_tgk_node_list_free(&neighbors);
goto cleanup;
}