Skip to content

Commit 9c17773

Browse files
authored
Merge pull request #14176 from peplin/discriminator-existence-on-index
Allow defining index on base model that applies to all discriminators
2 parents aa4b38a + 909c773 commit 9c17773

File tree

2 files changed

+45
-1
lines changed

2 files changed

+45
-1
lines changed

lib/helpers/indexes/getRelatedIndexes.js

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,7 @@
11
'use strict';
22

3+
const hasDollarKeys = require('../query/hasDollarKeys');
4+
35
function getRelatedSchemaIndexes(model, schemaIndexes) {
46
return getRelatedIndexes({
57
baseModelName: model.baseModelName,
@@ -46,7 +48,9 @@ function getRelatedIndexes({
4648

4749
return indexes.filter(index => {
4850
const partialFilterExpression = getPartialFilterExpression(index, indexesType);
49-
return !partialFilterExpression || !partialFilterExpression[discriminatorKey];
51+
return !partialFilterExpression
52+
|| !partialFilterExpression[discriminatorKey]
53+
|| (hasDollarKeys(partialFilterExpression[discriminatorKey]) && !('$eq' in partialFilterExpression[discriminatorKey]));
5054
});
5155
}
5256

test/helpers/indexes.getRelatedIndexes.test.js

Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -92,6 +92,46 @@ describe('getRelatedIndexes', () => {
9292
]
9393
);
9494
});
95+
it('with base model that has discriminator, it includes discriminator indexes that only checks for existence', () => {
96+
// Arrange
97+
const eventSchema = new Schema(
98+
{ actorId: { type: Schema.Types.ObjectId } },
99+
{ autoIndex: false }
100+
);
101+
eventSchema.index({ actorId: 1 },
102+
{ unique: true,
103+
partialFilterExpression: {
104+
__t: { $exists: true }
105+
}
106+
});
107+
108+
const Event = db.model('Event', eventSchema);
109+
110+
const clickEventSchema = new Schema(
111+
{
112+
clickedAt: Date,
113+
productCategory: String
114+
},
115+
{ autoIndex: false }
116+
);
117+
Event.discriminator('ClickEvent', clickEventSchema);
118+
119+
// Act
120+
const filteredSchemaIndexes = getRelatedSchemaIndexes(Event, Event.schema.indexes());
121+
122+
// Assert
123+
assert.deepStrictEqual(
124+
filteredSchemaIndexes,
125+
[
126+
[{ actorId: 1 },
127+
{ background: true,
128+
unique: true,
129+
partialFilterExpression: { __t: { $exists: true } }
130+
}
131+
]
132+
]
133+
);
134+
});
95135
it('with discriminator model, it only gets discriminator indexes', () => {
96136
// Arrange
97137
const eventSchema = new Schema(

0 commit comments

Comments
 (0)