diff --git a/spec/DatabaseController.spec.js b/spec/DatabaseController.spec.js index cb8c847700..6583656a23 100644 --- a/spec/DatabaseController.spec.js +++ b/spec/DatabaseController.spec.js @@ -434,6 +434,30 @@ describe('DatabaseController', function () { }); }); + describe('reduceInRelation', function () { + it('does not throw when a relation constraint operand is null', async () => { + const databaseController = new DatabaseController(); + spyOn(databaseController, 'owningIds').and.returnValue(Promise.resolve([])); + const schema = { getExpectedType: () => ({ type: 'Relation' }) }; + + await databaseController.reduceInRelation( + 'Owner', + { friends: { $in: [null] } }, + schema + ); + await databaseController.reduceInRelation( + 'Owner', + { friends: { $nin: [null] } }, + schema + ); + await databaseController.reduceInRelation( + 'Owner', + { friends: { $ne: null, $in: [] } }, + schema + ); + }); + }); + describe('reduceOperations', function () { const databaseController = new DatabaseController(); diff --git a/src/Controllers/DatabaseController.js b/src/Controllers/DatabaseController.js index 7ddc6e60e4..66262286e2 100644 --- a/src/Controllers/DatabaseController.js +++ b/src/Controllers/DatabaseController.js @@ -1130,13 +1130,14 @@ class DatabaseController { if (constraintKey === 'objectId') { relatedIds = [query[key].objectId]; } else if (constraintKey == '$in') { - relatedIds = query[key]['$in'].map(r => r.objectId); + relatedIds = query[key]['$in'].map(r => (r ? r.objectId : undefined)); } else if (constraintKey == '$nin') { isNegation = true; - relatedIds = query[key]['$nin'].map(r => r.objectId); + relatedIds = query[key]['$nin'].map(r => (r ? r.objectId : undefined)); } else if (constraintKey == '$ne') { isNegation = true; - relatedIds = [query[key]['$ne'].objectId]; + const ne = query[key]['$ne']; + relatedIds = [ne ? ne.objectId : undefined]; } else { return; }