Skip to content

Commit

Permalink
finishe range litearl and ites test
Browse files Browse the repository at this point in the history
  • Loading branch information
AEsir777 committed Sep 13, 2023
1 parent c578381 commit 1f7012b
Show file tree
Hide file tree
Showing 7 changed files with 3,183 additions and 2,876 deletions.
9 changes: 8 additions & 1 deletion src/antlr4/Cypher.g4
Original file line number Diff line number Diff line change
Expand Up @@ -400,7 +400,14 @@ oC_NodeLabel
: ':' SP? oC_LabelName ;

oC_RangeLiteral
: '*' SP? ( SHORTEST | ALL SP SHORTEST )? SP? oC_IntegerLiteral SP? '..' SP? oC_IntegerLiteral (SP? '(' SP? oC_Variable SP? ',' SP? '_' SP? '|' SP? oC_Where SP? ')')? ;
: '*' SP? ( SHORTEST | ALL SP SHORTEST )? SP? (oC_LowerBound? SP? '..' SP? oC_UpperBound? | oC_IntegerLiteral)? (SP? '(' SP? oC_Variable SP? ',' SP? '_' SP? '|' SP? oC_Where SP? ')')? ;

oC_LowerBound
: DecimalInteger ;

oC_UpperBound
: DecimalInteger ;


SHORTEST : ( 'S' | 's' ) ( 'H' | 'h' ) ( 'O' | 'o' ) ( 'R' | 'r' ) ( 'T' | 't' ) ( 'E' | 'e' ) ( 'S' | 's' ) ( 'T' | 't' ) ;

Expand Down
16 changes: 14 additions & 2 deletions src/parser/transform/transform_graph_pattern.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -110,8 +110,20 @@ std::unique_ptr<RelPattern> Transformer::transformRelationshipPattern(
relType = QueryRelType::VARIABLE_LENGTH;
}
auto range = relDetail->oC_RangeLiteral();
auto lowerBound = range->oC_IntegerLiteral()[0]->getText();
auto upperBound = range->oC_IntegerLiteral()[1]->getText();
auto lowerBound = std::to_string(1);
auto upperBound = std::to_string(UINT32_MAX);

if (range->oC_IntegerLiteral()) {
lowerBound = range->oC_IntegerLiteral()->getText();
upperBound = lowerBound;
}
if (range->oC_LowerBound()) {
lowerBound = range->oC_LowerBound()->getText();
}
if (range->oC_UpperBound()) {
upperBound = range->oC_UpperBound()->getText();
}

