| 70 | } |
| 71 | |
| 72 | OpBase *NewCondTraverseOp |
| 73 | ( |
| 74 | const ExecutionPlan *plan, |
| 75 | Graph *g, |
| 76 | AlgebraicExpression *ae |
| 77 | ) { |
| 78 | OpCondTraverse *op = rm_calloc(sizeof(OpCondTraverse), 1); |
| 79 | |
| 80 | op->ae = ae; |
| 81 | op->graph = g; |
| 82 | op->record_cap = BATCH_SIZE; |
| 83 | |
| 84 | // Set our Op operations |
| 85 | OpBase_Init((OpBase *)op, OPType_CONDITIONAL_TRAVERSE, |
| 86 | "Conditional Traverse", CondTraverseInit, CondTraverseConsume, |
| 87 | CondTraverseReset, CondTraverseToString, CondTraverseClone, |
| 88 | CondTraverseFree, false, plan); |
| 89 | |
| 90 | bool aware = OpBase_Aware((OpBase *)op, AlgebraicExpression_Src(ae), |
| 91 | &op->srcNodeIdx); |
| 92 | UNUSED(aware); |
| 93 | ASSERT(aware == true); |
| 94 | |
| 95 | const char *dest = AlgebraicExpression_Dest(ae); |
| 96 | op->destNodeIdx = OpBase_Modifies((OpBase *)op, dest); |
| 97 | |
| 98 | const char *edge = AlgebraicExpression_Edge(ae); |
| 99 | if(edge) { |
| 100 | // this operation will populate an edge in the Record |
| 101 | // prepare all necessary information for collecting matching edges |
| 102 | uint edge_idx = OpBase_Modifies((OpBase *)op, edge); |
| 103 | QGEdge *e = QueryGraph_GetEdgeByAlias(plan->query_graph, edge); |
| 104 | op->edge_ctx = EdgeTraverseCtx_New(ae, e, edge_idx); |
| 105 | } |
| 106 | |
| 107 | return (OpBase *)op; |
| 108 | } |
| 109 | |
| 110 | static OpResult CondTraverseInit(OpBase *opBase) { |
| 111 | OpCondTraverse *op = (OpCondTraverse *)opBase; |
no test coverage detected