4
4
////////////////////////////////////////////////////////////////////////////////
5
5
/// @brief tests for optimizer rules
6
6
///
7
- /// @file
8
- ///
9
7
/// DISCLAIMER
10
8
///
11
9
/// Copyright 2010-2012 triagens GmbH, Cologne, Germany
28
26
/// @author Copyright 2012, triAGENS GmbH, Cologne, Germany
29
27
////////////////////////////////////////////////////////////////////////////////
30
28
31
- var jsunity = require ( "jsunity" ) ;
32
- var helper = require ( "@arangodb/aql-helper" ) ;
33
- var isEqual = helper . isEqual ;
34
-
35
- ////////////////////////////////////////////////////////////////////////////////
36
- /// @brief test suite
37
- ////////////////////////////////////////////////////////////////////////////////
29
+ const jsunity = require ( "jsunity" ) ;
30
+ const helper = require ( "@arangodb/aql-helper" ) ;
31
+ const isEqual = helper . isEqual ;
38
32
39
33
function optimizerRuleTestSuite ( ) {
40
- var ruleName = "remove-collect-variables" ;
34
+ const ruleName = "remove-collect-variables" ;
41
35
// various choices to control the optimizer:
42
- var paramNone = { optimizer : { rules : [ "-all" ] } } ;
43
- var paramEnabled = { optimizer : { rules : [ "-all" , "+" + ruleName ] } } ;
44
- var paramDisabled = { optimizer : { rules : [ "+all" , "-" + ruleName ] } } ;
36
+ const paramNone = { optimizer : { rules : [ "-all" ] } } ;
37
+ const paramEnabled = { optimizer : { rules : [ "-all" , "+" + ruleName ] } } ;
38
+ const paramDisabled = { optimizer : { rules : [ "+all" , "-" + ruleName ] } } ;
45
39
46
40
return {
47
41
@@ -50,14 +44,18 @@ function optimizerRuleTestSuite () {
50
44
////////////////////////////////////////////////////////////////////////////////
51
45
52
46
testRuleDisabled : function ( ) {
53
- var queries = [
47
+ const queries = [
54
48
"FOR i IN 1..10 COLLECT a = i INTO group RETURN a" ,
55
49
"FOR i IN 1..10 FOR j IN 1..10 COLLECT a = i, b = j INTO group RETURN a" ,
56
- "FOR i IN 1..10 FOR j IN 1..10 COLLECT a = i, b = j INTO group RETURN { a: a, b : b }"
50
+ "FOR i IN 1..10 FOR j IN 1..10 COLLECT a = i, b = j INTO group RETURN { a: a, b : b }" ,
51
+ "FOR i IN 1..10 COLLECT WITH COUNT INTO cnt RETURN 1" ,
52
+ "FOR i IN 1..10 COLLECT AGGREGATE cnt = COUNT() RETURN 1" ,
53
+ "FOR i IN 1..10 COLLECT AGGREGATE sum = SUM(i) RETURN 1" ,
54
+ "FOR i IN 1..10 COLLECT AGGREGATE cnt = COUNT(), sum = SUM(i) RETURN 1" ,
57
55
] ;
58
56
59
57
queries . forEach ( function ( query ) {
60
- var result = AQL_EXPLAIN ( query , { } , paramNone ) ;
58
+ let result = AQL_EXPLAIN ( query , { } , paramNone ) ;
61
59
assertEqual ( [ ] , result . plan . rules ) ;
62
60
} ) ;
63
61
} ,
@@ -67,15 +65,23 @@ function optimizerRuleTestSuite () {
67
65
////////////////////////////////////////////////////////////////////////////////
68
66
69
67
testRuleNoEffect : function ( ) {
70
- var queries = [
68
+ const queries = [
71
69
"FOR i IN 1..10 COLLECT a = i RETURN a" ,
72
70
"FOR i IN 1..10 FOR j IN 1..10 COLLECT a = i, b = j RETURN a" ,
73
71
"FOR i IN 1..10 FOR j IN 1..10 COLLECT a = i, b = j INTO group RETURN { a: a, b : b, group: group }" ,
72
+ "FOR i IN 1..10 COLLECT AGGREGATE cnt = COUNT() RETURN cnt" ,
73
+ "FOR i IN 1..10 COLLECT AGGREGATE cnt = COUNT() RETURN 1" ,
74
+ "FOR i IN 1..10 COLLECT AGGREGATE sum = SUM(i) RETURN sum" ,
75
+ "FOR i IN 1..10 COLLECT AGGREGATE sum = SUM(i) RETURN 1" ,
76
+ "FOR i IN 1..10 COLLECT AGGREGATE cnt = COUNT(), sum = SUM(i) RETURN [cnt, sum]" ,
77
+ "FOR i IN 1..10 COLLECT v = i WITH COUNT INTO cnt RETURN cnt" ,
78
+ "FOR i IN 1..10 COLLECT v = i AGGREGATE cnt = COUNT() RETURN cnt" ,
79
+ "FOR i IN 1..10 COLLECT v = i AGGREGATE sum = SUM(i) RETURN sum" ,
74
80
] ;
75
81
76
82
queries . forEach ( function ( query ) {
77
- var result = AQL_EXPLAIN ( query , { } , paramEnabled ) ;
78
- assertTrue ( result . plan . rules . indexOf ( ruleName ) === - 1 , query ) ;
83
+ let result = AQL_EXPLAIN ( query , { } , paramEnabled ) ;
84
+ assertEqual ( - 1 , result . plan . rules . indexOf ( ruleName ) , query ) ;
79
85
} ) ;
80
86
} ,
81
87
@@ -84,14 +90,19 @@ function optimizerRuleTestSuite () {
84
90
////////////////////////////////////////////////////////////////////////////////
85
91
86
92
testRuleHasEffect : function ( ) {
87
- var queries = [
93
+ const queries = [
88
94
"FOR i IN 1..10 COLLECT a = i INTO group RETURN a" ,
89
95
"FOR i IN 1..10 FOR j IN 1..10 COLLECT a = i, b = j INTO group RETURN a" ,
90
96
"FOR i IN 1..10 FOR j IN 1..10 COLLECT a = i, b = j INTO group RETURN { a: a, b : b }" ,
97
+ "FOR i IN 1..10 COLLECT AGGREGATE cnt = COUNT(), sum = SUM(i) RETURN 1" ,
98
+ "FOR i IN 1..10 COLLECT v = i AGGREGATE cnt = COUNT() RETURN 1" ,
99
+ "FOR i IN 1..10 COLLECT v = i AGGREGATE sum = SUM(i) RETURN 1" ,
100
+ "FOR i IN 1..10 COLLECT v = i AGGREGATE cnt = COUNT(), sum = SUM(i) RETURN 1" ,
101
+ "FOR i IN 1..10 COLLECT v = i WITH COUNT INTO cnt RETURN 1" ,
91
102
] ;
92
103
93
104
queries . forEach ( function ( query ) {
94
- var result = AQL_EXPLAIN ( query , { } , paramEnabled ) ;
105
+ let result = AQL_EXPLAIN ( query , { } , paramEnabled ) ;
95
106
assertNotEqual ( - 1 , result . plan . rules . indexOf ( ruleName ) , query ) ;
96
107
} ) ;
97
108
} ,
@@ -102,14 +113,16 @@ function optimizerRuleTestSuite () {
102
113
103
114
104
115
testPlans : function ( ) {
105
- var plans = [
116
+ const plans = [
106
117
[ "FOR i IN 1..10 COLLECT a = i INTO group RETURN a" , [ "SingletonNode" , "CalculationNode" , "EnumerateListNode" , "SortNode" , "CollectNode" , "ReturnNode" ] ] ,
107
118
[ "FOR i IN 1..10 FOR j IN 1..10 COLLECT a = i, b = j INTO group RETURN a" , [ "SingletonNode" , "CalculationNode" , "EnumerateListNode" , "CalculationNode" , "EnumerateListNode" , "SortNode" , "CollectNode" , "ReturnNode" ] ] ,
108
- [ "FOR i IN 1..10 FOR j IN 1..10 COLLECT a = i, b = j INTO group RETURN { a: a, b : b }" , [ "SingletonNode" , "CalculationNode" , "EnumerateListNode" , "CalculationNode" , "EnumerateListNode" , "SortNode" , "CollectNode" , "CalculationNode" , "ReturnNode" ] ]
119
+ [ "FOR i IN 1..10 FOR j IN 1..10 COLLECT a = i, b = j INTO group RETURN { a: a, b : b }" , [ "SingletonNode" , "CalculationNode" , "EnumerateListNode" , "CalculationNode" , "EnumerateListNode" , "SortNode" , "CollectNode" , "CalculationNode" , "ReturnNode" ] ] ,
120
+ [ "FOR i IN 1..10 COLLECT v = i WITH COUNT INTO cnt RETURN 1" , [ "SingletonNode" , "CalculationNode" , "EnumerateListNode" , "CollectNode" , "SortNode" , "CalculationNode" , "ReturnNode" ] ] ,
121
+ [ "FOR i IN 1..10 COLLECT v = i AGGREGATE cnt = COUNT() RETURN 1" , [ "SingletonNode" , "CalculationNode" , "EnumerateListNode" , "CollectNode" , "SortNode" , "CalculationNode" , "ReturnNode" ] ] ,
109
122
] ;
110
123
111
124
plans . forEach ( function ( plan ) {
112
- var result = AQL_EXPLAIN ( plan [ 0 ] , { } , paramEnabled ) ;
125
+ let result = AQL_EXPLAIN ( plan [ 0 ] , { } , paramEnabled ) ;
113
126
assertNotEqual ( - 1 , result . plan . rules . indexOf ( ruleName ) , plan [ 0 ] ) ;
114
127
assertEqual ( plan [ 1 ] , helper . getCompactPlan ( result ) . map ( function ( node ) { return node . type ; } ) , plan [ 0 ] ) ;
115
128
} ) ;
@@ -120,25 +133,57 @@ function optimizerRuleTestSuite () {
120
133
////////////////////////////////////////////////////////////////////////////////
121
134
122
135
testResults : function ( ) {
123
- var queries = [
136
+ const queries = [
124
137
[ "FOR i IN 1..10 COLLECT a = i INTO group RETURN a" , [ 1 , 2 , 3 , 4 , 5 , 6 , 7 , 8 , 9 , 10 ] ] ,
125
138
[ "FOR i IN 1..2 FOR j IN 1..2 COLLECT a = i, b = j INTO group RETURN [ a, b ]" , [ [ 1 , 1 ] , [ 1 , 2 ] , [ 2 , 1 ] , [ 2 , 2 ] ] ] ,
139
+ [ "FOR i IN [] COLLECT v = i AGGREGATE cnt = COUNT() RETURN 1" , [ ] ] ,
140
+ [ "FOR i IN [] COLLECT v = i WITH COUNT INTO cnt RETURN 1" , [ ] ] ,
141
+ [ "FOR i IN 1..10 COLLECT v = i AGGREGATE cnt = COUNT() RETURN 1" , [ 1 , 1 , 1 , 1 , 1 , 1 , 1 , 1 , 1 , 1 ] ] ,
142
+ [ "FOR i IN 1..10 COLLECT v = i WITH COUNT INTO cnt RETURN 1" , [ 1 , 1 , 1 , 1 , 1 , 1 , 1 , 1 , 1 , 1 ] ] ,
143
+ [ "FOR i IN 1..10 COLLECT v = i AGGREGATE cnt = COUNT(), sum = SUM(i) RETURN 1" , [ 1 , 1 , 1 , 1 , 1 , 1 , 1 , 1 , 1 , 1 ] ] ,
144
+ [ "FOR i IN 1..10 COLLECT v = i AGGREGATE cnt = COUNT(), sum = SUM(i) RETURN cnt" , [ 1 , 1 , 1 , 1 , 1 , 1 , 1 , 1 , 1 , 1 ] ] ,
145
+ [ "FOR i IN 1..10 COLLECT v = i AGGREGATE cnt = COUNT(), sum = SUM(i) RETURN sum" , [ 1 , 2 , 3 , 4 , 5 , 6 , 7 , 8 , 9 , 10 ] ] ,
126
146
] ;
127
147
128
148
queries . forEach ( function ( query ) {
129
- var planDisabled = AQL_EXPLAIN ( query [ 0 ] , { } , paramDisabled ) ;
130
- var planEnabled = AQL_EXPLAIN ( query [ 0 ] , { } , paramEnabled ) ;
149
+ let planDisabled = AQL_EXPLAIN ( query [ 0 ] , { } , paramDisabled ) ;
150
+ let planEnabled = AQL_EXPLAIN ( query [ 0 ] , { } , paramEnabled ) ;
131
151
132
- var resultDisabled = AQL_EXECUTE ( query [ 0 ] , { } , paramDisabled ) . json ;
133
- var resultEnabled = AQL_EXECUTE ( query [ 0 ] , { } , paramEnabled ) . json ;
152
+ let resultDisabled = AQL_EXECUTE ( query [ 0 ] , { } , paramDisabled ) . json ;
153
+ let resultEnabled = AQL_EXECUTE ( query [ 0 ] , { } , paramEnabled ) . json ;
134
154
135
155
assertTrue ( isEqual ( resultDisabled , resultEnabled ) , query [ 0 ] ) ;
136
156
137
157
assertEqual ( - 1 , planDisabled . plan . rules . indexOf ( ruleName ) , query [ 0 ] ) ;
138
158
assertNotEqual ( - 1 , planEnabled . plan . rules . indexOf ( ruleName ) , query [ 0 ] ) ;
139
159
140
- assertEqual ( resultDisabled , query [ 1 ] ) ;
141
- assertEqual ( resultEnabled , query [ 1 ] ) ;
160
+ assertEqual ( resultDisabled , query [ 1 ] , query ) ;
161
+ assertEqual ( resultEnabled , query [ 1 ] , query ) ;
162
+ } ) ;
163
+ } ,
164
+
165
+ ////////////////////////////////////////////////////////////////////////////////
166
+ /// @brief test results
167
+ ////////////////////////////////////////////////////////////////////////////////
168
+
169
+ testResultsWhenRuleCannotFire : function ( ) {
170
+ const queries = [
171
+ [ "FOR i IN [] COLLECT AGGREGATE cnt = COUNT() RETURN 1" , [ 1 ] ] ,
172
+ [ "FOR i IN [] COLLECT WITH COUNT INTO cnt RETURN 1" , [ 1 ] ] ,
173
+ [ "FOR i IN 1..10 COLLECT AGGREGATE cnt = COUNT() RETURN 1" , [ 1 ] ] ,
174
+ [ "FOR i IN 1..10 COLLECT WITH COUNT INTO cnt RETURN 1" , [ 1 ] ] ,
175
+ [ "FOR i IN [] COLLECT AGGREGATE cnt = COUNT() RETURN cnt" , [ 0 ] ] ,
176
+ [ "FOR i IN [] COLLECT WITH COUNT INTO cnt RETURN cnt" , [ 0 ] ] ,
177
+ [ "FOR i IN 1..10 COLLECT AGGREGATE cnt = COUNT() RETURN cnt" , [ 10 ] ] ,
178
+ [ "FOR i IN 1..10 COLLECT WITH COUNT INTO cnt RETURN cnt" , [ 10 ] ] ,
179
+ ] ;
180
+
181
+ queries . forEach ( function ( query ) {
182
+ let plan = AQL_EXPLAIN ( query [ 0 ] , { } , paramEnabled ) ;
183
+ let result = AQL_EXECUTE ( query [ 0 ] , { } , paramEnabled ) . json ;
184
+
185
+ assertEqual ( - 1 , plan . plan . rules . indexOf ( ruleName ) , query [ 0 ] ) ;
186
+ assertEqual ( result , query [ 1 ] , query ) ;
142
187
} ) ;
143
188
} ,
144
189
@@ -396,11 +441,6 @@ function optimizerRuleTestSuite () {
396
441
} ;
397
442
}
398
443
399
- ////////////////////////////////////////////////////////////////////////////////
400
- /// @brief executes the test suite
401
- ////////////////////////////////////////////////////////////////////////////////
402
-
403
444
jsunity . run ( optimizerRuleTestSuite ) ;
404
445
405
446
return jsunity . done ( ) ;
406
-
0 commit comments