28
28
/// @author Copyright 2012, triAGENS GmbH, Cologne, Germany
29
29
////////////////////////////////////////////////////////////////////////////////
30
30
31
- var jsunity = require ( "jsunity" ) ;
32
- var helper = require ( "@arangodb/aql-helper" ) ;
33
- var isEqual = helper . isEqual ;
34
- var db = require ( "@arangodb" ) . db ;
35
- var _ = require ( "lodash" ) ;
31
+ const jsunity = require ( "jsunity" ) ;
32
+ const helper = require ( "@arangodb/aql-helper" ) ;
33
+ const isEqual = helper . isEqual ;
34
+ const db = require ( "@arangodb" ) . db ;
35
+ const _ = require ( "lodash" ) ;
36
36
37
37
////////////////////////////////////////////////////////////////////////////////
38
38
/// @brief test suite
39
39
////////////////////////////////////////////////////////////////////////////////
40
40
41
41
function optimizerRuleTestSuite ( ) {
42
- var ruleName = "interchange-adjacent-enumerations" ;
42
+ const ruleName = "interchange-adjacent-enumerations" ;
43
43
44
44
// various choices to control the optimizer:
45
- var paramNone = { optimizer : { rules : [ "-all" ] } } ;
46
- var paramEnabled = { optimizer : { rules : [ "-all" , "+" + ruleName ] } } ;
47
- var paramDisabled = { optimizer : { rules : [ "+all" , "-" + ruleName ] } } ;
45
+ const paramNone = { optimizer : { rules : [ "-all" ] } } ;
46
+ const paramEnabled = { optimizer : { rules : [ "-all" , "+" + ruleName ] } } ;
47
+ const paramDisabled = { optimizer : { rules : [ "+all" , "-" + ruleName ] } } ;
48
48
49
- var collection = null ;
50
- var collectionName = "UnitTestsAhuacatlOptimizer" ;
49
+ const collectionName = "UnitTestsAhuacatlOptimizer" ;
51
50
52
51
return {
53
52
54
- ////////////////////////////////////////////////////////////////////////////////
55
- /// @brief set up
56
- ////////////////////////////////////////////////////////////////////////////////
57
-
58
53
setUpAll : function ( ) {
59
54
db . _drop ( collectionName ) ;
60
- collection = db . _create ( collectionName ) ;
55
+ let collection = db . _create ( collectionName ) ;
61
56
62
- for ( var i = 0 ; i < 10 ; ++ i ) {
63
- collection . save ( { value : i } ) ;
57
+ let docs = [ ] ;
58
+ for ( let i = 0 ; i < 10 ; ++ i ) {
59
+ docs . push ( { value : i } ) ;
64
60
}
61
+ collection . insert ( docs ) ;
65
62
} ,
66
63
67
- ////////////////////////////////////////////////////////////////////////////////
68
- /// @brief tear down
69
- ////////////////////////////////////////////////////////////////////////////////
70
-
71
64
tearDownAll : function ( ) {
72
65
db . _drop ( collectionName ) ;
73
66
} ,
@@ -77,17 +70,17 @@ function optimizerRuleTestSuite () {
77
70
////////////////////////////////////////////////////////////////////////////////
78
71
79
72
testRuleDisabled : function ( ) {
80
- var queries = [
73
+ let queries = [
81
74
"FOR i IN " + collectionName + " FOR j IN " + collectionName + " RETURN 1" ,
82
75
"FOR j IN " + collectionName + " FILTER j.i == 1 FOR i IN " + collectionName + " RETURN j"
83
76
] ;
84
77
85
- var opts = _ . clone ( paramNone ) ;
78
+ let opts = _ . clone ( paramNone ) ;
86
79
opts . allPlans = true ;
87
80
opts . verbosePlans = true ;
88
81
89
82
queries . forEach ( function ( query ) {
90
- var result = AQL_EXPLAIN ( query , { } , opts ) ;
83
+ let result = AQL_EXPLAIN ( query , { } , opts ) ;
91
84
result . plans . forEach ( function ( plan ) {
92
85
assertEqual ( [ "scatter-in-cluster" ] , plan . rules ) ;
93
86
} ) ;
@@ -99,22 +92,27 @@ function optimizerRuleTestSuite () {
99
92
////////////////////////////////////////////////////////////////////////////////
100
93
101
94
testRuleNoEffect : function ( ) {
102
- var queries = [
95
+ let queries = [
103
96
"FOR i IN 1..10 RETURN i" ,
104
97
"FOR i IN " + collectionName + " RETURN i" ,
105
98
"FOR i IN " + collectionName + " FILTER i == 1 FOR j IN " + collectionName + " RETURN i" ,
106
99
"FOR i IN " + collectionName + " LIMIT 1 FOR j IN " + collectionName + " RETURN i" ,
107
- "FOR i IN " + collectionName + " RETURN (FOR j IN " + collectionName + " RETURN j)"
100
+ "FOR i IN " + collectionName + " RETURN (FOR j IN " + collectionName + " RETURN j)" ,
101
+ // the following query must not be optimized because "sub" depends on "i"
102
+ "FOR i IN " + collectionName + " FOR sub IN i FILTER sub.value1 == 'test' && sub.value2 != '' RETURN i" ,
103
+ "FOR i IN " + collectionName + " FOR sub1 IN i FOR sub2 IN sub1 FILTER sub2.value1 == 'test' && sub2.value2 != '' RETURN i" ,
104
+ "FOR i IN " + collectionName + " FOR sub1 IN i FOR sub2 IN i FILTER sub2.value1 == 'test' && sub2.value2 != '' RETURN i" ,
105
+ "FOR i IN " + collectionName + " FOR sub1 IN i FOR sub2 IN i FILTER sub2.value1 == 'test' && sub2.value2 != '' && sub2.value != sub1 RETURN i" ,
108
106
] ;
109
107
110
- var opts = _ . clone ( paramEnabled ) ;
108
+ let opts = _ . clone ( paramEnabled ) ;
111
109
opts . allPlans = true ;
112
110
opts . verbosePlans = true ;
113
111
114
112
queries . forEach ( function ( query ) {
115
- var result = AQL_EXPLAIN ( query , { } , opts ) ;
113
+ let result = AQL_EXPLAIN ( query , { } , opts ) ;
116
114
result . plans . forEach ( function ( plan ) {
117
- assertTrue ( plan . rules . indexOf ( ruleName ) === - 1 , query ) ;
115
+ assertEqual ( - 1 , plan . rules . indexOf ( ruleName ) , query ) ;
118
116
} ) ;
119
117
} ) ;
120
118
} ,
@@ -124,7 +122,7 @@ function optimizerRuleTestSuite () {
124
122
////////////////////////////////////////////////////////////////////////////////
125
123
126
124
testRuleHasEffect : function ( ) {
127
- var queries = [
125
+ let queries = [
128
126
[ "FOR i IN " + collectionName + " FOR j IN " + collectionName + " RETURN i" , 1 ] ,
129
127
[ "FOR i IN 1..10 FOR j IN " + collectionName + " FOR k IN " + collectionName + " RETURN i" , 5 ] ,
130
128
[ "FOR i IN " + collectionName + " FOR j IN " + collectionName + " FOR k IN " + collectionName + " RETURN i" , 5 ] ,
@@ -134,15 +132,15 @@ function optimizerRuleTestSuite () {
134
132
[ "FOR x IN (FOR i IN " + collectionName + " FOR j IN " + collectionName + " FOR k IN " + collectionName + " RETURN i) FOR y IN (FOR i IN " + collectionName + " FOR j IN " + collectionName + " RETURN i) RETURN x" , 11 ]
135
133
] ;
136
134
137
- var opts = _ . clone ( paramEnabled ) ;
135
+ let opts = _ . clone ( paramEnabled ) ;
138
136
opts . allPlans = true ;
139
137
opts . verbosePlans = true ;
140
138
141
139
queries . forEach ( function ( query ) {
142
- var withRule = 0 ;
143
- var withoutRule = 0 ;
140
+ let withRule = 0 ;
141
+ let withoutRule = 0 ;
144
142
145
- var result = AQL_EXPLAIN ( query [ 0 ] , { } , opts ) ;
143
+ let result = AQL_EXPLAIN ( query [ 0 ] , { } , opts ) ;
146
144
result . plans . forEach ( function ( plan ) {
147
145
if ( plan . rules . indexOf ( ruleName ) === - 1 ) {
148
146
withoutRule ++ ;
@@ -165,30 +163,30 @@ function optimizerRuleTestSuite () {
165
163
////////////////////////////////////////////////////////////////////////////////
166
164
167
165
testResults : function ( ) {
168
- var queries = [
166
+ let queries = [
169
167
[ "FOR i IN " + collectionName + " FOR j IN " + collectionName + " SORT i.value, j.value FILTER i.value == j.value RETURN i.value" , [ 0 , 1 , 2 , 3 , 4 , 5 , 6 , 7 , 8 , 9 ] ] ,
170
168
[ "FOR j IN " + collectionName + " FOR i IN " + collectionName + " SORT i.value, j.value FILTER i.value == j.value RETURN i.value" , [ 0 , 1 , 2 , 3 , 4 , 5 , 6 , 7 , 8 , 9 ] ] ,
171
169
[ "FOR x IN (FOR i IN " + collectionName + " FOR j IN " + collectionName + " RETURN { i: i.value, j: j.value }) FILTER x.i == x.j SORT x.i RETURN x.i" , [ 0 , 1 , 2 , 3 , 4 , 5 , 6 , 7 , 8 , 9 ] ]
172
170
] ;
173
171
174
- var opts = _ . clone ( paramEnabled ) ;
172
+ let opts = _ . clone ( paramEnabled ) ;
175
173
opts . allPlans = true ;
176
174
opts . verbosePlans = true ;
177
175
178
176
queries . forEach ( function ( query ) {
179
- var planDisabled = AQL_EXPLAIN ( query [ 0 ] , { } , paramDisabled ) ;
180
- var plansEnabled = AQL_EXPLAIN ( query [ 0 ] , { } , opts ) ;
181
- var resultDisabled = AQL_EXECUTE ( query [ 0 ] , { } , paramDisabled ) . json ;
177
+ let planDisabled = AQL_EXPLAIN ( query [ 0 ] , { } , paramDisabled ) ;
178
+ let plansEnabled = AQL_EXPLAIN ( query [ 0 ] , { } , opts ) ;
179
+ let resultDisabled = AQL_EXECUTE ( query [ 0 ] , { } , paramDisabled ) . json ;
182
180
183
- assertTrue ( planDisabled . plan . rules . indexOf ( ruleName ) === - 1 , query [ 0 ] ) ;
181
+ assertEqual ( - 1 , planDisabled . plan . rules . indexOf ( ruleName ) , query [ 0 ] ) ;
184
182
assertEqual ( resultDisabled , query [ 1 ] ) ;
185
183
186
184
assertTrue ( plansEnabled . plans . length > 1 ) ;
187
185
188
186
// iterate over all plans
189
- var withRule = 0 ;
187
+ let withRule = 0 ;
190
188
plansEnabled . plans . forEach ( function ( plan ) {
191
- var resultEnabled = AQL_EXECUTEJSON ( plan ) . json ;
189
+ let resultEnabled = AQL_EXECUTEJSON ( plan ) . json ;
192
190
assertTrue ( isEqual ( resultDisabled , resultEnabled ) , query [ 0 ] ) ;
193
191
if ( plan . rules . indexOf ( ruleName ) !== - 1 ) {
194
192
withRule ++ ;
@@ -204,11 +202,6 @@ function optimizerRuleTestSuite () {
204
202
} ;
205
203
}
206
204
207
- ////////////////////////////////////////////////////////////////////////////////
208
- /// @brief executes the test suite
209
- ////////////////////////////////////////////////////////////////////////////////
210
-
211
205
jsunity . run ( optimizerRuleTestSuite ) ;
212
206
213
207
return jsunity . done ( ) ;
214
-
0 commit comments