@@ -27,7 +27,7 @@ describe_only_db('mongo')('Parse.Query hint', () => {
27
27
await TestUtils . destroyAllDataPermanently ( false ) ;
28
28
} ) ;
29
29
30
- it ( 'query find with hint string' , async ( ) => {
30
+ it_only_mongodb_version ( '<5.1' ) ( 'query find with hint string' , async ( ) => {
31
31
const object = new TestObject ( ) ;
32
32
await object . save ( ) ;
33
33
@@ -39,7 +39,18 @@ describe_only_db('mongo')('Parse.Query hint', () => {
39
39
expect ( explain . queryPlanner . winningPlan . inputStage . indexName ) . toBe ( '_id_' ) ;
40
40
} ) ;
41
41
42
- it ( 'query find with hint object' , async ( ) => {
42
+ it_only_mongodb_version ( '>=5.1' ) ( 'query find with hint string' , async ( ) => {
43
+ const object = new TestObject ( ) ;
44
+ await object . save ( ) ;
45
+
46
+ const collection = await config . database . adapter . _adaptiveCollection ( 'TestObject' ) ;
47
+ const explain = await collection . _rawFind ( { _id : object . id } , { hint : '_id_' , explain : true } ) ;
48
+ expect ( explain . queryPlanner . winningPlan . queryPlan . stage ) . toBe ( 'FETCH' ) ;
49
+ expect ( explain . queryPlanner . winningPlan . queryPlan . inputStage . stage ) . toBe ( 'IXSCAN' ) ;
50
+ expect ( explain . queryPlanner . winningPlan . queryPlan . inputStage . indexName ) . toBe ( '_id_' ) ;
51
+ } ) ;
52
+
53
+ it_only_mongodb_version ( '<5.1' ) ( 'query find with hint object' , async ( ) => {
43
54
const object = new TestObject ( ) ;
44
55
await object . save ( ) ;
45
56
@@ -53,6 +64,20 @@ describe_only_db('mongo')('Parse.Query hint', () => {
53
64
} ) ;
54
65
} ) ;
55
66
67
+ it_only_mongodb_version ( '>=5.1' ) ( 'query find with hint object' , async ( ) => {
68
+ const object = new TestObject ( ) ;
69
+ await object . save ( ) ;
70
+
71
+ const collection = await config . database . adapter . _adaptiveCollection ( 'TestObject' ) ;
72
+ const explain = await collection . _rawFind (
73
+ { _id : object . id } ,
74
+ { hint : { _id : 1 } , explain : true }
75
+ ) ;
76
+ expect ( explain . queryPlanner . winningPlan . queryPlan . stage ) . toBe ( 'FETCH' ) ;
77
+ expect ( explain . queryPlanner . winningPlan . queryPlan . inputStage . stage ) . toBe ( 'IXSCAN' ) ;
78
+ expect ( explain . queryPlanner . winningPlan . queryPlan . inputStage . keyPattern ) . toEqual ( { _id : 1 } ) ;
79
+ } ) ;
80
+
56
81
it_only_mongodb_version ( '<4.4' ) ( 'query aggregate with hint string' , async ( ) => {
57
82
const object = new TestObject ( { foo : 'bar' } ) ;
58
83
await object . save ( ) ;
@@ -73,7 +98,7 @@ describe_only_db('mongo')('Parse.Query hint', () => {
73
98
expect ( queryPlanner . winningPlan . inputStage . indexName ) . toBe ( '_id_' ) ;
74
99
} ) ;
75
100
76
- it_only_mongodb_version ( '>=4.4' ) ( 'query aggregate with hint string' , async ( ) => {
101
+ it_only_mongodb_version ( '>=4.4<5.1 ' ) ( 'query aggregate with hint string' , async ( ) => {
77
102
const object = new TestObject ( { foo : 'bar' } ) ;
78
103
await object . save ( ) ;
79
104
@@ -97,6 +122,30 @@ describe_only_db('mongo')('Parse.Query hint', () => {
97
122
expect ( queryPlanner . winningPlan . inputStage . inputStage . indexName ) . toBe ( '_id_' ) ;
98
123
} ) ;
99
124
125
+ it_only_mongodb_version ( '>=5.1' ) ( 'query aggregate with hint string' , async ( ) => {
126
+ const object = new TestObject ( { foo : 'bar' } ) ;
127
+ await object . save ( ) ;
128
+
129
+ const collection = await config . database . adapter . _adaptiveCollection ( 'TestObject' ) ;
130
+ let result = await collection . aggregate ( [ { $group : { _id : '$foo' } } ] , {
131
+ explain : true ,
132
+ } ) ;
133
+ let { queryPlanner } = result [ 0 ] . stages [ 0 ] . $cursor ;
134
+ expect ( queryPlanner . winningPlan . queryPlan . stage ) . toBe ( 'PROJECTION_SIMPLE' ) ;
135
+ expect ( queryPlanner . winningPlan . queryPlan . inputStage . stage ) . toBe ( 'COLLSCAN' ) ;
136
+ expect ( queryPlanner . winningPlan . queryPlan . inputStage . inputStage ) . toBeUndefined ( ) ;
137
+
138
+ result = await collection . aggregate ( [ { $group : { _id : '$foo' } } ] , {
139
+ hint : '_id_' ,
140
+ explain : true ,
141
+ } ) ;
142
+ queryPlanner = result [ 0 ] . stages [ 0 ] . $cursor . queryPlanner ;
143
+ expect ( queryPlanner . winningPlan . queryPlan . stage ) . toBe ( 'PROJECTION_SIMPLE' ) ;
144
+ expect ( queryPlanner . winningPlan . queryPlan . inputStage . stage ) . toBe ( 'FETCH' ) ;
145
+ expect ( queryPlanner . winningPlan . queryPlan . inputStage . inputStage . stage ) . toBe ( 'IXSCAN' ) ;
146
+ expect ( queryPlanner . winningPlan . queryPlan . inputStage . inputStage . indexName ) . toBe ( '_id_' ) ;
147
+ } ) ;
148
+
100
149
it_only_mongodb_version ( '<4.4' ) ( 'query aggregate with hint object' , async ( ) => {
101
150
const object = new TestObject ( { foo : 'bar' } ) ;
102
151
await object . save ( ) ;
@@ -117,7 +166,7 @@ describe_only_db('mongo')('Parse.Query hint', () => {
117
166
expect ( queryPlanner . winningPlan . inputStage . keyPattern ) . toEqual ( { _id : 1 } ) ;
118
167
} ) ;
119
168
120
- it_only_mongodb_version ( '>=4.4' ) ( 'query aggregate with hint object' , async ( ) => {
169
+ it_only_mongodb_version ( '>=4.4<5.1 ' ) ( 'query aggregate with hint object' , async ( ) => {
121
170
const object = new TestObject ( { foo : 'bar' } ) ;
122
171
await object . save ( ) ;
123
172
@@ -142,7 +191,32 @@ describe_only_db('mongo')('Parse.Query hint', () => {
142
191
expect ( queryPlanner . winningPlan . inputStage . inputStage . keyPattern ) . toEqual ( { _id : 1 } ) ;
143
192
} ) ;
144
193
145
- it ( 'query find with hint (rest)' , async ( ) => {
194
+ it_only_mongodb_version ( '>=5.1' ) ( 'query aggregate with hint object' , async ( ) => {
195
+ const object = new TestObject ( { foo : 'bar' } ) ;
196
+ await object . save ( ) ;
197
+
198
+ const collection = await config . database . adapter . _adaptiveCollection ( 'TestObject' ) ;
199
+ let result = await collection . aggregate ( [ { $group : { _id : '$foo' } } ] , {
200
+ explain : true ,
201
+ } ) ;
202
+ let { queryPlanner } = result [ 0 ] . stages [ 0 ] . $cursor ;
203
+ expect ( queryPlanner . winningPlan . queryPlan . stage ) . toBe ( 'PROJECTION_SIMPLE' ) ;
204
+ expect ( queryPlanner . winningPlan . queryPlan . inputStage . stage ) . toBe ( 'COLLSCAN' ) ;
205
+ expect ( queryPlanner . winningPlan . queryPlan . inputStage . inputStage ) . toBeUndefined ( ) ;
206
+
207
+ result = await collection . aggregate ( [ { $group : { _id : '$foo' } } ] , {
208
+ hint : { _id : 1 } ,
209
+ explain : true ,
210
+ } ) ;
211
+ queryPlanner = result [ 0 ] . stages [ 0 ] . $cursor . queryPlanner ;
212
+ expect ( queryPlanner . winningPlan . queryPlan . stage ) . toBe ( 'PROJECTION_SIMPLE' ) ;
213
+ expect ( queryPlanner . winningPlan . queryPlan . inputStage . stage ) . toBe ( 'FETCH' ) ;
214
+ expect ( queryPlanner . winningPlan . queryPlan . inputStage . inputStage . stage ) . toBe ( 'IXSCAN' ) ;
215
+ expect ( queryPlanner . winningPlan . queryPlan . inputStage . inputStage . indexName ) . toBe ( '_id_' ) ;
216
+ expect ( queryPlanner . winningPlan . queryPlan . inputStage . inputStage . keyPattern ) . toEqual ( { _id : 1 } ) ;
217
+ } ) ;
218
+
219
+ it_only_mongodb_version ( '<5.1' ) ( 'query find with hint (rest)' , async ( ) => {
146
220
const object = new TestObject ( ) ;
147
221
await object . save ( ) ;
148
222
let options = Object . assign ( { } , masterKeyOptions , {
@@ -167,6 +241,31 @@ describe_only_db('mongo')('Parse.Query hint', () => {
167
241
expect ( explain . queryPlanner . winningPlan . inputStage . inputStage . indexName ) . toBe ( '_id_' ) ;
168
242
} ) ;
169
243
244
+ it_only_mongodb_version ( '>=5.1' ) ( 'query find with hint (rest)' , async ( ) => {
245
+ const object = new TestObject ( ) ;
246
+ await object . save ( ) ;
247
+ let options = Object . assign ( { } , masterKeyOptions , {
248
+ url : Parse . serverURL + '/classes/TestObject' ,
249
+ qs : {
250
+ explain : true ,
251
+ } ,
252
+ } ) ;
253
+ let response = await request ( options ) ;
254
+ let explain = response . data . results ;
255
+ expect ( explain . queryPlanner . winningPlan . queryPlan . inputStage . stage ) . toBe ( 'COLLSCAN' ) ;
256
+
257
+ options = Object . assign ( { } , masterKeyOptions , {
258
+ url : Parse . serverURL + '/classes/TestObject' ,
259
+ qs : {
260
+ explain : true ,
261
+ hint : '_id_' ,
262
+ } ,
263
+ } ) ;
264
+ response = await request ( options ) ;
265
+ explain = response . data . results ;
266
+ expect ( explain . queryPlanner . winningPlan . queryPlan . inputStage . inputStage . indexName ) . toBe ( '_id_' ) ;
267
+ } ) ;
268
+
170
269
it_only_mongodb_version ( '<4.4' ) ( 'query aggregate with hint (rest)' , async ( ) => {
171
270
const object = new TestObject ( { foo : 'bar' } ) ;
172
271
await object . save ( ) ;
@@ -194,7 +293,7 @@ describe_only_db('mongo')('Parse.Query hint', () => {
194
293
expect ( queryPlanner . winningPlan . inputStage . keyPattern ) . toEqual ( { _id : 1 } ) ;
195
294
} ) ;
196
295
197
- it_only_mongodb_version ( '>=4.4' ) ( 'query aggregate with hint (rest)' , async ( ) => {
296
+ it_only_mongodb_version ( '>=4.4<5.1 ' ) ( 'query aggregate with hint (rest)' , async ( ) => {
198
297
const object = new TestObject ( { foo : 'bar' } ) ;
199
298
await object . save ( ) ;
200
299
let options = Object . assign ( { } , masterKeyOptions , {
@@ -226,4 +325,37 @@ describe_only_db('mongo')('Parse.Query hint', () => {
226
325
expect ( queryPlanner . winningPlan . inputStage . inputStage . indexName ) . toBe ( '_id_' ) ;
227
326
expect ( queryPlanner . winningPlan . inputStage . inputStage . keyPattern ) . toEqual ( { _id : 1 } ) ;
228
327
} ) ;
328
+
329
+ it_only_mongodb_version ( '>=5.1' ) ( 'query aggregate with hint (rest)' , async ( ) => {
330
+ const object = new TestObject ( { foo : 'bar' } ) ;
331
+ await object . save ( ) ;
332
+ let options = Object . assign ( { } , masterKeyOptions , {
333
+ url : Parse . serverURL + '/aggregate/TestObject' ,
334
+ qs : {
335
+ explain : true ,
336
+ group : JSON . stringify ( { objectId : '$foo' } ) ,
337
+ } ,
338
+ } ) ;
339
+ let response = await request ( options ) ;
340
+ let { queryPlanner } = response . data . results [ 0 ] . stages [ 0 ] . $cursor ;
341
+ expect ( queryPlanner . winningPlan . queryPlan . stage ) . toBe ( 'PROJECTION_SIMPLE' ) ;
342
+ expect ( queryPlanner . winningPlan . queryPlan . inputStage . stage ) . toBe ( 'COLLSCAN' ) ;
343
+ expect ( queryPlanner . winningPlan . queryPlan . inputStage . inputStage ) . toBeUndefined ( ) ;
344
+
345
+ options = Object . assign ( { } , masterKeyOptions , {
346
+ url : Parse . serverURL + '/aggregate/TestObject' ,
347
+ qs : {
348
+ explain : true ,
349
+ hint : '_id_' ,
350
+ group : JSON . stringify ( { objectId : '$foo' } ) ,
351
+ } ,
352
+ } ) ;
353
+ response = await request ( options ) ;
354
+ queryPlanner = response . data . results [ 0 ] . stages [ 0 ] . $cursor . queryPlanner ;
355
+ expect ( queryPlanner . winningPlan . queryPlan . stage ) . toBe ( 'PROJECTION_SIMPLE' ) ;
356
+ expect ( queryPlanner . winningPlan . queryPlan . inputStage . stage ) . toBe ( 'FETCH' ) ;
357
+ expect ( queryPlanner . winningPlan . queryPlan . inputStage . inputStage . stage ) . toBe ( 'IXSCAN' ) ;
358
+ expect ( queryPlanner . winningPlan . queryPlan . inputStage . inputStage . indexName ) . toBe ( '_id_' ) ;
359
+ expect ( queryPlanner . winningPlan . queryPlan . inputStage . inputStage . keyPattern ) . toEqual ( { _id : 1 } ) ;
360
+ } ) ;
229
361
} ) ;
0 commit comments