From 00799fdeae0e9dc4208a661dabb8533e73073c72 Mon Sep 17 00:00:00 2001 From: Mohammad Ali Date: Wed, 4 Sep 2024 19:08:59 +0300 Subject: [PATCH 01/10] Add failing distinct query test to address issue #8804. --- spec/ParseQuery.spec.js | 25 +++++++++++++++++++++++++ spec/helper.js | 2 +- 2 files changed, 26 insertions(+), 1 deletion(-) diff --git a/spec/ParseQuery.spec.js b/spec/ParseQuery.spec.js index 6020e2be7d..2f4b4d8ff7 100644 --- a/spec/ParseQuery.spec.js +++ b/spec/ParseQuery.spec.js @@ -5275,4 +5275,29 @@ describe('Parse.Query testing', () => { // Validate expect(result.executionStats).not.toBeUndefined(); }); + + it('Query fails when wrapped within eachBatch and direct access is set to true', async () => { + await reconfigureServer({ + directAccess: true, + }); + + 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/spec/helper.js b/spec/helper.js index c09a0c4eb4..78fc51304f 100644 --- a/spec/helper.js +++ b/spec/helper.js @@ -187,7 +187,7 @@ const reconfigureServer = async (changedConfiguration = {}) => { }); cache.clear(); parseServer = await ParseServer.startApp(newConfiguration); - Parse.CoreManager.setRESTController(RESTController); + // Parse.CoreManager.setRESTController(RESTController); parseServer.expressApp.use('/1', err => { console.error(err); fail('should not call next'); From faf9ece8d653fcbeb29adeefdb1c2889a3e8d3f2 Mon Sep 17 00:00:00 2001 From: Mohammad Ali Date: Thu, 5 Sep 2024 12:32:30 +0300 Subject: [PATCH 02/10] Remove spec/helper.js:190 commented code. --- spec/helper.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/spec/helper.js b/spec/helper.js index 78fc51304f..c09a0c4eb4 100644 --- a/spec/helper.js +++ b/spec/helper.js @@ -187,7 +187,7 @@ const reconfigureServer = async (changedConfiguration = {}) => { }); cache.clear(); parseServer = await ParseServer.startApp(newConfiguration); - // Parse.CoreManager.setRESTController(RESTController); + Parse.CoreManager.setRESTController(RESTController); parseServer.expressApp.use('/1', err => { console.error(err); fail('should not call next'); From a6bf246b5b809b06360acc3f85734ba2c26dd1eb Mon Sep 17 00:00:00 2001 From: Mohammad Ali Date: Thu, 5 Sep 2024 12:33:46 +0300 Subject: [PATCH 03/10] Update test rest controller. --- spec/ParseQuery.spec.js | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/spec/ParseQuery.spec.js b/spec/ParseQuery.spec.js index 2f4b4d8ff7..43645ed746 100644 --- a/spec/ParseQuery.spec.js +++ b/spec/ParseQuery.spec.js @@ -6,6 +6,9 @@ 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', @@ -5281,6 +5284,10 @@ describe('Parse.Query testing', () => { 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'); From 3c100a5b08fc8878a62e9cee65590c4141171849 Mon Sep 17 00:00:00 2001 From: Manuel Trezza <5673677+mtrezza@users.noreply.github.com> Date: Mon, 14 Oct 2024 17:29:51 +0200 Subject: [PATCH 04/10] fix --- src/Routers/AggregateRouter.js | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/src/Routers/AggregateRouter.js b/src/Routers/AggregateRouter.js index f8bca7fd65..cc85418fcb 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' }, * } * } * @@ -80,7 +80,7 @@ export class AggregateRouter extends ClassesRouter { let pipeline = body.pipeline || body; if (!Array.isArray(pipeline)) { pipeline = Object.keys(pipeline).map(key => { - return { [key]: pipeline[key] }; + return { [`$${key}`]: pipeline[key] }; }); } From c88318d9450e080c1709719f767d54a19ed319aa Mon Sep 17 00:00:00 2001 From: Manuel Trezza <5673677+mtrezza@users.noreply.github.com> Date: Mon, 14 Oct 2024 17:31:16 +0200 Subject: [PATCH 05/10] rename test --- spec/ParseQuery.spec.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/spec/ParseQuery.spec.js b/spec/ParseQuery.spec.js index 43645ed746..d42a0d02f5 100644 --- a/spec/ParseQuery.spec.js +++ b/spec/ParseQuery.spec.js @@ -5279,7 +5279,7 @@ describe('Parse.Query testing', () => { expect(result.executionStats).not.toBeUndefined(); }); - it('Query fails when wrapped within eachBatch and direct access is set to true', async () => { + it('should query with distinct within eachBatch and direct access enabled', async () => { await reconfigureServer({ directAccess: true, }); From 20e0b8471ac91f770b9c20554b4844b23e015573 Mon Sep 17 00:00:00 2001 From: Manuel Trezza <5673677+mtrezza@users.noreply.github.com> Date: Mon, 14 Oct 2024 17:32:25 +0200 Subject: [PATCH 06/10] refactor require --- spec/ParseQuery.spec.js | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/spec/ParseQuery.spec.js b/spec/ParseQuery.spec.js index d42a0d02f5..e6f3b1e08a 100644 --- a/spec/ParseQuery.spec.js +++ b/spec/ParseQuery.spec.js @@ -6,8 +6,7 @@ const Parse = require('parse/node'); const request = require('../lib/request'); -const ParseServerRESTController = require('../lib/ParseServerRESTController') - .ParseServerRESTController; +const ParseServerRESTController = require('../lib/ParseServerRESTController').ParseServerRESTController; const ParseServer = require('../lib/ParseServer').default; const masterKeyHeaders = { From 580faac708edd3d0aa432b555d5165d169a74c01 Mon Sep 17 00:00:00 2001 From: Manuel Trezza <5673677+mtrezza@users.noreply.github.com> Date: Mon, 14 Oct 2024 18:09:33 +0200 Subject: [PATCH 07/10] revert --- src/Routers/AggregateRouter.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Routers/AggregateRouter.js b/src/Routers/AggregateRouter.js index cc85418fcb..45acdb7fdd 100644 --- a/src/Routers/AggregateRouter.js +++ b/src/Routers/AggregateRouter.js @@ -80,7 +80,7 @@ export class AggregateRouter extends ClassesRouter { let pipeline = body.pipeline || body; if (!Array.isArray(pipeline)) { pipeline = Object.keys(pipeline).map(key => { - return { [`$${key}`]: pipeline[key] }; + return { [key]: pipeline[key] }; }); } From e155167b2f59bef2e7b5b9094aad612b8a8ae323 Mon Sep 17 00:00:00 2001 From: Mohammad Ali Date: Tue, 15 Oct 2024 19:41:17 +0300 Subject: [PATCH 08/10] Handle AggregateRouter falsy body values. --- src/Routers/AggregateRouter.js | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/src/Routers/AggregateRouter.js b/src/Routers/AggregateRouter.js index 45acdb7fdd..0d69499805 100644 --- a/src/Routers/AggregateRouter.js +++ b/src/Routers/AggregateRouter.js @@ -11,20 +11,20 @@ export class AggregateRouter extends ClassesRouter { if (body.distinct) { options.distinct = String(body.distinct); } - if (body.hint) { - options.hint = body.hint; + if (Object.prototype.hasOwnProperty.call(body, 'hint')) { + if (body.hint) options.hint = body.hint; delete body.hint; } - if (body.explain) { - options.explain = body.explain; + if (Object.prototype.hasOwnProperty.call(body, 'explain')) { + if (body.explain) options.explain = body.explain; delete body.explain; } - if (body.comment) { - options.comment = body.comment; + if (Object.prototype.hasOwnProperty.call(body, 'comment')) { + if (body.comment) options.comment = body.comment; delete body.comment; } - if (body.readPreference) { - options.readPreference = body.readPreference; + if (Object.prototype.hasOwnProperty.call(body, 'readPreference')) { + if (body.readPreference) options.readPreference = body.readPreference; delete body.readPreference; } options.pipeline = AggregateRouter.getPipeline(body); From 9183e8e8a37a02dcb38db106225fa195c86adde6 Mon Sep 17 00:00:00 2001 From: Mohammad Ali Date: Thu, 17 Oct 2024 13:54:26 +0300 Subject: [PATCH 09/10] Revert "Handle AggregateRouter falsy body values." This reverts commit e155167b2f59bef2e7b5b9094aad612b8a8ae323. --- src/Routers/AggregateRouter.js | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/src/Routers/AggregateRouter.js b/src/Routers/AggregateRouter.js index 0d69499805..45acdb7fdd 100644 --- a/src/Routers/AggregateRouter.js +++ b/src/Routers/AggregateRouter.js @@ -11,20 +11,20 @@ export class AggregateRouter extends ClassesRouter { if (body.distinct) { options.distinct = String(body.distinct); } - if (Object.prototype.hasOwnProperty.call(body, 'hint')) { - if (body.hint) options.hint = body.hint; + if (body.hint) { + options.hint = body.hint; delete body.hint; } - if (Object.prototype.hasOwnProperty.call(body, 'explain')) { - if (body.explain) options.explain = body.explain; + if (body.explain) { + options.explain = body.explain; delete body.explain; } - if (Object.prototype.hasOwnProperty.call(body, 'comment')) { - if (body.comment) options.comment = body.comment; + if (body.comment) { + options.comment = body.comment; delete body.comment; } - if (Object.prototype.hasOwnProperty.call(body, 'readPreference')) { - if (body.readPreference) options.readPreference = body.readPreference; + if (body.readPreference) { + options.readPreference = body.readPreference; delete body.readPreference; } options.pipeline = AggregateRouter.getPipeline(body); From 3daefbc576085efe9f281aa8e02ef8ba42f79b3e Mon Sep 17 00:00:00 2001 From: Mohammad Ali Date: Thu, 17 Oct 2024 13:57:03 +0300 Subject: [PATCH 10/10] Ignore AggregateRouter undefined pipline operators. --- src/Routers/AggregateRouter.js | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/src/Routers/AggregateRouter.js b/src/Routers/AggregateRouter.js index 45acdb7fdd..f649947be4 100644 --- a/src/Routers/AggregateRouter.js +++ b/src/Routers/AggregateRouter.js @@ -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 => {