Skip to content

Instantly share code, notes, and snippets.

@mtranter
Last active August 9, 2016 13:26
Show Gist options
  • Save mtranter/bea0135b4c8d23f50efef02e6cbe73f9 to your computer and use it in GitHub Desktop.
Save mtranter/bea0135b4c8d23f50efef02e6cbe73f9 to your computer and use it in GitHub Desktop.
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