Skip to content

Commit fa56af0

Browse files
committed
address review
1 parent fa6c271 commit fa56af0

File tree

2 files changed

+40
-7
lines changed

2 files changed

+40
-7
lines changed

redisgraph/execution_plan.py

Lines changed: 15 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,9 @@ def __init__(self, name, args=None):
55
self.children = []
66

77
def append_child(self, child):
8+
if not isinstance(child, Operation) or self is child:
9+
raise Exception("child must be Operation")
10+
811
self.children.append(child)
912
return self
1013

@@ -21,9 +24,20 @@ def __eq__(self, o: object) -> bool:
2124

2225
return True
2326

27+
def __str__(self) -> str:
28+
args_str = "" if self.args is None else f" | {self.args}"
29+
if len(self.children) == 0:
30+
return f"{self.name}{args_str}"
31+
else:
32+
children = "\n".join([" " + line for op in self.children for line in str(op).splitlines()])
33+
return f"{self.name}{args_str}\n{children}"
34+
2435

2536
class ExecutionPlan:
2637
def __init__(self, plan):
38+
if not isinstance(plan, list):
39+
raise Exception("plan must be array")
40+
2741
self.plan = plan
2842
self.structured_plan = self._operation_tree()
2943

@@ -46,7 +60,7 @@ def _operation_tree(self):
4660
elif op_level == level + 1:
4761
args = op.split("|")
4862
child = Operation(args[0].strip(), None if len(args) == 1 else args[1].strip())
49-
current.children.append(child)
63+
current.append_child(child)
5064
stack.append(current)
5165
current = child
5266
level += 1

tests/functional/test_all.py

Lines changed: 25 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -251,15 +251,34 @@ def test_execution_plan(self):
251251
(:Rider {name:'Andrea Dovizioso'})-[:rides]->(:Team {name:'Ducati'})"""
252252
redis_graph.query(create_query)
253253

254-
result = redis_graph.execution_plan("MATCH (r:Rider)-[:rides]->(t:Team) WHERE t.name = $name RETURN r.name, t.name, $params", {'name': 'Yehuda'})
255-
expected = "Results\n Project\n Conditional Traverse | (t:Team)->(r:Rider)\n Filter\n Node By Label Scan | (t:Team)"
254+
result = redis_graph.execution_plan("MATCH (r:Rider)-[:rides]->(t:Team) WHERE t.name = $name RETURN r.name, t.name, $params UNION MATCH (r:Rider)-[:rides]->(t:Team) WHERE t.name = $name RETURN r.name, t.name, $params", {'name': 'Yehuda'})
255+
expected = '''\
256+
Results
257+
Distinct
258+
Join
259+
Project
260+
Conditional Traverse | (t:Team)->(r:Rider)
261+
Filter
262+
Node By Label Scan | (t:Team)
263+
Project
264+
Conditional Traverse | (t:Team)->(r:Rider)
265+
Filter
266+
Node By Label Scan | (t:Team)'''
267+
self.assertEquals(str(result.structured_plan), expected)
256268
self.assertEqual(str(result), expected)
257269

258270
expected = Operation('Results') \
259-
.append_child(Operation('Project')
260-
.append_child(Operation('Conditional Traverse', "(t:Team)->(r:Rider)")
261-
.append_child(Operation("Filter")
262-
.append_child(Operation('Node By Label Scan', "(t:Team)")))))
271+
.append_child(Operation('Distinct')
272+
.append_child(Operation('Join')
273+
.append_child(Operation('Project')
274+
.append_child(Operation('Conditional Traverse', "(t:Team)->(r:Rider)")
275+
.append_child(Operation("Filter")
276+
.append_child(Operation('Node By Label Scan', "(t:Team)")))))
277+
.append_child(Operation('Project')
278+
.append_child(Operation('Conditional Traverse', "(t:Team)->(r:Rider)")
279+
.append_child(Operation("Filter")
280+
.append_child(Operation('Node By Label Scan', "(t:Team)")))))
281+
))
263282

264283
self.assertEqual(result.structured_plan, expected)
265284

0 commit comments

Comments
 (0)