diff --git a/spec/ParseQuery.spec.js b/spec/ParseQuery.spec.js index 6020e2be7d..e6f3b1e08a 100644 --- a/spec/ParseQuery.spec.js +++ b/spec/ParseQuery.spec.js @@ -6,6 +6,8 @@ const Parse = require('parse/node'); const request = require('../lib/request'); +const ParseServerRESTController = require('../lib/ParseServerRESTController').ParseServerRESTController; +const ParseServer = require('../lib/ParseServer').default; const masterKeyHeaders = { 'X-Parse-Application-Id': 'test', @@ -5275,4 +5277,33 @@ describe('Parse.Query testing', () => { // Validate expect(result.executionStats).not.toBeUndefined(); }); + + it('should query with distinct within eachBatch and direct access enabled', async () => { + await reconfigureServer({ + directAccess: true, + }); + + Parse.CoreManager.setRESTController( + ParseServerRESTController(Parse.applicationId, ParseServer.promiseRouter({ appId: Parse.applicationId })) + ); + + const user = new Parse.User(); + user.set('username', 'foo'); + user.set('password', 'bar'); + await user.save(); + + const score = new Parse.Object('Score'); + score.set('player', user); + score.set('score', 1); + await score.save(); + + await new Parse.Query('_User') + .equalTo('objectId', user.id) + .eachBatch(async ([user]) => { + const score = await new Parse.Query('Score') + .equalTo('player', user) + .distinct('score', { useMasterKey: true }); + expect(score).toEqual([1]); + }, { useMasterKey: true }); + }); }); diff --git a/src/Routers/AggregateRouter.js b/src/Routers/AggregateRouter.js index f8bca7fd65..f649947be4 100644 --- a/src/Routers/AggregateRouter.js +++ b/src/Routers/AggregateRouter.js @@ -1,7 +1,7 @@ -import ClassesRouter from './ClassesRouter'; -import rest from '../rest'; -import * as middleware from '../middlewares'; import Parse from 'parse/node'; +import * as middleware from '../middlewares'; +import rest from '../rest'; +import ClassesRouter from './ClassesRouter'; import UsersRouter from './UsersRouter'; export class AggregateRouter extends ClassesRouter { @@ -52,7 +52,7 @@ export class AggregateRouter extends ClassesRouter { } /* Builds a pipeline from the body. Originally the body could be passed as a single object, - * and now we support many options + * and now we support many options. * * Array * @@ -71,7 +71,7 @@ export class AggregateRouter extends ClassesRouter { * * body: { * pipeline: { - * group: { objectId: '$name' }, + * $group: { objectId: '$name' }, * } * } * @@ -79,9 +79,11 @@ export class AggregateRouter extends ClassesRouter { static getPipeline(body) { let pipeline = body.pipeline || body; if (!Array.isArray(pipeline)) { - pipeline = Object.keys(pipeline).map(key => { - return { [key]: pipeline[key] }; - }); + pipeline = Object.keys(pipeline) + .filter(key => pipeline[key] !== undefined) + .map(key => { + return { [key]: pipeline[key] }; + }); } return pipeline.map(stage => {