summaryrefslogtreecommitdiff
path: root/tests/test_graph.py
diff options
context:
space:
mode:
authorChayim <chayim@users.noreply.github.com>2022-02-16 10:26:31 +0200
committerGitHub <noreply@github.com>2022-02-16 10:26:31 +0200
commit0ed06603695ba9533d1086dcd7d60cd5eb5e17d0 (patch)
tree530e96469a396c221e28ac6a8b369984d01bd66c /tests/test_graph.py
parent6c00e091e93d07834fcdd811b2a8473848310db0 (diff)
downloadredis-py-4.1.tar.gz
4.1.4 release cherry-picks (#1994)v4.1.44.1
Diffstat (limited to 'tests/test_graph.py')
-rw-r--r--tests/test_graph.py127
1 files changed, 112 insertions, 15 deletions
diff --git a/tests/test_graph.py b/tests/test_graph.py
index c6dc9a4..c885aa4 100644
--- a/tests/test_graph.py
+++ b/tests/test_graph.py
@@ -1,6 +1,7 @@
import pytest
from redis.commands.graph import Edge, Node, Path
+from redis.commands.graph.execution_plan import Operation
from redis.exceptions import ResponseError
@@ -260,21 +261,6 @@ def test_cached_execution(client):
@pytest.mark.redismod
-def test_explain(client):
- create_query = """CREATE (:Rider {name:'Valentino Rossi'})-[:rides]->(:Team {name:'Yamaha'}),
- (:Rider {name:'Dani Pedrosa'})-[:rides]->(:Team {name:'Honda'}),
- (:Rider {name:'Andrea Dovizioso'})-[:rides]->(:Team {name:'Ducati'})"""
- client.graph().query(create_query)
-
- result = client.graph().explain(
- "MATCH (r:Rider)-[:rides]->(t:Team) WHERE t.name = $name RETURN r.name, t.name, $params", # noqa
- {"name": "Yehuda"},
- )
- expected = "Results\n Project\n Conditional Traverse | (t:Team)->(r:Rider)\n Filter\n Node By Label Scan | (t:Team)" # noqa
- assert result == expected
-
-
-@pytest.mark.redismod
def test_slowlog(client):
create_query = """CREATE (:Rider {name:'Valentino Rossi'})-[:rides]->(:Team {name:'Yamaha'}),
(:Rider {name:'Dani Pedrosa'})-[:rides]->(:Team {name:'Honda'}),
@@ -475,3 +461,114 @@ def test_cache_sync(client):
assert A._properties[1] == "x"
assert A._relationshipTypes[0] == "S"
assert A._relationshipTypes[1] == "R"
+
+
+@pytest.mark.redismod
+def test_execution_plan(client):
+ redis_graph = client.graph("execution_plan")
+ create_query = """CREATE (:Rider {name:'Valentino Rossi'})-[:rides]->(:Team {name:'Yamaha'}),
+ (:Rider {name:'Dani Pedrosa'})-[:rides]->(:Team {name:'Honda'}),
+ (:Rider {name:'Andrea Dovizioso'})-[:rides]->(:Team {name:'Ducati'})"""
+ redis_graph.query(create_query)
+
+ result = redis_graph.execution_plan(
+ "MATCH (r:Rider)-[:rides]->(t:Team) WHERE t.name = $name RETURN r.name, t.name, $params", # noqa
+ {"name": "Yehuda"},
+ )
+ expected = "Results\n Project\n Conditional Traverse | (t:Team)->(r:Rider)\n Filter\n Node By Label Scan | (t:Team)" # noqa
+ assert result == expected
+
+ redis_graph.delete()
+
+
+@pytest.mark.redismod
+def test_explain(client):
+ redis_graph = client.graph("execution_plan")
+ # graph creation / population
+ create_query = """CREATE
+(:Rider {name:'Valentino Rossi'})-[:rides]->(:Team {name:'Yamaha'}),
+(:Rider {name:'Dani Pedrosa'})-[:rides]->(:Team {name:'Honda'}),
+(:Rider {name:'Andrea Dovizioso'})-[:rides]->(:Team {name:'Ducati'})"""
+ redis_graph.query(create_query)
+
+ result = redis_graph.explain(
+ """MATCH (r:Rider)-[:rides]->(t:Team)
+WHERE t.name = $name
+RETURN r.name, t.name
+UNION
+MATCH (r:Rider)-[:rides]->(t:Team)
+WHERE t.name = $name
+RETURN r.name, t.name""",
+ {"name": "Yamaha"},
+ )
+ expected = """\
+Results
+Distinct
+ Join
+ Project
+ Conditional Traverse | (t:Team)->(r:Rider)
+ Filter
+ Node By Label Scan | (t:Team)
+ Project
+ Conditional Traverse | (t:Team)->(r:Rider)
+ Filter
+ Node By Label Scan | (t:Team)"""
+ assert str(result).replace(" ", "").replace("\n", "") == expected.replace(
+ " ", ""
+ ).replace("\n", "")
+
+ expected = Operation("Results").append_child(
+ Operation("Distinct").append_child(
+ Operation("Join")
+ .append_child(
+ Operation("Project").append_child(
+ Operation(
+ "Conditional Traverse", "(t:Team)->(r:Rider)"
+ ).append_child(
+ Operation("Filter").append_child(
+ Operation("Node By Label Scan", "(t:Team)")
+ )
+ )
+ )
+ )
+ .append_child(
+ Operation("Project").append_child(
+ Operation(
+ "Conditional Traverse", "(t:Team)->(r:Rider)"
+ ).append_child(
+ Operation("Filter").append_child(
+ Operation("Node By Label Scan", "(t:Team)")
+ )
+ )
+ )
+ )
+ )
+ )
+
+ assert result.structured_plan == expected
+
+ result = redis_graph.explain(
+ """MATCH (r:Rider), (t:Team)
+ RETURN r.name, t.name"""
+ )
+ expected = """\
+Results
+Project
+ Cartesian Product
+ Node By Label Scan | (r:Rider)
+ Node By Label Scan | (t:Team)"""
+ assert str(result).replace(" ", "").replace("\n", "") == expected.replace(
+ " ", ""
+ ).replace("\n", "")
+
+ expected = Operation("Results").append_child(
+ Operation("Project").append_child(
+ Operation("Cartesian Product")
+ .append_child(Operation("Node By Label Scan"))
+ .append_child(Operation("Node By Label Scan"))
+ )
+ )
+
+ assert result.structured_plan == expected
+
+ redis_graph.delete()