diff --git a/lib/cube/event-expression.js b/lib/cube/event-expression.js index baaf39e7..90b55b2d 100644 --- a/lib/cube/event-expression.js +++ b/lib/cube/event-expression.js @@ -2939,8 +2939,6 @@ module.exports = (function(){ filterLessOrEqual = filter("$lte"), - filterNotEqual = filter("$ne"), - filterRegularExpression = filter("$regex"), filterIn = filter("$in"), @@ -2975,6 +2973,30 @@ module.exports = (function(){ + function filterNotEqual(o, k, v) { + + var f = o["$and"]; + + switch (typeof f) { + + case "undefined": o["$and"] = f = []; // continue + + case "object": + + var obj = {}; + + obj[k] = {"$ne": v}; + + f.push(obj); + + break; + + } + + } + + + function arrayAccessor(name) { name = new String(name); diff --git a/lib/cube/event-expression.peg b/lib/cube/event-expression.peg index 560744f2..9d81e342 100644 --- a/lib/cube/event-expression.peg +++ b/lib/cube/event-expression.peg @@ -6,7 +6,6 @@ filterGreaterOrEqual = filter("$gte"), filterLess = filter("$lt"), filterLessOrEqual = filter("$lte"), - filterNotEqual = filter("$ne"), filterRegularExpression = filter("$regex"), filterIn = filter("$in"), exists = {$exists: true}; @@ -24,6 +23,18 @@ }; } + function filterNotEqual(o, k, v) { + var f = o["$and"]; + switch (typeof f) { + case "undefined": o["$and"] = f = []; // continue + case "object": + var obj = {}; + obj[k] = {"$ne": v}; + f.push(obj); + break; + } + } + function arrayAccessor(name) { name = new String(name); name.array = true; diff --git a/lib/cube/metric-expression.js b/lib/cube/metric-expression.js index c0e15b8d..09a691ba 100644 --- a/lib/cube/metric-expression.js +++ b/lib/cube/metric-expression.js @@ -3889,8 +3889,6 @@ module.exports = (function(){ filterLessOrEqual = filter("$lte"), - filterNotEqual = filter("$ne"), - filterRegularExpression = filter("$regex"), filterIn = filter("$in"), @@ -3937,6 +3935,30 @@ module.exports = (function(){ + function filterNotEqual(o, k, v) { + + var f = o["$and"]; + + switch (typeof f) { + + case "undefined": o["$and"] = f = []; // continue + + case "object": + + var obj = {}; + + obj[k] = {"$ne": v}; + + f.push(obj); + + break; + + } + + } + + + function arrayAccessor(name) { name = new String(name); diff --git a/lib/cube/metric-expression.peg b/lib/cube/metric-expression.peg index 80aa9bcf..76d086ee 100644 --- a/lib/cube/metric-expression.peg +++ b/lib/cube/metric-expression.peg @@ -6,7 +6,6 @@ filterGreaterOrEqual = filter("$gte"), filterLess = filter("$lt"), filterLessOrEqual = filter("$lte"), - filterNotEqual = filter("$ne"), filterRegularExpression = filter("$regex"), filterIn = filter("$in"), exists = {$exists: true}; @@ -30,6 +29,18 @@ }; } + function filterNotEqual(o, k, v) { + var f = o["$and"]; + switch (typeof f) { + case "undefined": o["$and"] = f = []; // continue + case "object": + var obj = {}; + obj[k] = {"$ne": v}; + f.push(obj); + break; + } + } + function arrayAccessor(name) { name = new String(name); name.array = true; diff --git a/test/event-expression-test.js b/test/event-expression-test.js index 9f12a79b..732adb8e 100644 --- a/test/event-expression-test.js +++ b/test/event-expression-test.js @@ -195,6 +195,24 @@ suite.addBatch({ } }, + "an expression with two not equal filters": { + topic: parser.parse("test.ne(i,1).ne(i,2)"), + "filters out events matching both": function(e) { + var filter = {}; + e.filter(filter); + assert.deepEqual(filter, {$and: [{"d.i": {$ne: 1}},{"d.i": {$ne: 2}}]}); + } + }, + + "an expression with two not equal and a greater than filter": { + topic: parser.parse("test.ne(i,5).gt(i, 3).ne(i,8)"), + "filters out events matching all": function(e) { + var filter = {}; + e.filter(filter); + assert.deepEqual(filter, {"d.i": {$gt: 3}, $and: [{"d.i": {$ne: 5}},{"d.i": {$ne: 8}}]}); + } + }, + "filters": { "the eq filter results in a simple query filter": function() { var filter = {}; @@ -221,10 +239,10 @@ suite.addBatch({ parser.parse("test.le(i, 42)").filter(filter); assert.deepEqual(filter, {"d.i": {$lte: 42}}); }, - "the ne filter results in an $ne query filter": function(e) { + "the ne filter results in an $and $ne query filter": function(e) { var filter = {}; parser.parse("test.ne(i, 42)").filter(filter); - assert.deepEqual(filter, {"d.i": {$ne: 42}}); + assert.deepEqual(filter, {$and: [{"d.i": {$ne: 42}}]}); }, "the re filter results in a $regex query filter": function(e) { var filter = {}; diff --git a/test/metric-expression-test.js b/test/metric-expression-test.js index 0fd39844..37152720 100644 --- a/test/metric-expression-test.js +++ b/test/metric-expression-test.js @@ -239,6 +239,24 @@ suite.addBatch({ assert.isUndefined(e.source); } }, + + "an expression with two not equal filters": { + topic: parser.parse("sum(test.ne(i,1).ne(i,2))"), + "filters out events matching both": function(e) { + var filter = {}; + e.filter(filter); + assert.deepEqual(filter, {$and: [{"d.i": {$ne: 1}},{"d.i": {$ne: 2}}]}); + } + }, + + "an expression with two not equal and a greater than filter": { + topic: parser.parse("sum(test.ne(i,5).gt(i, 3).ne(i,8))"), + "filters out events matching all": function(e) { + var filter = {}; + e.filter(filter); + assert.deepEqual(filter, {"d.i": {$gt: 3}, $and: [{"d.i": {$ne: 5}},{"d.i": {$ne: 8}}]}); + } + }, "filters": { "multiple filters on the same field are combined": function() { @@ -281,10 +299,10 @@ suite.addBatch({ parser.parse("sum(test.le(i, 42))").filter(filter); assert.deepEqual(filter, {"d.i": {$lte: 42}}); }, - "the ne filter results in an $ne query filter": function(e) { + "the ne filter results in an $and $ne query filter": function(e) { var filter = {}; parser.parse("sum(test.ne(i, 42))").filter(filter); - assert.deepEqual(filter, {"d.i": {$ne: 42}}); + assert.deepEqual(filter, {$and: [{"d.i": {$ne: 42}}]}); }, "the re filter results in a $regex query filter": function(e) { var filter = {};