auto recursiveRelName = std::string();
std::unique_ptr<ParsedExpression> whereExpression = nullptr;
if (range->oC_Where()) {
Expand Down
8 changes: 3 additions & 5 deletions test/test_files/tck/match/match3.test
Original file line number Diff line number Diff line change
Expand Up @@ -304,13 +304,11 @@ a
---- ok
-STATEMENT CREATE NODE TABLE C(ID SERIAL,PRIMARY KEY(ID));
---- ok
-STATEMENT CREATE REL TABLE T1(FROM A TO B);
---- ok
-STATEMENT CREATE REL TABLE T2(FROM A TO C);
-STATEMENT CREATE REL TABLE GROUP T(FROM A TO B, FROM A TO C);
---- ok
-STATEMENT CREATE (a:A), (b:B), (c:C)
CREATE (a)-[:T1]->(b),
(a)-[:T2]->(c);
CREATE (a)-[:T]->(b),
(a)-[:T]->(c);
---- ok
-STATEMENT MATCH (a)-->(b)
MATCH (c)-->(d)
Expand Down
79 changes: 40 additions & 39 deletions test/test_files/tck/match/match4.test
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,6 @@

# Simple variable length pattern
-CASE Scenario2
-SKIP
-STATEMENT CREATE NODE TABLE A(ID SERIAL, name STRING, PRIMARY KEY(ID));
---- ok
-STATEMENT CREATE REL TABLE CONTAIN(FROM A TO A);
Expand Down Expand Up @@ -66,20 +65,20 @@
-STATEMENT CREATE REL TABLE T(FROM A TO A);
---- ok
# indexing on varlist causes segmentaion fault
#-STATEMENT CREATE (a {var: 'start'}), (b {var: 'end'})
# WITH *
# UNWIND ['0', '1', '2'] AS i
# CREATE (n {var: i})
# WITH a, b, collect(n) AS nodeList
# UNWIND [0, 1] AS i
# WITH nodeList[i] AS n1, nodeList[i+1] AS n2
# CREATE (n1)-[:T]->(n2);
#---- ok
#-STATEMENT WITH collect(n) AS nodeList
# UNWIND [0, 1] AS i
# WITH nodeList[i] AS n1, nodeList[i+1] AS n2
# CREATE (n1)-[:T]->(n2);
#---- ok
-STATEMENT CREATE (a {var: 'start'}), (b {var: 'end'})
WITH *
UNWIND ['0', '1', '2'] AS i
CREATE (n {var: i})
WITH a, b, collect(n) AS nodeList
UNWIND [0, 1] AS i
WITH nodeList[i] AS n1, nodeList[i+1] AS n2
CREATE (n1)-[:T]->(n2);
---- ok
-STATEMENT WITH collect(n) AS nodeList
UNWIND [0, 1] AS i
WITH nodeList[i] AS n1, nodeList[i+1] AS n2
CREATE (n1)-[:T]->(n2);
---- ok
-STATEMENT CREATE (a {var: 'start'}), (b {var: 'end'})
WITH *
UNWIND range(1, 20) AS i
Expand All @@ -96,7 +95,6 @@

# Matching variable length pattern with property predicate
-CASE Scenario5
-SKIP
-STATEMENT CREATE NODE TABLE Artist(ID SERIAL, PRIMARY KEY(ID));
---- ok
-STATEMENT CREATE REL TABLE WORKED_WITH(FROM Artist TO Artist, year INT64);
Expand All @@ -116,7 +114,6 @@

# Matching variable length patterns from a bound node
-CASE Scenario6
-SKIP
-STATEMENT CREATE NODE TABLE A(ID SERIAL, PRIMARY KEY(ID));
---- ok
-STATEMENT CREATE REL TABLE X(FROM A To A);
Expand Down Expand Up @@ -163,13 +160,11 @@
---- ok
-STATEMENT CREATE NODE TABLE C(ID SERIAL, PRIMARY KEY(ID));
---- ok
-STATEMENT CREATE NODE TABLE A(ID SERIAL, PRIMARY KEY(ID));
---- ok
-STATEMENT CREATE REL TABLE Y2(FROM B TO C);
-STATEMENT CREATE REL TABLE GROUP Y(FROM A TO B, FROM B TO C);
---- ok
-STATEMENT CREATE (a:A), (b:B), (c:C)
CREATE (a)-[:Y1]->(b),
(b)-[:Y2]->(c)
CREATE (a)-[:Y]->(b),
(b)-[:Y]->(c)
---- ok
-STATEMENT MATCH ()-[r1]->()-[r2]->()
WITH [r1, r2] AS rs
Expand All @@ -184,23 +179,29 @@
-CASE Scenario9&10
-STATEMENT CREATE NODE TABLE A(ID SERIAL, name STRING, PRIMARY KEY(ID));
---- ok
-STATEMENT CREATE REL TABLE LIKES(FROM A TO A);
---- ok
-STATEMENT CREATE (n0 {name: 'n0'}),
(n00 {name: 'n00'}),
(n01 {name: 'n01'}),
(n000 {name: 'n000'}),
(n001 {name: 'n001'}),
(n010 {name: 'n010'}),
(n011 {name: 'n011'}),
(n0000 {name: 'n0000'}),
(n0001 {name: 'n0001'}),
(n0010 {name: 'n0010'}),
(n0011 {name: 'n0011'}),
(n0100 {name: 'n0100'}),
(n0101 {name: 'n0101'}),
(n0110 {name: 'n0110'}),
(n0111 {name: 'n0111'})
-STATEMENT CREATE NODE TABLE B(ID SERIAL, name STRING, PRIMARY KEY(ID));
---- ok
-STATEMENT CREATE NODE TABLE C(ID SERIAL, name STRING, PRIMARY KEY(ID));
---- ok
-STATEMENT CREATE NODE TABLE D(ID SERIAL, name STRING, PRIMARY KEY(ID));
---- ok
-STATEMENT CREATE REL TABLE GROUP LIKES(FROM A TO B, FROM B TO C, FROM C TO D);
---- ok
-STATEMENT CREATE (n0:A {name: 'n0'}),
(n00:B {name: 'n00'}),
(n01:B {name: 'n01'}),
(n000:C {name: 'n000'}),
(n001:C {name: 'n001'}),
(n010:C {name: 'n010'}),
(n011:C {name: 'n011'}),
(n0000:D {name: 'n0000'}),
(n0001:D {name: 'n0001'}),
(n0010:D {name: 'n0010'}),
(n0011:D {name: 'n0011'}),
(n0100:D {name: 'n0100'}),
(n0101:D {name: 'n0101'}),
(n0110:D {name: 'n0110'}),
(n0111:D {name: 'n0111'})
CREATE (n0)-[:LIKES]->(n00),
(n0)-[:LIKES]->(n01),
(n00)-[:LIKES]->(n000),
Expand Down
121 changes: 121 additions & 0 deletions test/test_files/tinysnb/range_literal/range_literal.test
Original file line number Diff line number Diff line change
@@ -0,0 +1,121 @@
-GROUP TinySnbReadTest
-DATASET CSV tinysnb

--

-CASE SingleUpperBound
-STATEMENT MATCH(a:person {fName: "Alice"})-[e:knows*..2]->(b:person) RETURN e;
---- 12
{_NODES: [], _RELS: [(0:0)-{_LABEL: knows, _ID: 3:0, date: 2021-06-30, meetTime: 1986-10-21 21:08:31.521, validInterval: 10 years 5 months 13:00:00.000024, comments: [rnme,m8sihsdnf2990nfiwf]}->(0:1)]}
{_NODES: [], _RELS: [(0:0)-{_LABEL: knows, _ID: 3:1, date: 2021-06-30, meetTime: 1946-08-25 19:07:22, validInterval: 20 years 30 days 48:00:00, comments: [njnojppo9u0jkmf,fjiojioh9h9h89hph]}->(0:2)]}
{_NODES: [], _RELS: [(0:0)-{_LABEL: knows, _ID: 3:2, date: 2021-06-30, meetTime: 2012-12-11 20:07:22, validInterval: 10 days, comments: [ioji232,jifhe8w99u43434]}->(0:3)]}
{_NODES: [{_ID: 0:1, _LABEL: person, ID: 2, fName: Bob, gender: 2, isStudent: True, isWorker: False, age: 30, eyeSight: 5.100000, birthdate: 1900-01-01, registerTime: 2008-11-03 15:25:30.000526, lastJobDuration: 10 years 5 months 13:00:00.000024, workedHours: [12,8], usedNames: [Bobby], courseScoresPerTerm: [[8,9],[9,10]], grades: [98,42,93,88], height: 0.990000}], _RELS: [(0:0)-{_LABEL: knows, _ID: 3:0, date: 2021-06-30, meetTime: 1986-10-21 21:08:31.521, validInterval: 10 years 5 months 13:00:00.000024, comments: [rnme,m8sihsdnf2990nfiwf]}->(0:1),(0:1)-{_LABEL: knows, _ID: 3:3, date: 2021-06-30, meetTime: 1946-08-25 19:07:22, validInterval: 10 years 5 months 13:00:00.000024, comments: [2huh9y89fsfw23,23nsihufhw723]}->(0:0)]}
{_NODES: [{_ID: 0:1, _LABEL: person, ID: 2, fName: Bob, gender: 2, isStudent: True, isWorker: False, age: 30, eyeSight: 5.100000, birthdate: 1900-01-01, registerTime: 2008-11-03 15:25:30.000526, lastJobDuration: 10 years 5 months 13:00:00.000024, workedHours: [12,8], usedNames: [Bobby], courseScoresPerTerm: [[8,9],[9,10]], grades: [98,42,93,88], height: 0.990000}], _RELS: [(0:0)-{_LABEL: knows, _ID: 3:0, date: 2021-06-30, meetTime: 1986-10-21 21:08:31.521, validInterval: 10 years 5 months 13:00:00.000024, comments: [rnme,m8sihsdnf2990nfiwf]}->(0:1),(0:1)-{_LABEL: knows, _ID: 3:4, date: 1950-05-14, meetTime: 1946-08-25 19:07:22, validInterval: 00:23:00, comments: [fwehu9h9832wewew,23u9h989sdfsss]}->(0:2)]}
{_NODES: [{_ID: 0:1, _LABEL: person, ID: 2, fName: Bob, gender: 2, isStudent: True, isWorker: False, age: 30, eyeSight: 5.100000, birthdate: 1900-01-01, registerTime: 2008-11-03 15:25:30.000526, lastJobDuration: 10 years 5 months 13:00:00.000024, workedHours: [12,8], usedNames: [Bobby], courseScoresPerTerm: [[8,9],[9,10]], grades: [98,42,93,88], height: 0.990000}], _RELS: [(0:0)-{_LABEL: knows, _ID: 3:0, date: 2021-06-30, meetTime: 1986-10-21 21:08:31.521, validInterval: 10 years 5 months 13:00:00.000024, comments: [rnme,m8sihsdnf2990nfiwf]}->(0:1),(0:1)-{_LABEL: knows, _ID: 3:5, date: 1950-05-14, meetTime: 2012-12-11 20:07:22, validInterval: 20 years 30 days 48:00:00, comments: [fwh9y81232uisuiehuf,ewnuihxy8dyf232]}->(0:3)]}
{_NODES: [{_ID: 0:2, _LABEL: person, ID: 3, fName: Carol, gender: 1, isStudent: False, isWorker: True, age: 45, eyeSight: 5.000000, birthdate: 1940-06-22, registerTime: 1911-08-20 02:32:21, lastJobDuration: 48:24:11, workedHours: [4,5], usedNames: [Carmen,Fred], courseScoresPerTerm: [[8,10]], grades: [91,75,21,95], height: 1.000000}], _RELS: [(0:0)-{_LABEL: knows, _ID: 3:1, date: 2021-06-30, meetTime: 1946-08-25 19:07:22, validInterval: 20 years 30 days 48:00:00, comments: [njnojppo9u0jkmf,fjiojioh9h9h89hph]}->(0:2),(0:2)-{_LABEL: knows, _ID: 3:6, date: 2021-06-30, meetTime: 2002-07-31 11:42:53.12342, validInterval: 40 days 30:00:00, comments: [fnioh8323aeweae34d,osd89e2ejshuih12]}->(0:0)]}
{_NODES: [{_ID: 0:2, _LABEL: person, ID: 3, fName: Carol, gender: 1, isStudent: False, isWorker: True, age: 45, eyeSight: 5.000000, birthdate: 1940-06-22, registerTime: 1911-08-20 02:32:21, lastJobDuration: 48:24:11, workedHours: [4,5], usedNames: [Carmen,Fred], courseScoresPerTerm: [[8,10]], grades: [91,75,21,95], height: 1.000000}], _RELS: [(0:0)-{_LABEL: knows, _ID: 3:1, date: 2021-06-30, meetTime: 1946-08-25 19:07:22, validInterval: 20 years 30 days 48:00:00, comments: [njnojppo9u0jkmf,fjiojioh9h9h89hph]}->(0:2),(0:2)-{_LABEL: knows, _ID: 3:7, date: 1950-05-14, meetTime: 2007-02-12 12:11:42.123, validInterval: 00:28:00.03, comments: [fwh983-sdjisdfji,ioh89y32r2huir]}->(0:1)]}
{_NODES: [{_ID: 0:2, _LABEL: person, ID: 3, fName: Carol, gender: 1, isStudent: False, isWorker: True, age: 45, eyeSight: 5.000000, birthdate: 1940-06-22, registerTime: 1911-08-20 02:32:21, lastJobDuration: 48:24:11, workedHours: [4,5], usedNames: [Carmen,Fred], courseScoresPerTerm: [[8,10]], grades: [91,75,21,95], height: 1.000000}], _RELS: [(0:0)-{_LABEL: knows, _ID: 3:1, date: 2021-06-30, meetTime: 1946-08-25 19:07:22, validInterval: 20 years 30 days 48:00:00, comments: [njnojppo9u0jkmf,fjiojioh9h9h89hph]}->(0:2),(0:2)-{_LABEL: knows, _ID: 3:8, date: 2000-01-01, meetTime: 1998-10-02 13:09:22.423, validInterval: 00:00:00.3, comments: [psh989823oaaioe,nuiuah1nosndfisf]}->(0:3)]}
{_NODES: [{_ID: 0:3, _LABEL: person, ID: 5, fName: Dan, gender: 2, isStudent: False, isWorker: True, age: 20, eyeSight: 4.800000, birthdate: 1950-07-23, registerTime: 2031-11-30 12:25:30, lastJobDuration: 10 years 5 months 13:00:00.000024, workedHours: [1,9], usedNames: [Wolfeschlegelstein,Daniel], courseScoresPerTerm: [[7,4],[8,8],[9]], grades: [76,88,99,89], height: 1.300000}], _RELS: [(0:0)-{_LABEL: knows, _ID: 3:2, date: 2021-06-30, meetTime: 2012-12-11 20:07:22, validInterval: 10 days, comments: [ioji232,jifhe8w99u43434]}->(0:3),(0:3)-{_LABEL: knows, _ID: 3:10, date: 1950-05-14, meetTime: 1982-11-11 13:12:05.123, validInterval: 00:23:00, comments: [fewh9182912e3,h9y8y89soidfsf,nuhudf78w78efw,hioshe0f9023sdsd]}->(0:1)]}
{_NODES: [{_ID: 0:3, _LABEL: person, ID: 5, fName: Dan, gender: 2, isStudent: False, isWorker: True, age: 20, eyeSight: 4.800000, birthdate: 1950-07-23, registerTime: 2031-11-30 12:25:30, lastJobDuration: 10 years 5 months 13:00:00.000024, workedHours: [1,9], usedNames: [Wolfeschlegelstein,Daniel], courseScoresPerTerm: [[7,4],[8,8],[9]], grades: [76,88,99,89], height: 1.300000}], _RELS: [(0:0)-{_LABEL: knows, _ID: 3:2, date: 2021-06-30, meetTime: 2012-12-11 20:07:22, validInterval: 10 days, comments: [ioji232,jifhe8w99u43434]}->(0:3),(0:3)-{_LABEL: knows, _ID: 3:11, date: 2000-01-01, meetTime: 1999-04-21 15:12:11.42, validInterval: 48:00:00.052, comments: [23h9sdslnfowhu2932,shuhf98922323sf]}->(0:2)]}
{_NODES: [{_ID: 0:3, _LABEL: person, ID: 5, fName: Dan, gender: 2, isStudent: False, isWorker: True, age: 20, eyeSight: 4.800000, birthdate: 1950-07-23, registerTime: 2031-11-30 12:25:30, lastJobDuration: 10 years 5 months 13:00:00.000024, workedHours: [1,9], usedNames: [Wolfeschlegelstein,Daniel], courseScoresPerTerm: [[7,4],[8,8],[9]], grades: [76,88,99,89], height: 1.300000}], _RELS: [(0:0)-{_LABEL: knows, _ID: 3:2, date: 2021-06-30, meetTime: 2012-12-11 20:07:22, validInterval: 10 days, comments: [ioji232,jifhe8w99u43434]}->(0:3),(0:3)-{_LABEL: knows, _ID: 3:9, date: 2021-06-30, meetTime: 1936-11-02 11:02:01, validInterval: 00:00:00.00048, comments: [fwewe]}->(0:0)]}
-STATEMENT MATCH(a:person {fName: "Alice"})-[e:knows*..1]->(b:person) RETURN b.fName;
---- 3
Bob
Carol
Dan
-STATEMENT MATCH(a:person {fName: "Greg"})-[e:knows*..1]->(b:person) RETURN b.fName;
---- 0
# Different results from standard OpenCypher: 0 should be allowed

-CASE SingleLowerBound
-STATEMENT MATCH(a:person {fName: "Alice"})-[e:meets*2..]->(b:person) RETURN a.fName, b.fName;
---- 1
Alice|Dan
-STATEMENT MATCH(a:person {fName: "Alice"})-[e:meets*3..]->(b:person) RETURN a.fName, b.fName;
---- 0
-STATEMENT MATCH(a:person {fName: "Alice"})-[e:meets*1..]->(b:person) RETURN a.fName, b.fName;
---- 2
Alice|Bob
Alice|Dan

-CASE SingleNodeBound
-STATEMENT MATCH(a:person {fName: "Alice"})-[e:meets*2]->(b:person) RETURN b.fName;
---- 1
Dan
-STATEMENT MATCH(a:person {fName: "Alice"})-[e:meets*1]->(b:person) RETURN b.fName;
---- 1
Bob
-STATEMENT MATCH(a:person {fName: "Elizabeth"})-[e:meets*1]-(b:person) RETURN b.fName;
---- 2
Carol
Carol
-STATEMENT MATCH(a:person {fName: "Alice"})-[e:meets*3]->(b:person) RETURN b.fName;
---- 0

-CASE BothBound
-STATEMENT MATCH(a:person {fName: "Alice"})-[e:meets*1..1]->(b:person) RETURN b.fName;
---- 1
Bob
-STATEMENT MATCH (c:person) WHERE c.fName="Dan" CREATE(c)-[:meets]->(b:person {ID: 11, fName: "Mike"});
---- ok
-STATEMENT MATCH(a:person {fName: "Alice"})-[e:meets*1..3]->(b:person) RETURN b.fName;
---- 3
Bob
Dan
Mike
-STATEMENT MATCH(a:person {fName: "Alice"})-[e:meets*2..3]->(b:person) RETURN b.fName;
---- 2
Dan
Mike
-STATEMENT MATCH(a:person {fName: "Alice"})-[e:meets*3..3]->(b:person) RETURN b.fName;
---- 1
Mike
-STATEMENT MATCH(a:person {fName: "Alice"})-[e:meets*3..4]->(b:person) RETURN b.fName;
---- 1
Mike

-CASE SingleAsterisk
-STATEMENT MATCH (c:person) WHERE c.fName="Dan" CREATE(c)-[:meets]->(b:person {ID: 11, fName: "Mike"});
---- ok
-STATEMENT MATCH(a:person {fName: "Alice"})-[e:meets*]->(b:person) RETURN b.fName;
---- 3
Bob
Dan
Mike
-STATEMENT MATCH(a:person {fName: "Bob"})<-[e:meets*]-(b:person) RETURN b.fName;
---- 2
Alice
Hubert Blaine Wolfeschlegelsteinhausenbergerdorff

-CASE NoBound
-STATEMENT MATCH (c:person) WHERE c.fName="Dan" CREATE(c)-[:meets]->(b:person {ID: 11, fName: "Mike"});
---- ok
-STATEMENT MATCH(a:person {fName: "Alice"})-[e:meets*..]->(b:person) RETURN b.fName;
---- 3
Bob
Dan
Mike
-STATEMENT MATCH(a:person {fName: "Bob"})<-[e:meets*..]-(b:person) RETURN b.fName;
---- 2
Alice
Hubert Blaine Wolfeschlegelsteinhausenbergerdorff

-CASE CreateRangeLiteralTest
-STATEMENT MATCH (c:person) WHERE c.fName="Dan" CREATE(c)-[:meets*]->(b:person {ID: 11, fName: "Mike"});
---- error
QueryPlanner::getProperties
-STATEMENT MATCH (c:person) WHERE c.fName="Dan" CREATE(c)<-[:meets*..]-(b:person {ID: 11, fName: "Mike"});
---- error
QueryPlanner::getProperties
-STATEMENT MATCH (c:person) WHERE c.fName="Dan" CREATE(c)-[:meets*2]-(b:person {ID: 11, fName: "Mike"});
---- error
QueryPlanner::getProperties
-STATEMENT MATCH (c:person) WHERE c.fName="Dan" CREATE(c)-[:meets*2..4]->(b:person {ID: 11, fName: "Mike"});
---- error
QueryPlanner::getProperties
-STATEMENT MATCH (c:person) WHERE c.fName="Dan" CREATE(c)<-[:meets*3..]-(b:person {ID: 11, fName: "Mike"});
---- error
QueryPlanner::getProperties
-STATEMENT MATCH (c:person) WHERE c.fName="Dan" CREATE(c)-[:meets*..3]->(b:person {ID: 11, fName: "Mike"});
---- error
QueryPlanner::getProperties
Loading

0 comments on commit 1f7012b

Please sign in to comment.