Skip to content

Commit 38a6771

Browse files
committed
Model combined UNION queries as a sequence of SingleQuery's
This also pushes `union` and `singleQuery` properties down from the RegularQuery to the new CombinedQuery interface. This way, SingleQuery is cleaned from those unused properties. When 3 or more SingleQueries built up a union query, it used to be modeled as a tree where each union node added one more SingleQuery like ``` S1 UNION S2 UNION S3 ``` was modeled as ``` RegularQuery +-singleQuery: RegularQuery | +-singleQuery: SingleQuery S1 | +-union: | +-[list entry]: Union | +-singleQuery: SingleQuery S2 +-union: +-list entry: Union +-singleQuery: SingleQuery S3 ``` From now, the representation is as follows, where RegularQuery has 2 subclasses: - SingleQuery used for sole queries not having any UNION clauses - CombinedQuery used for queries that have at least one query combinator (UNION in current openCypher, but other set combinators like INTERSECT are about to come, see opencypher/openCypher#227) ``` CombinedQuery +-singleQuery: SingleQuery S1 +-union: +-[list entry]: Union +-singleQuery: SingleQuery S2 +-[list entry]: Union +-singleQuery: SingleQuery S3 ```
1 parent abe9746 commit 38a6771

File tree

4 files changed

+37
-24
lines changed

4 files changed

+37
-24
lines changed

plugins/org.slizaa.neo4j.opencypher.ui/src/org/slizaa/neo4j/opencypher/ui/outline/OpenCypherOutlineTreeProvider.xtend

Lines changed: 24 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -4,9 +4,12 @@
44
package org.slizaa.neo4j.opencypher.ui.outline
55

66
import org.eclipse.xtext.EcoreUtil2
7+
import org.eclipse.xtext.nodemodel.util.NodeModelUtils
8+
import org.eclipse.xtext.ui.editor.outline.IOutlineNode
79
import org.eclipse.xtext.ui.editor.outline.impl.DefaultOutlineTreeProvider
810
import org.eclipse.xtext.ui.editor.outline.impl.DocumentRootNode
911
import org.slizaa.neo4j.opencypher.openCypher.Cypher
12+
import org.slizaa.neo4j.opencypher.openCypher.CombinedQuery
1013
import org.slizaa.neo4j.opencypher.openCypher.SingleQuery
1114
import org.slizaa.neo4j.opencypher.openCypher.Statement
1215
import org.slizaa.neo4j.opencypher.openCypher.Clause
@@ -26,24 +29,32 @@ class OpenCypherOutlineTreeProvider extends DefaultOutlineTreeProvider {
2629

2730
for (element : EcoreUtil2.getAllContentsOfType(cypher, Statement)) {
2831

29-
if (element instanceof SingleQuery) {
30-
val SingleQuery singleQuery = element as SingleQuery;
31-
if (singleQuery.union.size > 0) {
32+
if (element instanceof CombinedQuery) {
33+
val CombinedQuery combinedQuery = element as CombinedQuery;
34+
val SingleQuery singleQuery = combinedQuery.singleQuery;
3235
// TODO
33-
// createNode(parentNode, singleQuery);
34-
// val IOutlineNode singleQueryParent = NodeModelUtils.getNode(singleQuery);
35-
// for (clause : singleQuery.clauses) {
36-
// createNode(singleQueryParent, clause);
37-
// }
38-
} else {
39-
for (clause : singleQuery.clauses) {
40-
createNode(parentNode, clause);
41-
}
42-
}
36+
// createNode(parentNode, combinedQuery);
37+
// val IOutlineNode combinedQueryParent = NodeModelUtils.getNode(combinedQuery); //FIXME: getNode does not return IOutlineNode
38+
// createNode(combinedQueryParent, singleQuery);
39+
// val IOutlineNode singleQueryParent = NodeModelUtils.getNode(singleQuery); //FIXME: getNode does not return IOutlineNode
40+
// _addSingleQueryClauses(singleQueryParent, singleQuery);
41+
// for (_union : combinedQuery.union) {
42+
// createNode(combinedQueryParent, _union.singleQuery);
43+
// val IOutlineNode _unionParent = NodeModelUtils.getNode(_union.singleQuery); //FIXME: getNode does not return IOutlineNode
44+
// _addSingleQueryClauses(_unionParent, _union.singleQuery);
45+
// }
46+
} else if (element instanceof SingleQuery) {
47+
val SingleQuery singleQuery = element as SingleQuery;
48+
_addSingleQueryClauses(parentNode, singleQuery);
4349
} else {
4450
createNode(parentNode, element);
4551
}
4652
}
4753
}
4854

55+
def void _addSingleQueryClauses(IOutlineNode parentNode, SingleQuery singleQuery) {
56+
for (clause : singleQuery.clauses) {
57+
createNode(parentNode, clause);
58+
}
59+
}
4960
}

plugins/org.slizaa.neo4j.opencypher/model/generated/OpenCypher.ecore

Lines changed: 7 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -24,12 +24,7 @@
2424
</eClassifiers>
2525
<eClassifiers xsi:type="ecore:EClass" name="Statement"/>
2626
<eClassifiers xsi:type="ecore:EClass" name="Query" eSuperTypes="#//Statement"/>
27-
<eClassifiers xsi:type="ecore:EClass" name="RegularQuery" eSuperTypes="#//Query">
28-
<eStructuralFeatures xsi:type="ecore:EReference" name="singleQuery" eType="#//RegularQuery"
29-
containment="true"/>
30-
<eStructuralFeatures xsi:type="ecore:EReference" name="union" upperBound="-1"
31-
eType="#//Union" containment="true"/>
32-
</eClassifiers>
27+
<eClassifiers xsi:type="ecore:EClass" name="RegularQuery" eSuperTypes="#//Query"/>
3328
<eClassifiers xsi:type="ecore:EClass" name="BulkImportQuery" eSuperTypes="#//Query">
3429
<eStructuralFeatures xsi:type="ecore:EReference" name="periodicCommitHint" eType="#//PeriodicCommitHint"
3530
containment="true"/>
@@ -456,6 +451,12 @@
456451
<eStructuralFeatures xsi:type="ecore:EReference" name="cypherOption" upperBound="-1"
457452
eType="#//CypherOption" containment="true"/>
458453
</eClassifiers>
454+
<eClassifiers xsi:type="ecore:EClass" name="CombinedQuery" eSuperTypes="#//RegularQuery">
455+
<eStructuralFeatures xsi:type="ecore:EReference" name="singleQuery" eType="#//SingleQuery"
456+
containment="true"/>
457+
<eStructuralFeatures xsi:type="ecore:EReference" name="union" upperBound="-1"
458+
eType="#//Union" containment="true"/>
459+
</eClassifiers>
459460
<eClassifiers xsi:type="ecore:EClass" name="IndexHint" eSuperTypes="#//Hint">
460461
<eStructuralFeatures xsi:type="ecore:EReference" name="variable" eType="#//Variable"
461462
containment="true"/>

plugins/org.slizaa.neo4j.opencypher/model/generated/OpenCypher.genmodel

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -24,10 +24,7 @@
2424
</genClasses>
2525
<genClasses ecoreClass="OpenCypher.ecore#//Statement"/>
2626
<genClasses ecoreClass="OpenCypher.ecore#//Query"/>
27-
<genClasses ecoreClass="OpenCypher.ecore#//RegularQuery">
28-
<genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference OpenCypher.ecore#//RegularQuery/singleQuery"/>
29-
<genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference OpenCypher.ecore#//RegularQuery/union"/>
30-
</genClasses>
27+
<genClasses ecoreClass="OpenCypher.ecore#//RegularQuery"/>
3128
<genClasses ecoreClass="OpenCypher.ecore#//BulkImportQuery">
3229
<genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference OpenCypher.ecore#//BulkImportQuery/periodicCommitHint"/>
3330
<genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference OpenCypher.ecore#//BulkImportQuery/loadCSVQuery"/>
@@ -339,6 +336,10 @@
339336
<genFeatures createChild="false" ecoreFeature="ecore:EAttribute OpenCypher.ecore#//AllOptions/profile"/>
340337
<genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference OpenCypher.ecore#//AllOptions/cypherOption"/>
341338
</genClasses>
339+
<genClasses ecoreClass="OpenCypher.ecore#//CombinedQuery">
340+
<genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference OpenCypher.ecore#//CombinedQuery/singleQuery"/>
341+
<genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference OpenCypher.ecore#//CombinedQuery/union"/>
342+
</genClasses>
342343
<genClasses ecoreClass="OpenCypher.ecore#//IndexHint">
343344
<genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference OpenCypher.ecore#//IndexHint/variable"/>
344345
<genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference OpenCypher.ecore#//IndexHint/nodeLabel"/>

plugins/org.slizaa.neo4j.opencypher/src/org/slizaa/neo4j/opencypher/OpenCypher.xtext

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -57,7 +57,7 @@ RegularQuery:
5757
/*
5858
* regularQuery : singleQuery ( ws union )* ;
5959
*/
60-
SingleQuery ({RegularQuery.singleQuery=current} union+=Union)*;
60+
SingleQuery ({CombinedQuery.singleQuery=current} ( union+=Union )+ )? ;
6161

6262
BulkImportQuery:
6363
/*

0 commit comments

Comments
 (0)