From 5aafc93476c72260f0f40616576a3f644bda0166 Mon Sep 17 00:00:00 2001 From: Diamond Lewis Date: Sat, 2 Sep 2017 11:31:19 -0500 Subject: [PATCH] Text Index Support (#4081) * add text index support * additional validation * multiple text index error * rename function * Delete text indexes message --- spec/ParseQuery.FullTextSearch.spec.js | 11 +++----- .../Storage/Mongo/MongoStorageAdapter.js | 25 ++++++++++++++++++- 2 files changed, 28 insertions(+), 8 deletions(-) diff --git a/spec/ParseQuery.FullTextSearch.spec.js b/spec/ParseQuery.FullTextSearch.spec.js index a633df4307..acb67c73f2 100644 --- a/spec/ParseQuery.FullTextSearch.spec.js +++ b/spec/ParseQuery.FullTextSearch.spec.js @@ -42,11 +42,6 @@ const fullTextHelper = () => { restAPIKey: 'test', publicServerURL: 'http://localhost:8378/1', databaseAdapter - }).then(() => { - if (process.env.PARSE_SERVER_TEST_DB === 'postgres') { - return Parse.Promise.as(); - } - return databaseAdapter.createIndex('TestObject', {subject: 'text'}); }).then(() => { return rp.post({ url: 'http://localhost:8378/1/batch', @@ -285,7 +280,7 @@ describe('Parse.Query Full Text Search testing', () => { }); describe_only_db('mongo')('Parse.Query Full Text Search testing', () => { - it('fullTextSearch: $search, index not exist', (done) => { + it('fullTextSearch: $search, only one text index', (done) => { return reconfigureServer({ appId: 'test', restAPIKey: 'test', @@ -318,6 +313,8 @@ describe_only_db('mongo')('Parse.Query Full Text Search testing', () => { 'X-Parse-REST-API-Key': 'test' } }); + }).then(() => { + return databaseAdapter.createIndex('TestObject', {random: 'text'}); }).then(() => { const where = { subject: { @@ -337,7 +334,7 @@ describe_only_db('mongo')('Parse.Query Full Text Search testing', () => { } }); }).then((resp) => { - fail(`Text Index should not exist: ${JSON.stringify(resp)}`); + fail(`Should not be more than one text index: ${JSON.stringify(resp)}`); done(); }).catch((err) => { expect(err.error.code).toEqual(Parse.Error.INTERNAL_SERVER_ERROR); diff --git a/src/Adapters/Storage/Mongo/MongoStorageAdapter.js b/src/Adapters/Storage/Mongo/MongoStorageAdapter.js index b201afdc29..32e3a8db8a 100644 --- a/src/Adapters/Storage/Mongo/MongoStorageAdapter.js +++ b/src/Adapters/Storage/Mongo/MongoStorageAdapter.js @@ -343,8 +343,10 @@ export class MongoStorageAdapter { memo[transformKey(className, key, schema)] = 1; return memo; }, {}); + readPreference = this._parseReadPreference(readPreference); - return this._adaptiveCollection(className) + return this.createTextIndexesIfNeeded(className, query) + .then(() => this._adaptiveCollection(className)) .then(collection => collection.find(mongoWhere, { skip, limit, @@ -441,6 +443,27 @@ export class MongoStorageAdapter { return Promise.resolve(); } + createTextIndexesIfNeeded(className, query) { + for(const fieldName in query) { + if (!query[fieldName] || !query[fieldName].$text) { + continue; + } + const index = { + [fieldName]: 'text' + }; + return this.createIndex(className, index) + .catch((error) => { + if (error.code === 85) { + throw new Parse.Error( + Parse.Error.INTERNAL_SERVER_ERROR, + 'Only one text index is supported, please delete all text indexes to use new field.'); + } + throw error; + }); + } + return Promise.resolve(); + } + getIndexes(className) { return this._adaptiveCollection(className) .then(collection => collection._mongoCollection.indexes());