Skip to content

Commit 5f66c6a

Browse files
authored
fix: Parse.Query.distinct fails due to invalid aggregate stage 'hint' (#9295)
1 parent 5e1546e commit 5f66c6a

File tree

2 files changed

+41
-8
lines changed

2 files changed

+41
-8
lines changed

spec/ParseQuery.spec.js

+31
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,8 @@
66

77
const Parse = require('parse/node');
88
const request = require('../lib/request');
9+
const ParseServerRESTController = require('../lib/ParseServerRESTController').ParseServerRESTController;
10+
const ParseServer = require('../lib/ParseServer').default;
911

1012
const masterKeyHeaders = {
1113
'X-Parse-Application-Id': 'test',
@@ -5275,4 +5277,33 @@ describe('Parse.Query testing', () => {
52755277
// Validate
52765278
expect(result.executionStats).not.toBeUndefined();
52775279
});
5280+
5281+
it('should query with distinct within eachBatch and direct access enabled', async () => {
5282+
await reconfigureServer({
5283+
directAccess: true,
5284+
});
5285+
5286+
Parse.CoreManager.setRESTController(
5287+
ParseServerRESTController(Parse.applicationId, ParseServer.promiseRouter({ appId: Parse.applicationId }))
5288+
);
5289+
5290+
const user = new Parse.User();
5291+
user.set('username', 'foo');
5292+
user.set('password', 'bar');
5293+
await user.save();
5294+
5295+
const score = new Parse.Object('Score');
5296+
score.set('player', user);
5297+
score.set('score', 1);
5298+
await score.save();
5299+
5300+
await new Parse.Query('_User')
5301+
.equalTo('objectId', user.id)
5302+
.eachBatch(async ([user]) => {
5303+
const score = await new Parse.Query('Score')
5304+
.equalTo('player', user)
5305+
.distinct('score', { useMasterKey: true });
5306+
expect(score).toEqual([1]);
5307+
}, { useMasterKey: true });
5308+
});
52785309
});

src/Routers/AggregateRouter.js

+10-8
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
1-
import ClassesRouter from './ClassesRouter';
2-
import rest from '../rest';
3-
import * as middleware from '../middlewares';
41
import Parse from 'parse/node';
2+
import * as middleware from '../middlewares';
3+
import rest from '../rest';
4+
import ClassesRouter from './ClassesRouter';
55
import UsersRouter from './UsersRouter';
66

77
export class AggregateRouter extends ClassesRouter {
@@ -52,7 +52,7 @@ export class AggregateRouter extends ClassesRouter {
5252
}
5353

5454
/* Builds a pipeline from the body. Originally the body could be passed as a single object,
55-
* and now we support many options
55+
* and now we support many options.
5656
*
5757
* Array
5858
*
@@ -71,17 +71,19 @@ export class AggregateRouter extends ClassesRouter {
7171
*
7272
* body: {
7373
* pipeline: {
74-
* group: { objectId: '$name' },
74+
* $group: { objectId: '$name' },
7575
* }
7676
* }
7777
*
7878
*/
7979
static getPipeline(body) {
8080
let pipeline = body.pipeline || body;
8181
if (!Array.isArray(pipeline)) {
82-
pipeline = Object.keys(pipeline).map(key => {
83-
return { [key]: pipeline[key] };
84-
});
82+
pipeline = Object.keys(pipeline)
83+
.filter(key => pipeline[key] !== undefined)
84+
.map(key => {
85+
return { [key]: pipeline[key] };
86+
});
8587
}
8688

8789
return pipeline.map(stage => {

0 commit comments

Comments
 (0)