Skip to content

Commit e212cd4

Browse files
AviAvniswilly22
andauthored
bring back execution plan and introduce explain (#153)
* bring back execution plan and introduce explain * fix * keep graph function list minimal Co-authored-by: Roi Lipman <[email protected]>
1 parent 4f61b1e commit e212cd4

File tree

2 files changed

+35
-7
lines changed

2 files changed

+35
-7
lines changed

redisgraph/graph.py

+15
Original file line numberDiff line numberDiff line change
@@ -217,6 +217,21 @@ def query(self, q, params=None, timeout=None, read_only=False):
217217
return self.query(q, params, timeout, read_only)
218218

219219
def execution_plan(self, query, params=None):
220+
"""
221+
Get the execution plan for given query,
222+
GRAPH.EXPLAIN returns an array of operations.
223+
224+
Args:
225+
query: the query that will be executed
226+
params: query parameters
227+
"""
228+
if params is not None:
229+
query = self._build_params_header(params) + query
230+
231+
plan = self.redis_con.execute_command("GRAPH.EXPLAIN", self.name, query)
232+
return "\n".join(plan)
233+
234+
def explain(self, query, params=None):
220235
"""
221236
Get the execution plan for given query,
222237
GRAPH.EXPLAIN returns ExecutionPlan object.

tests/functional/test_all.py

+20-7
Original file line numberDiff line numberDiff line change
@@ -245,6 +245,19 @@ def test_cached_execution(self):
245245
redis_graph.delete()
246246

247247
def test_execution_plan(self):
248+
redis_graph = Graph('execution_plan', self.r)
249+
create_query = """CREATE (:Rider {name:'Valentino Rossi'})-[:rides]->(:Team {name:'Yamaha'}),
250+
(:Rider {name:'Dani Pedrosa'})-[:rides]->(:Team {name:'Honda'}),
251+
(:Rider {name:'Andrea Dovizioso'})-[:rides]->(:Team {name:'Ducati'})"""
252+
redis_graph.query(create_query)
253+
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)"
256+
self.assertEqual(result, expected)
257+
258+
redis_graph.delete()
259+
260+
def test_explain(self):
248261
redis_graph = Graph('execution_plan', self.r)
249262
# graph creation / population
250263
create_query = """CREATE
@@ -253,13 +266,13 @@ def test_execution_plan(self):
253266
(:Rider {name:'Andrea Dovizioso'})-[:rides]->(:Team {name:'Ducati'})"""
254267
redis_graph.query(create_query)
255268

256-
result = redis_graph.execution_plan("""MATCH (r:Rider)-[:rides]->(t:Team)
257-
WHERE t.name = $name
258-
RETURN r.name, t.name
259-
UNION
260-
MATCH (r:Rider)-[:rides]->(t:Team)
261-
WHERE t.name = $name
262-
RETURN r.name, t.name""", {'name': 'Yamaha'})
269+
result = redis_graph.explain("""MATCH (r:Rider)-[:rides]->(t:Team)
270+
WHERE t.name = $name
271+
RETURN r.name, t.name
272+
UNION
273+
MATCH (r:Rider)-[:rides]->(t:Team)
274+
WHERE t.name = $name
275+
RETURN r.name, t.name""", {'name': 'Yamaha'})
263276
expected = '''\
264277
Results
265278
Distinct

0 commit comments

Comments
 (0)