@@ -122,7 +122,7 @@ describe_only_db('mongo')('Parse.Query hint', () => {
122
122
expect ( queryPlanner . winningPlan . inputStage . inputStage . indexName ) . toBe ( '_id_' ) ;
123
123
} ) ;
124
124
125
- it_only_mongodb_version ( '>=5.1' ) ( 'query aggregate with hint string' , async ( ) => {
125
+ it_only_mongodb_version ( '>=5.1<5.2 ' ) ( 'query aggregate with hint string' , async ( ) => {
126
126
const object = new TestObject ( { foo : 'bar' } ) ;
127
127
await object . save ( ) ;
128
128
@@ -146,6 +146,30 @@ describe_only_db('mongo')('Parse.Query hint', () => {
146
146
expect ( queryPlanner . winningPlan . queryPlan . inputStage . inputStage . indexName ) . toBe ( '_id_' ) ;
147
147
} ) ;
148
148
149
+ it_only_mongodb_version ( '>=5.2' ) ( 'query aggregate with hint string' , async ( ) => {
150
+ const object = new TestObject ( { foo : 'bar' } ) ;
151
+ await object . save ( ) ;
152
+
153
+ const collection = await config . database . adapter . _adaptiveCollection ( 'TestObject' ) ;
154
+ let result = await collection . aggregate ( [ { $group : { _id : '$foo' } } ] , {
155
+ explain : true ,
156
+ } ) ;
157
+ let queryPlanner = result [ 0 ] . queryPlanner ;
158
+ expect ( queryPlanner . winningPlan . queryPlan . stage ) . toBe ( 'GROUP' ) ;
159
+ expect ( queryPlanner . winningPlan . queryPlan . inputStage . stage ) . toBe ( 'COLLSCAN' ) ;
160
+ expect ( queryPlanner . winningPlan . queryPlan . inputStage . inputStage ) . toBeUndefined ( ) ;
161
+
162
+ result = await collection . aggregate ( [ { $group : { _id : '$foo' } } ] , {
163
+ hint : '_id_' ,
164
+ explain : true ,
165
+ } ) ;
166
+ queryPlanner = result [ 0 ] . queryPlanner ;
167
+ expect ( queryPlanner . winningPlan . queryPlan . stage ) . toBe ( 'GROUP' ) ;
168
+ expect ( queryPlanner . winningPlan . queryPlan . inputStage . stage ) . toBe ( 'FETCH' ) ;
169
+ expect ( queryPlanner . winningPlan . queryPlan . inputStage . inputStage . stage ) . toBe ( 'IXSCAN' ) ;
170
+ expect ( queryPlanner . winningPlan . queryPlan . inputStage . inputStage . indexName ) . toBe ( '_id_' ) ;
171
+ } ) ;
172
+
149
173
it_only_mongodb_version ( '<4.4' ) ( 'query aggregate with hint object' , async ( ) => {
150
174
const object = new TestObject ( { foo : 'bar' } ) ;
151
175
await object . save ( ) ;
@@ -191,7 +215,7 @@ describe_only_db('mongo')('Parse.Query hint', () => {
191
215
expect ( queryPlanner . winningPlan . inputStage . inputStage . keyPattern ) . toEqual ( { _id : 1 } ) ;
192
216
} ) ;
193
217
194
- it_only_mongodb_version ( '>=5.1' ) ( 'query aggregate with hint object' , async ( ) => {
218
+ it_only_mongodb_version ( '>=5.1<5.2 ' ) ( 'query aggregate with hint object' , async ( ) => {
195
219
const object = new TestObject ( { foo : 'bar' } ) ;
196
220
await object . save ( ) ;
197
221
@@ -216,6 +240,31 @@ describe_only_db('mongo')('Parse.Query hint', () => {
216
240
expect ( queryPlanner . winningPlan . queryPlan . inputStage . inputStage . keyPattern ) . toEqual ( { _id : 1 } ) ;
217
241
} ) ;
218
242
243
+ it_only_mongodb_version ( '>=5.2' ) ( 'query aggregate with hint object' , async ( ) => {
244
+ const object = new TestObject ( { foo : 'bar' } ) ;
245
+ await object . save ( ) ;
246
+
247
+ const collection = await config . database . adapter . _adaptiveCollection ( 'TestObject' ) ;
248
+ let result = await collection . aggregate ( [ { $group : { _id : '$foo' } } ] , {
249
+ explain : true ,
250
+ } ) ;
251
+ let queryPlanner = result [ 0 ] . queryPlanner ;
252
+ expect ( queryPlanner . winningPlan . queryPlan . stage ) . toBe ( 'GROUP' ) ;
253
+ expect ( queryPlanner . winningPlan . queryPlan . inputStage . stage ) . toBe ( 'COLLSCAN' ) ;
254
+ expect ( queryPlanner . winningPlan . queryPlan . inputStage . inputStage ) . toBeUndefined ( ) ;
255
+
256
+ result = await collection . aggregate ( [ { $group : { _id : '$foo' } } ] , {
257
+ hint : { _id : 1 } ,
258
+ explain : true ,
259
+ } ) ;
260
+ queryPlanner = result [ 0 ] . queryPlanner ;
261
+ expect ( queryPlanner . winningPlan . queryPlan . stage ) . toBe ( 'GROUP' ) ;
262
+ expect ( queryPlanner . winningPlan . queryPlan . inputStage . stage ) . toBe ( 'FETCH' ) ;
263
+ expect ( queryPlanner . winningPlan . queryPlan . inputStage . inputStage . stage ) . toBe ( 'IXSCAN' ) ;
264
+ expect ( queryPlanner . winningPlan . queryPlan . inputStage . inputStage . indexName ) . toBe ( '_id_' ) ;
265
+ expect ( queryPlanner . winningPlan . queryPlan . inputStage . inputStage . keyPattern ) . toEqual ( { _id : 1 } ) ;
266
+ } ) ;
267
+
219
268
it_only_mongodb_version ( '<5.1' ) ( 'query find with hint (rest)' , async ( ) => {
220
269
const object = new TestObject ( ) ;
221
270
await object . save ( ) ;
@@ -326,7 +375,7 @@ describe_only_db('mongo')('Parse.Query hint', () => {
326
375
expect ( queryPlanner . winningPlan . inputStage . inputStage . keyPattern ) . toEqual ( { _id : 1 } ) ;
327
376
} ) ;
328
377
329
- it_only_mongodb_version ( '>=5.1' ) ( 'query aggregate with hint (rest)' , async ( ) => {
378
+ it_only_mongodb_version ( '>=5.1<5.2 ' ) ( 'query aggregate with hint (rest)' , async ( ) => {
330
379
const object = new TestObject ( { foo : 'bar' } ) ;
331
380
await object . save ( ) ;
332
381
let options = Object . assign ( { } , masterKeyOptions , {
@@ -358,4 +407,37 @@ describe_only_db('mongo')('Parse.Query hint', () => {
358
407
expect ( queryPlanner . winningPlan . queryPlan . inputStage . inputStage . indexName ) . toBe ( '_id_' ) ;
359
408
expect ( queryPlanner . winningPlan . queryPlan . inputStage . inputStage . keyPattern ) . toEqual ( { _id : 1 } ) ;
360
409
} ) ;
410
+
411
+ it_only_mongodb_version ( '>=5.2' ) ( 'query aggregate with hint (rest)' , async ( ) => {
412
+ const object = new TestObject ( { foo : 'bar' } ) ;
413
+ await object . save ( ) ;
414
+ let options = Object . assign ( { } , masterKeyOptions , {
415
+ url : Parse . serverURL + '/aggregate/TestObject' ,
416
+ qs : {
417
+ explain : true ,
418
+ group : JSON . stringify ( { objectId : '$foo' } ) ,
419
+ } ,
420
+ } ) ;
421
+ let response = await request ( options ) ;
422
+ let queryPlanner = response . data . results [ 0 ] . queryPlanner ;
423
+ expect ( queryPlanner . winningPlan . queryPlan . stage ) . toBe ( 'GROUP' ) ;
424
+ expect ( queryPlanner . winningPlan . queryPlan . inputStage . stage ) . toBe ( 'COLLSCAN' ) ;
425
+ expect ( queryPlanner . winningPlan . queryPlan . inputStage . inputStage ) . toBeUndefined ( ) ;
426
+
427
+ options = Object . assign ( { } , masterKeyOptions , {
428
+ url : Parse . serverURL + '/aggregate/TestObject' ,
429
+ qs : {
430
+ explain : true ,
431
+ hint : '_id_' ,
432
+ group : JSON . stringify ( { objectId : '$foo' } ) ,
433
+ } ,
434
+ } ) ;
435
+ response = await request ( options ) ;
436
+ queryPlanner = response . data . results [ 0 ] . queryPlanner ;
437
+ expect ( queryPlanner . winningPlan . queryPlan . stage ) . toBe ( 'GROUP' ) ;
438
+ expect ( queryPlanner . winningPlan . queryPlan . inputStage . stage ) . toBe ( 'FETCH' ) ;
439
+ expect ( queryPlanner . winningPlan . queryPlan . inputStage . inputStage . stage ) . toBe ( 'IXSCAN' ) ;
440
+ expect ( queryPlanner . winningPlan . queryPlan . inputStage . inputStage . indexName ) . toBe ( '_id_' ) ;
441
+ expect ( queryPlanner . winningPlan . queryPlan . inputStage . inputStage . keyPattern ) . toEqual ( { _id : 1 } ) ;
442
+ } ) ;
361
443
} ) ;
0 commit comments