fix: Parse.Query.distinct fails due to invalid aggregate stage 'hint' (#9295)
This commit is contained in:
@@ -6,6 +6,8 @@
|
|||||||
|
|
||||||
const Parse = require('parse/node');
|
const Parse = require('parse/node');
|
||||||
const request = require('../lib/request');
|
const request = require('../lib/request');
|
||||||
|
const ParseServerRESTController = require('../lib/ParseServerRESTController').ParseServerRESTController;
|
||||||
|
const ParseServer = require('../lib/ParseServer').default;
|
||||||
|
|
||||||
const masterKeyHeaders = {
|
const masterKeyHeaders = {
|
||||||
'X-Parse-Application-Id': 'test',
|
'X-Parse-Application-Id': 'test',
|
||||||
@@ -5275,4 +5277,33 @@ describe('Parse.Query testing', () => {
|
|||||||
// Validate
|
// Validate
|
||||||
expect(result.executionStats).not.toBeUndefined();
|
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 });
|
||||||
|
});
|
||||||
});
|
});
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
import ClassesRouter from './ClassesRouter';
|
|
||||||
import rest from '../rest';
|
|
||||||
import * as middleware from '../middlewares';
|
|
||||||
import Parse from 'parse/node';
|
import Parse from 'parse/node';
|
||||||
|
import * as middleware from '../middlewares';
|
||||||
|
import rest from '../rest';
|
||||||
|
import ClassesRouter from './ClassesRouter';
|
||||||
import UsersRouter from './UsersRouter';
|
import UsersRouter from './UsersRouter';
|
||||||
|
|
||||||
export class AggregateRouter extends ClassesRouter {
|
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,
|
/* 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
|
* Array
|
||||||
*
|
*
|
||||||
@@ -71,7 +71,7 @@ export class AggregateRouter extends ClassesRouter {
|
|||||||
*
|
*
|
||||||
* body: {
|
* body: {
|
||||||
* pipeline: {
|
* pipeline: {
|
||||||
* group: { objectId: '$name' },
|
* $group: { objectId: '$name' },
|
||||||
* }
|
* }
|
||||||
* }
|
* }
|
||||||
*
|
*
|
||||||
@@ -79,9 +79,11 @@ export class AggregateRouter extends ClassesRouter {
|
|||||||
static getPipeline(body) {
|
static getPipeline(body) {
|
||||||
let pipeline = body.pipeline || body;
|
let pipeline = body.pipeline || body;
|
||||||
if (!Array.isArray(pipeline)) {
|
if (!Array.isArray(pipeline)) {
|
||||||
pipeline = Object.keys(pipeline).map(key => {
|
pipeline = Object.keys(pipeline)
|
||||||
return { [key]: pipeline[key] };
|
.filter(key => pipeline[key] !== undefined)
|
||||||
});
|
.map(key => {
|
||||||
|
return { [key]: pipeline[key] };
|
||||||
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
return pipeline.map(stage => {
|
return pipeline.map(stage => {
|
||||||
|
|||||||
Reference in New Issue
Block a user