Skip to content

Commit d195f65

Browse files
Support subqueries (#59)
Support `CALL {}` subquery syntax. Also remove support for `USING PERIODIC COMMIT`, which doesn't exist anymore (it is replaced by `CALL {} IN TRANSACTIONS`)
1 parent 8fe2409 commit d195f65

File tree

10 files changed

+402
-152
lines changed

10 files changed

+402
-152
lines changed

language/cypher/src/main/java/com/albertoventurini/graphdbplugin/language/cypher/lexer/Cypher.bnf

Lines changed: 8 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -85,7 +85,8 @@ private statement_recover::= !(';'
8585
| K_EXPLAIN
8686
| K_CALL
8787
| K_OPTIONAL
88-
| K_DETACH)
88+
| K_DETACH
89+
| "}")
8990

9091
/*************************
9192
* Statement
@@ -177,7 +178,7 @@ DropIndex ::= K_DROP K_INDEX IndexName K_IF_EXISTS?
177178
/*************************
178179
* Query
179180
*/
180-
Query ::= StandaloneCall | BulkImportQuery | RegularQuery
181+
Query ::= StandaloneCall | RegularQuery
181182

182183
//-- RegularQuery
183184
RegularQuery ::= SingleQuery Union*
@@ -201,13 +202,9 @@ ReadingClause ::= LoadCSV
201202
| Start
202203
| Match
203204
| Unwind
205+
| CallSubQuery
204206
| InQueryCall
205207

206-
//-- BulkImportQuery
207-
BulkImportQuery ::= PeriodicCommitHint LoadCSVQuery
208-
PeriodicCommitHint ::= K_USING K_PERIODIC K_COMMIT IntegerLiteral?
209-
LoadCSVQuery ::= LoadCSV SingleQuery?
210-
211208
/*************************
212209
* Clauses
213210
*/
@@ -260,7 +257,10 @@ SortItem ::= Expression (K_DESCENDING | K_DESC | K_ASCENDING | K_ASC)?
260257
Skip ::= K_SKIP Expression
261258
Limit ::= K_LIMIT Expression
262259

263-
//-- Call
260+
//-- Call subquery
261+
CallSubQuery ::= K_CALL "{" Query "}" (K_IN_TRANSACTIONS (K_OF IntegerLiteral K_ROWS)?)? {pin=2}
262+
263+
//-- Call procedure
264264
Call ::= K_CALL ProcedureInvocation ProcedureResults?
265265
InQueryCall ::= Call Where?
266266
StandaloneCall ::= Call (Where? Return)?
@@ -571,7 +571,6 @@ ReservedWord ::= K_MATCH
571571
| K_REL
572572
| K_REDUCE
573573
| K_PROFILE
574-
| K_PERIODIC
575574
| K_ORDER
576575
| K_OR
577576
| K_OPTIONAL

language/cypher/src/main/java/com/albertoventurini/graphdbplugin/language/cypher/lexer/CypherLexer.flex

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -75,7 +75,6 @@ K_ASCENDING=[Aa][Ss][Cc][Ee][Nn][Dd][Ii][Nn][Gg]
7575
K_ASC=[Aa][Ss][Cc]
7676
K_SKIP=[Ss][Kk][Ii][Pp]
7777
K_LIMIT=[Ll][Ii][Mm][Ii][Tt]
78-
K_PERIODIC=[Pp][Ee][Rr][Ii][Oo][Dd][Ii][Cc]
7978
K_BEGIN=[Bb][Ee][Gg][Ii][Nn]
8079
K_COMMIT=[Cc][Oo][Mm][Mm][Ii][Tt]
8180
K_XOR=[Xx][Oo][Rr]
@@ -113,6 +112,7 @@ K_SCALAR=[Ss][Cc][Aa][Ll][Aa][Rr]
113112
K_OF=[Oo][Ff]
114113
K_ADD=[Aa][Dd][Dd]
115114
K_OPTIONS=[Oo][Pp][Tt][Ii][Oo][Nn][Ss]
115+
K_ROWS=[Rr][Oo][Ww][Ss]
116116

117117
_EACH=[Ee][Aa][Cc][Hh]
118118
_IF=[Ii][Ff]
@@ -122,6 +122,8 @@ _TEXT=[Tt][Ee][Xx][Tt]
122122
_POINT=[Pp][Oo][Ii][Nn][Tt]
123123
_LABELS=[Ll][Aa][Bb][Ee][Ll][Ss]
124124
_TYPE=[Tt][Yy][Pp][Ee]
125+
_IN=[Ii][Nn]
126+
_TRANSACTIONS=[Tt][Rr][Aa][Nn][Ss][Aa][Cc][Tt][Ii][Oo][Nn][Ss]
125127

