Skip to content

Commit cd3c33d

Browse files
feat: dropUnknownIndexes
1 parent 2cebb88 commit cd3c33d

File tree

3 files changed

+36
-3
lines changed

3 files changed

+36
-3
lines changed

spec/DefinedSchemas.spec.js

Lines changed: 24 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -371,7 +371,7 @@ describe('DefinedSchemas', () => {
371371
expect(schema.indexes).toEqual(indexes);
372372
});
373373

374-
it('should delete removed indexes', async () => {
374+
it('should delete removed indexes when dropUnknownIndexes is set to false', async () => {
375375
const server = await reconfigureServer();
376376

377377
let indexes = { complex: { createdAt: 1, updatedAt: 1 } };
@@ -393,6 +393,29 @@ describe('DefinedSchemas', () => {
393393
cleanUpIndexes(schema);
394394
expect(schema.indexes).toBeUndefined();
395395
});
396+
397+
it('should not delete removed indexes when dropUnknownIndexes is set to true', async () => {
398+
const server = await reconfigureServer();
399+
400+
let indexes = { complex: { createdAt: 1, updatedAt: 1 } };
401+
402+
let schemas = { definitions: [{ className: 'Test', indexes }], dropUnknownIndexes: false };
403+
await new DefinedSchemas(schemas, server.config).execute();
404+
405+
indexes = {};
406+
schemas = { definitions: [{ className: 'Test', indexes }], dropUnknownIndexes: false };
407+
408+
// Change indexes
409+
await new DefinedSchemas(schemas, server.config).execute();
410+
let schema = await new Parse.Schema('Test').get();
411+
expect(schema.indexes).not.toBeUndefined();
412+
413+
// Update
414+
await new DefinedSchemas(schemas, server.config).execute();
415+
schema = await new Parse.Schema('Test').get();
416+
expect(schema.indexes).not.toBeUndefined();
417+
});
418+
396419
xit('should keep protected indexes', async () => {
397420
const server = await reconfigureServer();
398421

src/Options/index.js

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,9 @@ export interface SchemaOptions {
2525
/* Is true if Parse Server will reject any attempts to modify the schema while the server is running.
2626
:DEFAULT: false */
2727
lockSchemas: ?boolean;
28+
/* Drops indexes that are not defined in the schema and are present in the database. Set this false if you are adding indexes manually so that it wont be dropped when you run schema migration
29+
:DEFAULT: true */
30+
dropUnknownIndexes: ?boolean;
2831
/* Execute a callback before running schema migrations. */
2932
beforeMigration: ?() => void | Promise<void>;
3033
/* Execute a callback after running schema migrations. */

src/SchemaMigrations/DefinedSchemas.js

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -344,16 +344,23 @@ export class DefinedSchemas {
344344

345345
const indexesToAdd = [];
346346

347+
// Only delete indexes which are present in database if dropUnknownIndexes is `true`
347348
// Check deletion
348349
if (cloudSchema.indexes) {
349350
Object.keys(cloudSchema.indexes).forEach(indexName => {
350351
if (!this.isProtectedIndex(localSchema.className, indexName)) {
351352
if (!localSchema.indexes || !localSchema.indexes[indexName]) {
352-
newLocalSchema.deleteIndex(indexName);
353+
// Only delete indexes which are present in database if dropUnknownIndexes is `true`
354+
if(this.config.schema.dropUnknownIndexes){
355+
newLocalSchema.deleteIndex(indexName);
356+
}
353357
} else if (
354358
!this.paramsAreEquals(localSchema.indexes[indexName], cloudSchema.indexes[indexName])
355359
) {
356-
newLocalSchema.deleteIndex(indexName);
360+
// Only delete indexes which are present in database if dropUnknownIndexes is `true`
361+
if(this.config.schema.dropUnknownIndexes){
362+
newLocalSchema.deleteIndex(indexName);
363+
}
357364
if (localSchema.indexes) {
358365
indexesToAdd.push({
359366
indexName,

0 commit comments

Comments
 (0)