Updated TGK/PROV to no longer hard‑require neighbors
This commit is contained in:
parent
d7b456654b
commit
8f3282bbce
|
|
@ -283,6 +283,84 @@ static void amduat_tgk_prov_reference_list_free(amduat_reference_t *nodes,
|
||||||
free(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,
|
static bool amduat_tgk_prov_edge_body_clone(const amduat_tgk_edge_body_t *src,
|
||||||
amduat_tgk_edge_body_t *dst) {
|
amduat_tgk_edge_body_t *dst) {
|
||||||
size_t i;
|
size_t i;
|
||||||
|
|
@ -471,8 +549,9 @@ static bool amduat_tgk_prov_build_depth_entries(
|
||||||
|
|
||||||
neighbors.nodes = NULL;
|
neighbors.nodes = NULL;
|
||||||
neighbors.len = 0;
|
neighbors.len = 0;
|
||||||
if (!amduat_tgk_store_neighbors(store, builder.entries[index].node,
|
if (!amduat_tgk_prov_collect_neighbors(store, builder.entries[index].node,
|
||||||
query.type_filter, dir, &neighbors)) {
|
query.type_filter, dir,
|
||||||
|
&neighbors)) {
|
||||||
amduat_tgk_node_list_free(&neighbors);
|
amduat_tgk_node_list_free(&neighbors);
|
||||||
goto cleanup;
|
goto cleanup;
|
||||||
}
|
}
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue