MCPcopy Create free account
hub / github.com/DeusData/codebase-memory-mcp / expand_fixed_length

Function expand_fixed_length

src/cypher/cypher.c:3235–3289  ·  view source on GitHub ↗

Expand fixed-length (1-hop) relationship edges */

Source from the content-addressed store, hash-verified

3233
3234/* Expand fixed-length (1-hop) relationship edges */
3235static void expand_fixed_length(cbm_store_t *store, cbm_rel_pattern_t *rel,
3236 cbm_node_pattern_t *target_node, binding_t *b, cbm_node_t *src,
3237 const char *to_var, binding_t **new_bindings, int *new_count,
3238 int *new_cap, int *match_count) {
3239 bool is_inbound = rel->direction && strcmp(rel->direction, "inbound") == 0;
3240 bool is_any = rel->direction && strcmp(rel->direction, "any") == 0;
3241 const char *rel_var = rel->variable;
3242
3243 if (rel->type_count > 0) {
3244 for (int ti = 0; ti < rel->type_count; ti++) {
3245 cbm_edge_t *edges = NULL;
3246 int edge_count = 0;
3247 if (is_inbound) {
3248 cbm_store_find_edges_by_target_type(store, src->id, rel->types[ti], &edges,
3249 &edge_count);
3250 } else {
3251 cbm_store_find_edges_by_source_type(store, src->id, rel->types[ti], &edges,
3252 &edge_count);
3253 }
3254 process_edges(store, edges, edge_count, is_inbound, target_node, b, to_var, rel_var,
3255 new_bindings, new_count, new_cap, match_count);
3256 cbm_store_free_edges(edges, edge_count);
3257 }
3258 if (is_any) {
3259 for (int ti = 0; ti < rel->type_count; ti++) {
3260 cbm_edge_t *edges = NULL;
3261 int edge_count = 0;
3262 cbm_store_find_edges_by_target_type(store, src->id, rel->types[ti], &edges,
3263 &edge_count);
3264 process_edges(store, edges, edge_count, true, target_node, b, to_var, rel_var,
3265 new_bindings, new_count, new_cap, match_count);
3266 cbm_store_free_edges(edges, edge_count);
3267 }
3268 }
3269 } else {
3270 cbm_edge_t *edges = NULL;
3271 int edge_count = 0;
3272 if (is_inbound) {
3273 cbm_store_find_edges_by_target(store, src->id, &edges, &edge_count);
3274 } else {
3275 cbm_store_find_edges_by_source(store, src->id, &edges, &edge_count);
3276 }
3277 process_edges(store, edges, edge_count, is_inbound, target_node, b, to_var, rel_var,
3278 new_bindings, new_count, new_cap, match_count);
3279 cbm_store_free_edges(edges, edge_count);
3280 if (is_any) {
3281 edges = NULL;
3282 edge_count = 0;
3283 cbm_store_find_edges_by_target(store, src->id, &edges, &edge_count);
3284 process_edges(store, edges, edge_count, true, target_node, b, to_var, rel_var,
3285 new_bindings, new_count, new_cap, match_count);
3286 cbm_store_free_edges(edges, edge_count);
3287 }
3288 }
3289}
3290
3291static void expand_pattern_rels(cbm_store_t *store, cbm_pattern_t *pat, binding_t **bindings,
3292 int *bind_count, int *bind_cap, const char **var_name,

Callers 1

expand_pattern_relsFunction · 0.85

Tested by

no test coverage detected