Skip to content

Commit

Permalink
refactor(discriminator): don't rely on model when getting discrimin…
Browse files Browse the repository at this point in the history
…ator by value

Re: #10130
  • Loading branch information
vkarpov15 committed Apr 28, 2021
1 parent c1cedd8 commit 06c6a8b
Show file tree
Hide file tree
Showing 10 changed files with 16 additions and 16 deletions.
2 changes: 1 addition & 1 deletion lib/helpers/discriminator/getConstructor.js
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,7 @@ module.exports = function getConstructor(Constructor, value) {
if (Constructor.discriminators[value[discriminatorKey]]) {
Constructor = Constructor.discriminators[value[discriminatorKey]];
} else {
const constructorByValue = getDiscriminatorByValue(Constructor, value[discriminatorKey]);
const constructorByValue = getDiscriminatorByValue(Constructor.discriminators, value[discriminatorKey]);
if (constructorByValue) {
Constructor = constructorByValue;
}
Expand Down
8 changes: 4 additions & 4 deletions lib/helpers/discriminator/getDiscriminatorByValue.js
Original file line number Diff line number Diff line change
Expand Up @@ -9,12 +9,12 @@ const areDiscriminatorValuesEqual = require('./areDiscriminatorValuesEqual');
* @param {string} value
*/

module.exports = function getDiscriminatorByValue(model, value) {
if (!model.discriminators) {
module.exports = function getDiscriminatorByValue(discriminators, value) {
if (discriminators == null) {
return null;
}
for (const name in model.discriminators) {
const it = model.discriminators[name];
for (const name of Object.keys(discriminators)) {
const it = discriminators[name];
if (
it.schema &&
it.schema.discriminatorMapping &&
Expand Down
2 changes: 1 addition & 1 deletion lib/helpers/model/castBulkWrite.js
Original file line number Diff line number Diff line change
Expand Up @@ -218,7 +218,7 @@ function _addDiscriminatorToObject(schema, obj) {
function decideModelByObject(model, object) {
const discriminatorKey = model.schema.options.discriminatorKey;
if (object != null && object.hasOwnProperty(discriminatorKey)) {
model = getDiscriminatorByValue(model, object[discriminatorKey]) || model;
model = getDiscriminatorByValue(model.discriminators, object[discriminatorKey]) || model;
}
return model;
}
2 changes: 1 addition & 1 deletion lib/helpers/populate/getModelsMapForPopulate.js
Original file line number Diff line number Diff line change
Expand Up @@ -409,7 +409,7 @@ module.exports = function getModelsMapForPopulate(model, docs, options) {
if (!schema && discriminatorKey && (discriminatorValue = utils.getValue(discriminatorKey, doc))) {
// `modelNameForFind` is the discriminator value, so we might need
// find the discriminated model name
const discriminatorModel = getDiscriminatorByValue(model, discriminatorValue) || model;
const discriminatorModel = getDiscriminatorByValue(model.discriminators, discriminatorValue) || model;
if (discriminatorModel != null) {
modelForCurrentDoc = discriminatorModel;
} else {
Expand Down
2 changes: 1 addition & 1 deletion lib/helpers/query/getEmbeddedDiscriminatorPath.js
Original file line number Diff line number Diff line change
Expand Up @@ -69,7 +69,7 @@ module.exports = function getEmbeddedDiscriminatorPath(schema, update, filter, p
continue;
}

const discriminatorSchema = getDiscriminatorByValue(schematype.caster, discriminatorKey).schema;
const discriminatorSchema = getDiscriminatorByValue(schematype.caster.discriminators, discriminatorKey).schema;

const rest = parts.slice(i + 1).join('.');
schematype = discriminatorSchema.path(rest);
Expand Down
4 changes: 2 additions & 2 deletions lib/model.js
Original file line number Diff line number Diff line change
Expand Up @@ -3051,7 +3051,7 @@ Model.create = function create(doc, options, callback) {
args.forEach(doc => {
toExecute.push(callback => {
const Model = this.discriminators && doc[discriminatorKey] != null ?
this.discriminators[doc[discriminatorKey]] || getDiscriminatorByValue(this, doc[discriminatorKey]) :
this.discriminators[doc[discriminatorKey]] || getDiscriminatorByValue(this.discriminators, doc[discriminatorKey]) :
this;
if (Model == null) {
throw new MongooseError(`Discriminator "${doc[discriminatorKey]}" not ` +
Expand Down Expand Up @@ -4688,7 +4688,7 @@ Model.compile = function compile(name, schema, collectionName, connection, base)

// If discriminator key is set, use the discriminator instead (gh-7586)
const Discriminator = model.discriminators[doc[discriminatorKey]] ||
getDiscriminatorByValue(model, doc[discriminatorKey]);
getDiscriminatorByValue(model.discriminators, doc[discriminatorKey]);
if (Discriminator != null) {
return new Discriminator(doc, fields, skipId);
}
Expand Down
4 changes: 2 additions & 2 deletions lib/query.js
Original file line number Diff line number Diff line change
Expand Up @@ -4651,7 +4651,7 @@ Query.prototype._castUpdate = function _castUpdate(obj, overwrite) {
typeof filter[schema.options.discriminatorKey] !== 'object' &&
schema.discriminators != null) {
const discriminatorValue = filter[schema.options.discriminatorKey];
const byValue = getDiscriminatorByValue(this.model, discriminatorValue);
const byValue = getDiscriminatorByValue(this.model.discriminators, discriminatorValue);
schema = schema.discriminators[discriminatorValue] ||
(byValue && byValue.schema) ||
schema;
Expand Down Expand Up @@ -4869,7 +4869,7 @@ Query.prototype.cast = function(model, obj) {
const discriminatorKey = model.schema.options.discriminatorKey;
if (obj != null &&
obj.hasOwnProperty(discriminatorKey)) {
model = getDiscriminatorByValue(model, obj[discriminatorKey]) || model;
model = getDiscriminatorByValue(model.discriminators, obj[discriminatorKey]) || model;
}

try {
Expand Down
2 changes: 1 addition & 1 deletion lib/queryhelpers.js
Original file line number Diff line number Diff line change
Expand Up @@ -97,7 +97,7 @@ exports.createModel = function createModel(model, doc, fields, userProvidedField

const value = doc[key];
if (key && value && model.discriminators) {
const discriminator = model.discriminators[value] || getDiscriminatorByValue(model, value);
const discriminator = model.discriminators[value] || getDiscriminatorByValue(model.discriminators, value);
if (discriminator) {
const _fields = clone(userProvidedFields);
exports.applyPaths(_fields, discriminator.schema);
Expand Down
2 changes: 1 addition & 1 deletion lib/schema/array.js
Original file line number Diff line number Diff line change
Expand Up @@ -471,7 +471,7 @@ SchemaArray.prototype.castForQuery = function($conditional, value) {
Constructor.discriminators[val[Constructor.schema.options.discriminatorKey]]) {
Constructor = Constructor.discriminators[val[Constructor.schema.options.discriminatorKey]];
} else {
const constructorByValue = getDiscriminatorByValue(Constructor, val[Constructor.schema.options.discriminatorKey]);
const constructorByValue = getDiscriminatorByValue(Constructor.discriminators, val[Constructor.schema.options.discriminatorKey]);
if (constructorByValue) {
Constructor = constructorByValue;
}
Expand Down
4 changes: 2 additions & 2 deletions lib/types/documentarray.js
Original file line number Diff line number Diff line change
Expand Up @@ -96,7 +96,7 @@ class CoreDocumentArray extends CoreMongooseArray {
Constructor.discriminators[value[Constructor.schema.options.discriminatorKey]]) {
Constructor = Constructor.discriminators[value[Constructor.schema.options.discriminatorKey]];
} else {
const constructorByValue = getDiscriminatorByValue(Constructor, value[Constructor.schema.options.discriminatorKey]);
const constructorByValue = getDiscriminatorByValue(Constructor.discriminators, value[Constructor.schema.options.discriminatorKey]);
if (constructorByValue) {
Constructor = constructorByValue;
}
Expand Down Expand Up @@ -289,7 +289,7 @@ class CoreDocumentArray extends CoreMongooseArray {
Constructor.discriminators[obj[Constructor.schema.options.discriminatorKey]]) {
Constructor = Constructor.discriminators[obj[Constructor.schema.options.discriminatorKey]];
} else {
const constructorByValue = getDiscriminatorByValue(Constructor, obj[Constructor.schema.options.discriminatorKey]);
const constructorByValue = getDiscriminatorByValue(Constructor.discriminators, obj[Constructor.schema.options.discriminatorKey]);
if (constructorByValue) {
Constructor = constructorByValue;
}
Expand Down

0 comments on commit 06c6a8b

Please sign in to comment.