@@ -50,6 +50,36 @@ const cleanup = () => {
50
50
} catch ( x ) {
51
51
}
52
52
} ;
53
+
54
+ const assertRuleIsUsed = ( query ) => {
55
+ // assert the rule is not used when it's disabled
56
+ const planDisabled = AQL_EXPLAIN ( query , { } , paramDisabled ) ;
57
+ expect ( planDisabled . plan . rules . indexOf ( ruleName ) ) . to . equal ( - 1 , query ) ;
58
+
59
+ // assert the rule is used when it's enabled
60
+ const planEnabled = AQL_EXPLAIN ( query , { } , paramEnabled ) ;
61
+ expect ( planEnabled . plan . rules . indexOf ( ruleName ) ) . to . not . equal ( - 1 , query ) ;
62
+ } ;
63
+
64
+ const assertResultsAreUnchanged = ( query ) => {
65
+ // assert the rule is not used when it's disabled.
66
+ const planDisabled = AQL_EXPLAIN ( query , { } , paramDisabled ) ;
67
+ expect ( planDisabled . plan . rules . indexOf ( ruleName ) ) . to . equal ( - 1 , query ) ;
68
+
69
+ const resultDisabled = AQL_EXECUTE ( query , { } , paramDisabled ) . json ;
70
+ const resultEnabled = AQL_EXECUTE ( query , { } , paramEnabled ) . json ;
71
+
72
+ expect ( isEqual ( resultDisabled , resultEnabled ) ) . to . equal ( true , query ) ;
73
+
74
+ const opts = { allPlans : true , verbosePlans : true , optimizer : { rules : [ '-all' , '+' + ruleName ] } } ;
75
+
76
+ const plans = AQL_EXPLAIN ( query , { } , opts ) . plans ;
77
+ plans . forEach ( function ( plan ) {
78
+ const jsonResult = AQL_EXECUTEJSON ( plan , { optimizer : { rules : [ '-all' ] } } ) . json ;
79
+ expect ( jsonResult ) . to . deep . equal ( resultDisabled , query ) ;
80
+ } ) ;
81
+ } ;
82
+
53
83
// //////////////////////////////////////////////////////////////////////////////
54
84
// / @brief test suite
55
85
// //////////////////////////////////////////////////////////////////////////////
@@ -207,25 +237,9 @@ describe('Rule optimize-traversals', () => {
207
237
FILTER p.edges[1].theTruth == true FILTER p.edges[1].label == 'foo'
208
238
RETURN {v,e,p}`
209
239
] ;
210
- const opts = { allPlans : true , verbosePlans : true , optimizer : { rules : [ '-all' , '+' + ruleName ] } } ;
211
-
212
- queries . forEach ( function ( query ) {
213
- const planDisabled = AQL_EXPLAIN ( query , { } , paramDisabled ) ;
214
- const planEnabled = AQL_EXPLAIN ( query , { } , paramEnabled ) ;
215
- const resultDisabled = AQL_EXECUTE ( query , { } , paramDisabled ) . json ;
216
- const resultEnabled = AQL_EXECUTE ( query , { } , paramEnabled ) . json ;
217
240
218
- expect ( isEqual ( resultDisabled , resultEnabled ) ) . to . equal ( true , query ) ;
219
-
220
- expect ( planDisabled . plan . rules . indexOf ( ruleName ) ) . to . equal ( - 1 , query ) ;
221
- expect ( planEnabled . plan . rules . indexOf ( ruleName ) ) . to . not . equal ( - 1 , query ) ;
222
-
223
- const plans = AQL_EXPLAIN ( query , { } , opts ) . plans ;
224
- plans . forEach ( function ( plan ) {
225
- const jsonResult = AQL_EXECUTEJSON ( plan , { optimizer : { rules : [ '-all' ] } } ) . json ;
226
- expect ( jsonResult ) . to . deep . equal ( resultDisabled , query ) ;
227
- } ) ;
228
- } ) ;
241
+ queries . forEach ( query => assertRuleIsUsed ( query ) ) ;
242
+ queries . forEach ( query => assertResultsAreUnchanged ( query ) ) ;
229
243
} ) ;
230
244
231
245
it ( 'should prune when using functions' , ( ) => {
@@ -655,4 +669,37 @@ describe('Rule optimize-traversals', () => {
655
669
} ) ;
656
670
} ) ;
657
671
} ) ;
672
+
673
+ describe ( 'regression tests' , ( ) => {
674
+ before ( cleanup ) ;
675
+ after ( cleanup ) ;
676
+
677
+ // https://github.com/arangodb/release-3.4/issues/91
678
+ // Regression test: With 'optimize-traversals' enabled, the filter
679
+ // p.vertices[* FILTER CURRENT._id != 'V/1'].label ALL == true
680
+ // was effectively changed to
681
+ // p.vertices[*].label ALL == true
682
+ // . That is, inline expressions were ignored.
683
+ it ( 'inline expressions should not be changed' , ( ) => {
684
+ { // create data
685
+ graph = graphModule . _create ( graphName , [
686
+ graphModule . _relation ( 'E' , 'V' , 'V' ) ] ) ;
687
+
688
+ graph . V . save ( { _key : '1' , label : false } ) ;
689
+ graph . V . save ( { _key : '2' , label : true } ) ;
690
+ graph . V . save ( { _key : '3' , label : false } ) ;
691
+
692
+ graph . E . save ( 'V/1' , 'V/2' , { } ) ;
693
+ graph . E . save ( 'V/1' , 'V/3' , { } ) ;
694
+ }
695
+
696
+ const query = `
697
+ FOR v, e, p IN 1..10 OUTBOUND 'V/1' GRAPH '${ graphName } '
698
+ FILTER p.vertices[* FILTER CURRENT._id != 'V/1'].label ALL == true
699
+ RETURN p.vertices
700
+ ` ;
701
+
702
+ assertResultsAreUnchanged ( query ) ;
703
+ } ) ;
704
+ } ) ;
658
705
} ) ;
0 commit comments