From 867e161bd7ef815a775b39c21d48cc9fccd5c026 Mon Sep 17 00:00:00 2001 From: Diamond Lewis Date: Thu, 25 Oct 2018 20:43:13 -0500 Subject: [PATCH 1/2] Support Distinct for special fields --- spec/ParseQuery.Aggregate.spec.js | 25 +++++++++++++++++++ .../Storage/Mongo/MongoStorageAdapter.js | 13 +++++----- 2 files changed, 32 insertions(+), 6 deletions(-) diff --git a/spec/ParseQuery.Aggregate.spec.js b/spec/ParseQuery.Aggregate.spec.js index b45aa8e7ef..4330f2dd1b 100644 --- a/spec/ParseQuery.Aggregate.spec.js +++ b/spec/ParseQuery.Aggregate.spec.js @@ -1098,6 +1098,31 @@ describe('Parse.Query Aggregate testing', () => { .catch(done.fail); }); + it('distinct objectId', async () => { + const query = new Parse.Query(TestObject); + const results = await query.distinct('objectId'); + expect(results.length).toBe(4); + }); + + it('distinct createdAt', async () => { + const object1 = new TestObject({ createdAt_test: true }); + await object1.save(); + const object2 = new TestObject({ createdAt_test: true }); + await object2.save(); + const query = new Parse.Query(TestObject); + query.equalTo('createdAt_test', true); + const results = await query.distinct('createdAt'); + expect(results.length).toBe(2); + }); + + it('distinct updatedAt', async () => { + const query = new Parse.Query(TestObject); + const results = await query.distinct('updatedAt'); + + // loadTestData() all have the same updatedAt + expect(results.length).toBe(1); + }); + it('distinct null field', done => { const options = Object.assign({}, masterKeyOptions, { body: { distinct: 'distinctField' }, diff --git a/src/Adapters/Storage/Mongo/MongoStorageAdapter.js b/src/Adapters/Storage/Mongo/MongoStorageAdapter.js index bbf6bb95b8..b0e3351ee9 100644 --- a/src/Adapters/Storage/Mongo/MongoStorageAdapter.js +++ b/src/Adapters/Storage/Mongo/MongoStorageAdapter.js @@ -710,19 +710,20 @@ export class MongoStorageAdapter implements StorageAdapter { schema = convertParseSchemaToMongoSchema(schema); const isPointerField = schema.fields[fieldName] && schema.fields[fieldName].type === 'Pointer'; - if (isPointerField) { - fieldName = `_p_${fieldName}`; - } + const transformField = transformKey(className, fieldName, schema); + return this._adaptiveCollection(className) .then(collection => - collection.distinct(fieldName, transformWhere(className, query, schema)) + collection.distinct( + transformField, + transformWhere(className, query, schema) + ) ) .then(objects => { objects = objects.filter(obj => obj != null); return objects.map(object => { if (isPointerField) { - const field = fieldName.substring(3); - return transformPointerString(schema, field, object); + return transformPointerString(schema, fieldName, object); } return mongoObjectToParseObject(className, object, schema); }); From 8e5e3dda9cc35e502788db2f3d421961319bef6c Mon Sep 17 00:00:00 2001 From: Diamond Lewis Date: Fri, 26 Oct 2018 09:34:16 -0500 Subject: [PATCH 2/2] update changelog --- CHANGELOG.md | 2 +- spec/ParseQuery.Aggregate.spec.js | 11 ++++++++--- 2 files changed, 9 insertions(+), 4 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 67b1e053a8..3bb7fe55c6 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -5,7 +5,7 @@ #### Improvements: * Fixes issue that would prevent users with large number of roles to resolve all of them [@Moumouls]() (#5131, #5132) - +* Fixes distinct query on special fields ([#5144](https://github.com/parse-community/parse-server/pull/5144)) ### 3.1.0 [Full Changelog](https://github.com/parse-community/parse-server/compare/3.0.0...3.1.0) diff --git a/spec/ParseQuery.Aggregate.spec.js b/spec/ParseQuery.Aggregate.spec.js index 4330f2dd1b..40502de696 100644 --- a/spec/ParseQuery.Aggregate.spec.js +++ b/spec/ParseQuery.Aggregate.spec.js @@ -1116,11 +1116,16 @@ describe('Parse.Query Aggregate testing', () => { }); it('distinct updatedAt', async () => { + const object1 = new TestObject({ updatedAt_test: true }); + await object1.save(); + const object2 = new TestObject(); + await object2.save(); + object2.set('updatedAt_test', true); + await object2.save(); const query = new Parse.Query(TestObject); + query.equalTo('updatedAt_test', true); const results = await query.distinct('updatedAt'); - - // loadTestData() all have the same updatedAt - expect(results.length).toBe(1); + expect(results.length).toBe(2); }); it('distinct null field', done => {