Expand fixed-length (1-hop) relationship edges */
| 3233 | |
| 3234 | /* Expand fixed-length (1-hop) relationship edges */ |
| 3235 | static 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 | |
| 3291 | static 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, |
no test coverage detected