Skip to content

Commit 219bf31

Browse files
committed
Add a scope to the query graph nodes and relations.
1 parent eb24cf4 commit 219bf31

File tree

7 files changed

+313
-150
lines changed

7 files changed

+313
-150
lines changed

internal/knowledge/query_expression_builder_test.go

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -45,19 +45,19 @@ func TestShouldBuildExpression(t *testing.T) {
4545

4646
_, _, err := qg.PushNode(query.QueryNodePattern{
4747
Variable: "a",
48-
})
48+
}, MatchScope)
4949
require.NoError(t, err)
5050
_, _, err = qg.PushNode(query.QueryNodePattern{
5151
Variable: "b",
52-
})
52+
}, MatchScope)
5353
require.NoError(t, err)
5454

5555
require.NoError(t, err)
5656
_, _, err = qg.PushRelation(query.QueryRelationshipPattern{
5757
RelationshipDetail: &query.QueryRelationshipDetail{
5858
Variable: "r",
5959
},
60-
}, 0, 0)
60+
}, 0, 0, MatchScope)
6161
require.NoError(t, err)
6262

6363
expr := CypherToExpr(tc.Cypher)

internal/knowledge/query_expression_parser.go

Lines changed: 27 additions & 77 deletions
Original file line numberDiff line numberDiff line change
@@ -7,11 +7,15 @@ import (
77
"github.com/clems4ever/go-graphkb/internal/query"
88
)
99

10+
// ExpressionType expression type
1011
type ExpressionType int
1112

1213
const (
13-
NodeExprType ExpressionType = iota
14-
EdgeExprType ExpressionType = iota
14+
// NodeExprType node expression type
15+
NodeExprType ExpressionType = iota
16+
// EdgeExprType edge expression type
17+
EdgeExprType ExpressionType = iota
18+
// PropertyExprType property expression type
1519
PropertyExprType ExpressionType = iota
1620
)
1721

