-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathquery_compiler.js
66 lines (60 loc) · 2.17 KB
/
query_compiler.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
var multimethod = require('multimethod');
var compiler, compile;
var isForm = function(form){ return Array.isArray(form)};
var formExpand = function(form, callback){
var cdr = form.slice(0);
var car = form[0];
cdr.shift();
return callback(car, cdr);
};
exports.compile = compile = multimethod().dispatch(isForm)
.when(true,function(form){
return formExpand(form,function(symbol, args){return compiler(symbol, args);});
})
.when(false,function(form){
return function(){ return form;}
});
compiler = multimethod().dispatch(function(symbol, args){return symbol;})
.when('and', function(symbol, args){
if(args.length > 1){
var temp_fn_a = compile(args[0]);
args[0] = 'and';
var temp_fn_b = compile(args);
return function(resource, certname){
return temp_fn_a(resource, certname) && temp_fn_b(resource, certname);
};
}
else{
return compile(args[0]);
}
})
.when('not', function(symbol, args){
var temp_fn = compile(args[0]);
return function(resource, certname){
return !temp_fn(resource, certname);
}
})
.when('=', (function(){
var eqlDispatch = multimethod().dispatch(function(field, value){return field;})
.when('certname', function(field, value){
return function(resource, certname){return value == certname;};
})
.when('tag', function(field, value){
return function(resource, certname){
return (resource.tags.indexOf(value) != -1) ? true : false;
};
})
.default( function(field, value){
if (Array.isArray(field)){
return function(resource, certname){return resource[field[1]] == value;};
}
else{
return function(resource, certname){return resource[field] == value;};
}
});
return function(symbol, args){
var field = args[0];
var value = args[1];
return eqlDispatch(field, value);
};
})());