126128
K_CREATE_INDEX={K_CREATE}{WHITE_SPACE}{K_INDEX}
127129
K_CREATE_RANGE_INDEX={K_CREATE}{WHITE_SPACE}{_RANGE}{WHITE_SPACE}{K_INDEX}
@@ -133,6 +135,7 @@ K_IF_NOT_EXISTS={_IF}{WHITE_SPACE}{K_NOT}{WHITE_SPACE}{K_EXISTS}
133135
K_ON_EACH_LABELS={K_ON}{WHITE_SPACE}{_EACH}{WHITE_SPACE}{_LABELS}
134136
K_ON_EACH_TYPE={K_ON}{WHITE_SPACE}{_EACH}{WHITE_SPACE}{_TYPE}
135137
K_ON_TYPE={K_ON}{WHITE_SPACE}{_TYPE}
138+
K_IN_TRANSACTIONS={_IN}{WHITE_SPACE}{_TRANSACTIONS}
136139

137140
L_IDENTIFIER=[a-zA-Z_][a-zA-Z_$0-9]*
138141
L_IDENTIFIER_TEXT=\`[^`]+\`
@@ -229,7 +232,6 @@ BLOCK_COMMENT = "/*" ( ([^"*"]|[\r\n])* ("*"+ [^"*""/"] )? )* ("*" | "*"+"/")?
229232
{K_ASC} { return K_ASC; }
230233
{K_SKIP} { return K_SKIP; }
231234
{K_LIMIT} { return K_LIMIT; }
232-
{K_PERIODIC} { return K_PERIODIC; }
233235
{K_BEGIN} { return K_BEGIN; }
234236
{K_COMMIT} { return K_COMMIT; }
235237
{K_XOR} { return K_XOR; }
@@ -268,6 +270,7 @@ BLOCK_COMMENT = "/*" ( ([^"*"]|[\r\n])* ("*"+ [^"*""/"] )? )* ("*" | "*"+"/")?
268270
{K_ADD} { return K_ADD; }
269271

270272
{K_OPTIONS} { return K_OPTIONS; }
273+
{K_ROWS} { return K_ROWS; }
271274

272275
{K_CREATE_INDEX} { return K_CREATE_INDEX; }
273276
{K_CREATE_RANGE_INDEX} { return K_CREATE_RANGE_INDEX; }
@@ -279,6 +282,7 @@ BLOCK_COMMENT = "/*" ( ([^"*"]|[\r\n])* ("*"+ [^"*""/"] )? )* ("*" | "*"+"/")?
279282
{K_ON_EACH_LABELS} { return K_ON_EACH_LABELS; }
280283
{K_ON_EACH_TYPE} { return K_ON_EACH_TYPE; }
281284
{K_ON_TYPE} { return K_ON_TYPE; }
285+
{K_IN_TRANSACTIONS} { return K_IN_TRANSACTIONS; }
282286

283287
{L_IDENTIFIER} { return L_IDENTIFIER; }
284288
{L_IDENTIFIER_TEXT} { return L_IDENTIFIER_TEXT; }

testing/integration-neo4j/src/test/java/com/albertoventurini/graphdbplugin/test/integration/neo4j/tests/cypher/parsing/QueryParsingTest.java

Lines changed: 0 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -17,8 +17,4 @@ public QueryParsingTest() {
1717
public void testMultipleQueries() {
1818
doTest(true);
1919
}
20-
21-
public void testBulkImport() {
22-
doTest(true);
23-
}
2420
}

testing/integration-neo4j/src/test/java/com/albertoventurini/graphdbplugin/test/integration/neo4j/tests/cypher/parsing/clause/QueryClauseParsingTest.java

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -58,6 +58,14 @@ public void testStart() {
5858
doTest(true);
5959
}
6060

61+
public void testSubQueries() {
62+
doTest(true);
63+
}
64+
65+
public void testSubQueriesInTransactions() {
66+
doTest(true);
67+
}
68+
6169
public void testUnion() {
6270
doTest(true);
6371
}

testing/integration-neo4j/src/test/resources/parsing/query/BulkImport.cyp

Lines changed: 0 additions & 4 deletions
This file was deleted.

testing/integration-neo4j/src/test/resources/parsing/query/BulkImport.txt

Lines changed: 0 additions & 133 deletions
This file was deleted.
Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
CALL {
2+
RETURN "Hello" AS msg
3+
}
4+
RETURN msg;
5+
CALL {
6+
WITH xs
7+
UNWIND xs AS x
8+
MATCH (n:Node {name: x})
9+
RETURN n.name AS name
10+
}
11+
RETURN name;

0 commit comments

Comments
 (0)