Skip to content

Commit bfed8a6

Browse files
committed
Allow defining index on base model that applies to all discriminators
1 parent aa4b38a commit bfed8a6

File tree

2 files changed

+43
-1
lines changed

2 files changed

+43
-1
lines changed

lib/helpers/indexes/getRelatedIndexes.js

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -46,7 +46,9 @@ function getRelatedIndexes({
4646

4747
return indexes.filter(index => {
4848
const partialFilterExpression = getPartialFilterExpression(index, indexesType);
49-
return !partialFilterExpression || !partialFilterExpression[discriminatorKey];
49+
return !partialFilterExpression
50+
|| !partialFilterExpression[discriminatorKey]
51+
|| partialFilterExpression[discriminatorKey]['$exists'];
5052
});
5153
}
5254

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)