Skip to content

Commit

Permalink
Merge pull request #5821 from Faibk/master
Browse files Browse the repository at this point in the history
Fixed call stack overflow when using recursive embedded discriminators
  • Loading branch information
vkarpov15 committed Nov 16, 2017
2 parents a0ee8d8 + 76da92e commit a813dd2
Show file tree
Hide file tree
Showing 2 changed files with 53 additions and 1 deletion.
2 changes: 1 addition & 1 deletion lib/services/model/applyHooks.js
Original file line number Diff line number Diff line change
Expand Up @@ -28,14 +28,14 @@ function applyHooks(model, schema) {
if (childModel.$appliedHooks) {
continue;
}
applyHooks(childModel, schema.childSchemas[i].schema);
if (childModel.discriminators != null) {
keys = Object.keys(childModel.discriminators);
for (j = 0; j < keys.length; ++j) {
applyHooks(childModel.discriminators[keys[j]],
childModel.discriminators[keys[j]].schema);
}
}
applyHooks(childModel, schema.childSchemas[i].schema);
}

if (!q.length) {
Expand Down
52 changes: 52 additions & 0 deletions test/docs/discriminators.test.js
Original file line number Diff line number Diff line change
Expand Up @@ -352,4 +352,56 @@ describe('discriminator docs', function () {
}).
catch(done);
});

/**
* Recursive embedded discriminators
*/
it('Recursive embedded discriminators in arrays', function(done) {
var singleEventSchema = new Schema({ message: String },
{ discriminatorKey: 'kind', _id: false });

var eventListSchema = new Schema({ events: [singleEventSchema] });

var subEventSchema = new Schema({
sub_events: [singleEventSchema]
}, { _id: false });

var SubEvent = subEventSchema.path('sub_events').discriminator('SubEvent', subEventSchema)
eventListSchema.path('events').discriminator('SubEvent', subEventSchema);

var Eventlist = db.model('EventList', eventListSchema);

// Create a new batch of events with different kinds
var list = {
events: [
{ kind: 'SubEvent', sub_events: [{kind:'SubEvent', sub_events:[], message:'test1'}], message: 'hello' },
{ kind: 'SubEvent', sub_events: [{kind:'SubEvent', sub_events:[{kind:'SubEvent', sub_events:[], message:'test3'}], message:'test2'}], message: 'world' }
]
};

Eventlist.create(list).
then(function(doc) {
assert.equal(doc.events.length, 2);

assert.equal(doc.events[0].sub_events[0].message, 'test1');
assert.equal(doc.events[0].message, 'hello');
assert.ok(doc.events[0].sub_events[0] instanceof SubEvent);

assert.equal(doc.events[1].sub_events[0].sub_events[0].message, 'test3');
assert.equal(doc.events[1].message, 'world');
assert.ok(doc.events[1].sub_events[0].sub_events[0] instanceof SubEvent);

doc.events.push({kind:'SubEvent', sub_events:[{kind:'SubEvent', sub_events:[], message:'test4'}], message:'pushed'});
return doc.save();
}).
then(function(doc) {
assert.equal(doc.events.length, 3);

assert.equal(doc.events[2].message, 'pushed');
assert.ok(doc.events[2].sub_events[0] instanceof SubEvent);

done();
}).
catch(done);
});
});

0 comments on commit a813dd2

Please sign in to comment.