@@ -77,16 +81,21 @@ type ExpressionVisitor interface {
7781
type ExpressionParser struct {
7882
visitor ExpressionVisitor
7983
queryGraph *QueryGraph
84+
85+
// This ID is incremented for every pattern found in the expression
86+
patternIDGenerator int
8087
}
8188

8289
// NewExpressionParser create a new instance of expression parser.
8390
func NewExpressionParser(visitor ExpressionVisitor, queryGraph *QueryGraph) *ExpressionParser {
8491
return &ExpressionParser{
85-
visitor: visitor,
86-
queryGraph: queryGraph,
92+
visitor: visitor,
93+
queryGraph: queryGraph,
94+
patternIDGenerator: 0,
8795
}
8896
}
8997

98+
// ParsePropertyOrLabelsExpression parse property or labels expression
9099
func (ep *ExpressionParser) ParsePropertyOrLabelsExpression(q *query.QueryPropertyOrLabelsExpression) error {
91100
err := ep.visitor.OnEnterPropertyOrLabelsExpression(*q)
92101
if err != nil {
@@ -159,10 +168,13 @@ func (ep *ExpressionParser) ParsePropertyOrLabelsExpression(q *query.QueryProper
159168
}
160169
} else if q.Atom.RelationshipsPattern != nil {
161170
parser := NewPatternParser(ep.queryGraph)
162-
err := parser.ParseRelationshipsPattern(q.Atom.RelationshipsPattern)
171+
err := parser.ParseRelationshipsPattern(
172+
q.Atom.RelationshipsPattern,
173+
Scope{Context: WhereContext, ID: ep.patternIDGenerator})
163174
if err != nil {
164175
return err
165176
}
177+
ep.patternIDGenerator++
166178
} else {
167179
return fmt.Errorf("Unable to parse property or labels expression")
168180
}
@@ -175,6 +187,7 @@ func (ep *ExpressionParser) ParsePropertyOrLabelsExpression(q *query.QueryProper
175187
return nil
176188
}
177189

190+
// ParseStringListNullOperatorExpression parse string list null operator expression
178191
func (ep *ExpressionParser) ParseStringListNullOperatorExpression(q *query.QueryStringListNullOperatorExpression) error {
179192
err := ep.visitor.OnEnterStringListNullOperatorExpression(*q)
180193
if err != nil {
@@ -216,6 +229,7 @@ func (ep *ExpressionParser) ParseStringListNullOperatorExpression(q *query.Query
216229
return nil
217230
}
218231

232+
// ParseUnaryAddOrSubtractExpression parse unary add or subtract expression
219233
func (ep *ExpressionParser) ParseUnaryAddOrSubtractExpression(q *query.QueryUnaryAddOrSubtractExpression) error {
220234
err := ep.ParseStringListNullOperatorExpression(&q.StringListNullOperatorExpression)
221235
if err != nil {
@@ -224,6 +238,7 @@ func (ep *ExpressionParser) ParseUnaryAddOrSubtractExpression(q *query.QueryUnar
224238
return nil
225239
}
226240

241+
// ParsePowerOfExpression parse power of expression
227242
func (ep *ExpressionParser) ParsePowerOfExpression(q *query.QueryPowerOfExpression) error {
228243
err := ep.visitor.OnEnterPowerOfExpression()
229244
if err != nil {
@@ -244,6 +259,7 @@ func (ep *ExpressionParser) ParsePowerOfExpression(q *query.QueryPowerOfExpressi
244259
return nil
245260
}
246261

262+
// ParseMultipleDivideModuloExpression parse multiple divide modulo expression
247263
func (ep *ExpressionParser) ParseMultipleDivideModuloExpression(q *query.QueryMultipleDivideModuloExpression) error {
248264
err := ep.visitor.OnEnterMultipleDivideModuloExpression()
249265
if err != nil {
@@ -273,6 +289,7 @@ func (ep *ExpressionParser) ParseMultipleDivideModuloExpression(q *query.QueryMu
273289
return nil
274290
}
275291

292+
// ParseAddOrSubtractExpression parse add or subtract expression
276293
func (ep *ExpressionParser) ParseAddOrSubtractExpression(q *query.QueryAddOrSubtractExpression) error {
277294
err := ep.visitor.OnEnterAddOrSubtractExpression()
278295
if err != nil {
@@ -301,6 +318,7 @@ func (ep *ExpressionParser) ParseAddOrSubtractExpression(q *query.QueryAddOrSubt
301318
return nil
302319
}
303320

321+
// ParseComparisonExpression parse comparison expression
304322
func (ep *ExpressionParser) ParseComparisonExpression(q *query.QueryComparisonExpression) error {
305323
err := ep.visitor.OnEnterComparisonExpression()
306324
if err != nil {
@@ -331,6 +349,7 @@ func (ep *ExpressionParser) ParseComparisonExpression(q *query.QueryComparisonEx
331349
return nil
332350
}
333351

352+
// ParseNotExpression parse not expression
334353
func (ep *ExpressionParser) ParseNotExpression(q *query.QueryNotExpression) error {
335354
err := ep.visitor.OnEnterNotExpression(q.Not)
336355
if err != nil {
@@ -349,6 +368,7 @@ func (ep *ExpressionParser) ParseNotExpression(q *query.QueryNotExpression) erro
349368
return err
350369
}
351370

371+
// ParseXorExpression parse xor expression
352372
func (ep *ExpressionParser) ParseXorExpression(q *query.QueryXorExpression) error {
353373
err := ep.visitor.OnEnterXorExpression()
354374
if err != nil {
@@ -380,6 +400,7 @@ func (ep *ExpressionParser) ParseXorExpression(q *query.QueryXorExpression) erro
380400
return nil
381401
}
382402

403+
// ParseOrExpression parse or expression
383404
func (ep *ExpressionParser) ParseOrExpression(q *query.QueryOrExpression) error {
384405
var err error
385406
err = ep.visitor.OnEnterOrExpression()
@@ -401,6 +422,7 @@ func (ep *ExpressionParser) ParseOrExpression(q *query.QueryOrExpression) error
401422
return nil
402423
}
403424

425+
// ParseExpression parse expression
404426
func (ep *ExpressionParser) ParseExpression(q *query.QueryExpression) error {
405427
err := ep.visitor.OnEnterExpression()
406428
if err != nil {
@@ -416,75 +438,3 @@ func (ep *ExpressionParser) ParseExpression(q *query.QueryExpression) error {
416438
}
417439
return nil
418440
}
419-
420-
type ExpressionVisitorBase struct{}
421-
422-
func (evb *ExpressionVisitorBase) OnEnterRelationshipsPattern() error {
423-
return nil
424-
}
425-
func (evb *ExpressionVisitorBase) OnExitRelationshipsPattern() error {
426-
return nil
427-
}
428-
429-
func (evb *ExpressionVisitorBase) OnEnterNodePattern() error {
430-
return nil
431-
}
432-
func (evb *ExpressionVisitorBase) OnExitNodePattern() error {
433-
return nil
434-
}
435-
func (evb *ExpressionVisitorBase) OnEnterPropertyOrLabelsExpression(e query.QueryPropertyOrLabelsExpression) error {
436-
return nil
437-
}
438-
func (evb *ExpressionVisitorBase) OnExitPropertyOrLabelsExpression(e query.QueryPropertyOrLabelsExpression) error {
439-
return nil
440-
}
441-
func (evb *ExpressionVisitorBase) OnEnterStringListNullOperatorExpression(e query.QueryStringListNullOperatorExpression) error {
442-
return nil
443-
}
444-
func (evb *ExpressionVisitorBase) OnExitStringListNullOperatorExpression(e query.QueryStringListNullOperatorExpression) error {
445-
return nil
446-
}
447-
func (evb *ExpressionVisitorBase) OnVariable(name string) error { return nil }
448-
func (evb *ExpressionVisitorBase) OnVariablePropertiesPath(propertiesPath []string) error { return nil }
449-
func (evb *ExpressionVisitorBase) OnStringLiteral(value string) error { return nil }
450-
func (evb *ExpressionVisitorBase) OnDoubleLiteral(value float64) error { return nil }
451-
func (evb *ExpressionVisitorBase) OnIntegerLiteral(value int64) error { return nil }
452-
func (evb *ExpressionVisitorBase) OnBooleanLiteral(value bool) error { return nil }
453-
func (evb *ExpressionVisitorBase) OnEnterFunctionInvocation(name string, distinct bool) error {
454-
return nil
455-
}
456-
func (evb *ExpressionVisitorBase) OnExitFunctionInvocation(name string, distinct bool) error {
457-
return nil
458-
}
459-
func (evb *ExpressionVisitorBase) OnEnterParenthesizedExpression() error { return nil }
460-
func (evb *ExpressionVisitorBase) OnExitParenthesizedExpression() error { return nil }
461-
func (evb *ExpressionVisitorBase) OnStringOperator(operator query.StringOperator) error { return nil }
462-
func (evb *ExpressionVisitorBase) OnEnterUnaryExpression() error { return nil }
463-
func (evb *ExpressionVisitorBase) OnExitUnaryExpression() error { return nil }
464-
func (evb *ExpressionVisitorBase) OnEnterPowerOfExpression() error { return nil }
465-
func (evb *ExpressionVisitorBase) OnExitPowerOfExpression() error { return nil }
466-
func (evb *ExpressionVisitorBase) OnEnterMultipleDivideModuloExpression() error { return nil }
467-
func (evb *ExpressionVisitorBase) OnExitMultipleDivideModuloExpression() error { return nil }
468-
func (evb *ExpressionVisitorBase) OnMultiplyDivideModuloOperator(operator query.MultiplyDivideModuloOperator) error {
469-
return nil
470-
}
471-
func (evb *ExpressionVisitorBase) OnEnterAddOrSubtractExpression() error { return nil }
472-
func (evb *ExpressionVisitorBase) OnExitAddOrSubtractExpression() error { return nil }
473-
func (evb *ExpressionVisitorBase) OnAddOrSubtractOperator(operator query.AddOrSubtractOperator) error {
474-
return nil
475-
}
476-
func (evb *ExpressionVisitorBase) OnEnterComparisonExpression() error { return nil }
477-
func (evb *ExpressionVisitorBase) OnExitComparisonExpression() error { return nil }
478-
func (evb *ExpressionVisitorBase) OnComparisonOperator(operator query.ComparisonOperator) error {
479-
return nil
480-
}
481-
func (evb *ExpressionVisitorBase) OnEnterNotExpression(not bool) error { return nil }
482-
func (evb *ExpressionVisitorBase) OnExitNotExpression(not bool) error { return nil }
483-
func (evb *ExpressionVisitorBase) OnEnterAndExpression() error { return nil }
484-
func (evb *ExpressionVisitorBase) OnExitAndExpression() error { return nil }
485-
func (evb *ExpressionVisitorBase) OnEnterXorExpression() error { return nil }
486-
func (evb *ExpressionVisitorBase) OnExitXorExpression() error { return nil }
487-
func (evb *ExpressionVisitorBase) OnEnterOrExpression() error { return nil }
488-
func (evb *ExpressionVisitorBase) OnExitOrExpression() error { return nil }
489-
func (evb *ExpressionVisitorBase) OnEnterExpression() error { return nil }
490-
func (evb *ExpressionVisitorBase) OnExitExpression() error { return nil }
Lines changed: 78 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,78 @@
1+
package knowledge
2+
3+
import (
4+
"github.com/clems4ever/go-graphkb/internal/query"
5+
)
6+
7+
// ExpressionVisitorBase expression visitor base interface
8+
type ExpressionVisitorBase struct{}
9+
10+
func (evb *ExpressionVisitorBase) OnEnterRelationshipsPattern() error {
11+
return nil
12+
}
13+
func (evb *ExpressionVisitorBase) OnExitRelationshipsPattern() error {
14+
return nil
15+
}
16+
17+
func (evb *ExpressionVisitorBase) OnEnterNodePattern() error {
18+
return nil
19+
}
20+
func (evb *ExpressionVisitorBase) OnExitNodePattern() error {
21+
return nil
22+
}
23+
func (evb *ExpressionVisitorBase) OnEnterPropertyOrLabelsExpression(e query.QueryPropertyOrLabelsExpression) error {
24+
return nil
25+
}
26+
func (evb *ExpressionVisitorBase) OnExitPropertyOrLabelsExpression(e query.QueryPropertyOrLabelsExpression) error {
27+
return nil
28+
}
29+
func (evb *ExpressionVisitorBase) OnEnterStringListNullOperatorExpression(e query.QueryStringListNullOperatorExpression) error {
30+
return nil
31+
}
32+
func (evb *ExpressionVisitorBase) OnExitStringListNullOperatorExpression(e query.QueryStringListNullOperatorExpression) error {
33+
return nil
34+
}
35+
func (evb *ExpressionVisitorBase) OnVariable(name string) error { return nil }
36+
func (evb *ExpressionVisitorBase) OnVariablePropertiesPath(propertiesPath []string) error { return nil }
37+
func (evb *ExpressionVisitorBase) OnStringLiteral(value string) error { return nil }
38+
func (evb *ExpressionVisitorBase) OnDoubleLiteral(value float64) error { return nil }
39+
func (evb *ExpressionVisitorBase) OnIntegerLiteral(value int64) error { return nil }
40+
func (evb *ExpressionVisitorBase) OnBooleanLiteral(value bool) error { return nil }
41+
func (evb *ExpressionVisitorBase) OnEnterFunctionInvocation(name string, distinct bool) error {
42+
return nil
43+
}
44+
func (evb *ExpressionVisitorBase) OnExitFunctionInvocation(name string, distinct bool) error {
45+
return nil
46+
}
47+
func (evb *ExpressionVisitorBase) OnEnterParenthesizedExpression() error { return nil }
48+
func (evb *ExpressionVisitorBase) OnExitParenthesizedExpression() error { return nil }
49+
func (evb *ExpressionVisitorBase) OnStringOperator(operator query.StringOperator) error { return nil }
50+
func (evb *ExpressionVisitorBase) OnEnterUnaryExpression() error { return nil }
51+
func (evb *ExpressionVisitorBase) OnExitUnaryExpression() error { return nil }
52+
func (evb *ExpressionVisitorBase) OnEnterPowerOfExpression() error { return nil }
53+
func (evb *ExpressionVisitorBase) OnExitPowerOfExpression() error { return nil }
54+
func (evb *ExpressionVisitorBase) OnEnterMultipleDivideModuloExpression() error { return nil }
55+
func (evb *ExpressionVisitorBase) OnExitMultipleDivideModuloExpression() error { return nil }
56+
func (evb *ExpressionVisitorBase) OnMultiplyDivideModuloOperator(operator query.MultiplyDivideModuloOperator) error {
57+
return nil
58+
}
59+
func (evb *ExpressionVisitorBase) OnEnterAddOrSubtractExpression() error { return nil }
60+
func (evb *ExpressionVisitorBase) OnExitAddOrSubtractExpression() error { return nil }
61+
func (evb *ExpressionVisitorBase) OnAddOrSubtractOperator(operator query.AddOrSubtractOperator) error {
62+
return nil
63+
}
64+
func (evb *ExpressionVisitorBase) OnEnterComparisonExpression() error { return nil }
65+
func (evb *ExpressionVisitorBase) OnExitComparisonExpression() error { return nil }
66+
func (evb *ExpressionVisitorBase) OnComparisonOperator(operator query.ComparisonOperator) error {
67+
return nil
68+
}
69+
func (evb *ExpressionVisitorBase) OnEnterNotExpression(not bool) error { return nil }
70+
func (evb *ExpressionVisitorBase) OnExitNotExpression(not bool) error { return nil }
71+
func (evb *ExpressionVisitorBase) OnEnterAndExpression() error { return nil }
72+
func (evb *ExpressionVisitorBase) OnExitAndExpression() error { return nil }
73+
func (evb *ExpressionVisitorBase) OnEnterXorExpression() error { return nil }
74+
func (evb *ExpressionVisitorBase) OnExitXorExpression() error { return nil }
75+
func (evb *ExpressionVisitorBase) OnEnterOrExpression() error { return nil }
76+
func (evb *ExpressionVisitorBase) OnExitOrExpression() error { return nil }
77+
func (evb *ExpressionVisitorBase) OnEnterExpression() error { return nil }
78+
func (evb *ExpressionVisitorBase) OnExitExpression() error { return nil }

0 commit comments

Comments
 (0)