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