@@ -27,7 +27,7 @@ describe_only_db('mongo')('Parse.Query hint', () => {
2727 await TestUtils . destroyAllDataPermanently ( false ) ;
2828 } ) ;
2929
30- it ( 'query find with hint string' , async ( ) => {
30+ it_only_mongodb_version ( '<5.1' ) ( 'query find with hint string' , async ( ) => {
3131 const object = new TestObject ( ) ;
3232 await object . save ( ) ;
3333
@@ -39,7 +39,18 @@ describe_only_db('mongo')('Parse.Query hint', () => {
3939 expect ( explain . queryPlanner . winningPlan . inputStage . indexName ) . toBe ( '_id_' ) ;
4040 } ) ;
4141
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 ( ) => {
4354 const object = new TestObject ( ) ;
4455 await object . save ( ) ;
4556
@@ -53,6 +64,20 @@ describe_only_db('mongo')('Parse.Query hint', () => {
5364 } ) ;
5465 } ) ;
5566
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+
5681 it_only_mongodb_version ( '<4.4' ) ( 'query aggregate with hint string' , async ( ) => {
5782 const object = new TestObject ( { foo : 'bar' } ) ;
5883 await object . save ( ) ;
@@ -73,7 +98,7 @@ describe_only_db('mongo')('Parse.Query hint', () => {
7398 expect ( queryPlanner . winningPlan . inputStage . indexName ) . toBe ( '_id_' ) ;
7499 } ) ;
75100
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 ( ) => {
77102 const object = new TestObject ( { foo : 'bar' } ) ;
78103 await object . save ( ) ;
79104
@@ -97,6 +122,30 @@ describe_only_db('mongo')('Parse.Query hint', () => {
97122 expect ( queryPlanner . winningPlan . inputStage . inputStage . indexName ) . toBe ( '_id_' ) ;
98123 } ) ;
99124
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+
100149 it_only_mongodb_version ( '<4.4' ) ( 'query aggregate with hint object' , async ( ) => {
101150 const object = new TestObject ( { foo : 'bar' } ) ;
102151 await object . save ( ) ;
@@ -117,7 +166,7 @@ describe_only_db('mongo')('Parse.Query hint', () => {
117166 expect ( queryPlanner . winningPlan . inputStage . keyPattern ) . toEqual ( { _id : 1 } ) ;
118167 } ) ;
119168
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 ( ) => {
121170 const object = new TestObject ( { foo : 'bar' } ) ;
122171 await object . save ( ) ;
123172
@@ -142,7 +191,32 @@ describe_only_db('mongo')('Parse.Query hint', () => {
142191 expect ( queryPlanner . winningPlan . inputStage . inputStage . keyPattern ) . toEqual ( { _id : 1 } ) ;
143192 } ) ;
144193
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 ( ) => {
146220 const object = new TestObject ( ) ;
147221 await object . save ( ) ;
148222 let options = Object . assign ( { } , masterKeyOptions , {
@@ -167,6 +241,31 @@ describe_only_db('mongo')('Parse.Query hint', () => {
167241 expect ( explain . queryPlanner . winningPlan . inputStage . inputStage . indexName ) . toBe ( '_id_' ) ;
168242 } ) ;
169243
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+
170269 it_only_mongodb_version ( '<4.4' ) ( 'query aggregate with hint (rest)' , async ( ) => {
171270 const object = new TestObject ( { foo : 'bar' } ) ;
172271 await object . save ( ) ;
@@ -194,7 +293,7 @@ describe_only_db('mongo')('Parse.Query hint', () => {
194293 expect ( queryPlanner . winningPlan . inputStage . keyPattern ) . toEqual ( { _id : 1 } ) ;
195294 } ) ;
196295
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 ( ) => {
198297 const object = new TestObject ( { foo : 'bar' } ) ;
199298 await object . save ( ) ;
200299 let options = Object . assign ( { } , masterKeyOptions , {
@@ -226,4 +325,37 @@ describe_only_db('mongo')('Parse.Query hint', () => {
226325 expect ( queryPlanner . winningPlan . inputStage . inputStage . indexName ) . toBe ( '_id_' ) ;
227326 expect ( queryPlanner . winningPlan . inputStage . inputStage . keyPattern ) . toEqual ( { _id : 1 } ) ;
228327 } ) ;
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+ } ) ;
229361} ) ;
0 commit comments