Last active
August 9, 2016 13:26
-
-
Save mtranter/bea0135b4c8d23f50efef02e6cbe73f9 to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
var boolExprMap = { | |
$and: function(a,b){ return a && b} , | |
$or: function(a,b){ return a || b; } | |
} | |
var TreeNode = function(op,def){ | |
op = (op || '$and').toLowerCase(); | |
this.op = boolExprMap[op]; | |
def = def || (op === '$and') | |
this.fns = [new LeafNode(function(){return def;})]; | |
} | |
TreeNode.prototype.push = function(otherTree){ | |
this.fns.push(otherTree) | |
} | |
TreeNode.prototype.run = function(obj){ | |
var myOp = this.op; | |
return this.fns.map(function(f){return f.run(obj); }).reduce(function(prev, curr){ | |
return myOp(prev, curr); | |
}); | |
} | |
var LeafNode = function(fn){this.fn = fn}; | |
LeafNode.prototype.run = function(obj){ | |
return this.fn(obj); | |
} | |
function evalProp(src, str){ | |
var props = str.split("."); | |
var val = src; | |
for(i=0;i<props.length;i++){ | |
val = val[props[i]] | |
} | |
return val; | |
} | |
function parseToQuery(obj, opts, op){ | |
op = (op || "$and").toLowerCase(); | |
var tree = new TreeNode(op) | |
for(var p in obj){ | |
(function(p){ | |
if(p in boolExprMap){ | |
var params = Array.isArray(obj[p]) ? obj[p] : [obj[p]]; | |
params.forEach(function(v){ | |
tree.push(parseToQuery(v, opts, p)); | |
}) | |
}else { | |
tree.push(new LeafNode(function(target){ | |
return opts.match(evalProp(target, p), obj[p]) | |
})); | |
} | |
})(p); | |
} | |
return tree | |
} | |
var query = parseToQuery({"job.title": "dev1"}, { | |
match: function(target, query){ | |
return target == query; | |
} | |
}) | |
var result = query.run({name: "mark tranter", age: 30, job: {title: 'dev'}}); | |
console.log("result is: " + result); |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment