diff --git a/lib/model.js b/lib/model.js index 905a9e3..d316b44 100644 --- a/lib/model.js +++ b/lib/model.js @@ -302,10 +302,25 @@ function areComparable (a, b) { } +/** + * Arithmetic comparators + */ comparisonFunctions.$lt = function (a, b) { return areComparable(a, b) && a < b; }; +comparisonFunctions.$lte = function (a, b) { + return areComparable(a, b) && a <= b; +}; + +comparisonFunctions.$gt = function (a, b) { + return areComparable(a, b) && a > b; +}; + +comparisonFunctions.$gte = function (a, b) { + return areComparable(a, b) && a >= b; +}; + /** * Match any of the subqueries diff --git a/test/model.test.js b/test/model.test.js index 43d0c63..2c95e26 100644 --- a/test/model.test.js +++ b/test/model.test.js @@ -434,7 +434,8 @@ describe('Model', function () { it('Can compare numbers, with or without dot notation', function () { model.match({ a: 5 }, { a: { $lt: 6 } }).should.equal(true); - model.match({ a: 5 }, { a: { $lt: 3 } }).should.equal(false); + model.match({ a: 5 }, { a: { $lt: 5 } }).should.equal(false); + model.match({ a: 5 }, { a: { $lt: 4 } }).should.equal(false); model.match({ a: { b: 5 } }, { "a.b": { $lt: 6 } }).should.equal(true); model.match({ a: { b: 5 } }, { "a.b": { $lt: 3 } }).should.equal(false); @@ -457,6 +458,30 @@ describe('Model', function () { }); + // General behaviour is tested in the block about $lt. Here we just test operators work + describe('Other comparison operators: $lte, $gt, $gte', function () { + + it('$lte', function () { + model.match({ a: 5 }, { a: { $lte: 6 } }).should.equal(true); + model.match({ a: 5 }, { a: { $lte: 5 } }).should.equal(true); + model.match({ a: 5 }, { a: { $lte: 4 } }).should.equal(false); + }); + + it('$gt', function () { + model.match({ a: 5 }, { a: { $gt: 6 } }).should.equal(false); + model.match({ a: 5 }, { a: { $gt: 5 } }).should.equal(false); + model.match({ a: 5 }, { a: { $gt: 4 } }).should.equal(true); + }); + + it('$gte', function () { + model.match({ a: 5 }, { a: { $gte: 6 } }).should.equal(false); + model.match({ a: 5 }, { a: { $gte: 5 } }).should.equal(true); + model.match({ a: 5 }, { a: { $gte: 4 } }).should.equal(true); + }); + + }); + + describe('Logical operators $or, $and', function () { it('Any of the subqueries should match for an $or to match', function () {