@@ -124,7 +124,7 @@ describe_only_db('mongo')('Parse.Query hint', () => {
124124 expect ( queryPlanner . winningPlan . inputStage . inputStage . indexName ) . toBe ( '_id_' ) ;
125125 } ) ;
126126
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 ( ) => {
128128 const object = new TestObject ( { foo : 'bar' } ) ;
129129 await object . save ( ) ;
130130
@@ -148,6 +148,30 @@ describe_only_db('mongo')('Parse.Query hint', () => {
148148 expect ( queryPlanner . winningPlan . queryPlan . inputStage . inputStage . indexName ) . toBe ( '_id_' ) ;
149149 } ) ;
150150
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+
151175 it_only_mongodb_version ( '<4.4' ) ( 'query aggregate with hint object' , async ( ) => {
152176 const object = new TestObject ( { foo : 'bar' } ) ;
153177 await object . save ( ) ;
@@ -193,7 +217,7 @@ describe_only_db('mongo')('Parse.Query hint', () => {
193217 expect ( queryPlanner . winningPlan . inputStage . inputStage . keyPattern ) . toEqual ( { _id : 1 } ) ;
194218 } ) ;
195219
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 ( ) => {
197221 const object = new TestObject ( { foo : 'bar' } ) ;
198222 await object . save ( ) ;
199223
@@ -218,6 +242,31 @@ describe_only_db('mongo')('Parse.Query hint', () => {
218242 expect ( queryPlanner . winningPlan . queryPlan . inputStage . inputStage . keyPattern ) . toEqual ( { _id : 1 } ) ;
219243 } ) ;
220244
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+
221270 it_only_mongodb_version ( '<5.1' ) ( 'query find with hint (rest)' , async ( ) => {
222271 const object = new TestObject ( ) ;
223272 await object . save ( ) ;
@@ -328,7 +377,7 @@ describe_only_db('mongo')('Parse.Query hint', () => {
328377 expect ( queryPlanner . winningPlan . inputStage . inputStage . keyPattern ) . toEqual ( { _id : 1 } ) ;
329378 } ) ;
330379
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 ( ) => {
332381 const object = new TestObject ( { foo : 'bar' } ) ;
333382 await object . save ( ) ;
334383 let options = Object . assign ( { } , masterKeyOptions , {
@@ -360,4 +409,37 @@ describe_only_db('mongo')('Parse.Query hint', () => {
360409 expect ( queryPlanner . winningPlan . queryPlan . inputStage . inputStage . indexName ) . toBe ( '_id_' ) ;
361410 expect ( queryPlanner . winningPlan . queryPlan . inputStage . inputStage . keyPattern ) . toEqual ( { _id : 1 } ) ;
362411 } ) ;
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+ } ) ;
363445} ) ;
0 commit comments