newsql
Version:
Get the best of both worlds
85 lines (71 loc) • 1.78 kB
JavaScript
/*!
* newsql
* authors: Ben Lue
* license: GPL 2.0
* Copyright(c) 2015 Gocharm Inc.
*/
var jsonfp = require('jsonfp');
var _trueExpr = {or: true},
_falseExpr = {and: false},
opMap = {
"=": "==",
"!=": "!=",
">": ">",
">=": ">=",
"<": "<",
"<=": "<=",
"&": "&",
"|": "|",
"^": "^"
};
jsonfp.init();
exports.filter = function(list, filter, qvalue) {
//console.log('input is\n%s', JSON.stringify(list, null, 2));
//console.log('filter is\n%s', JSON.stringify(filter, null, 2));
//console.log('query value is\n%s', JSON.stringify(qvalue, null, 2));
var jexpr = buildJSONFP(filter, qvalue);
//console.log('JSON-FP expression is\n%s', JSON.stringify(jexpr, null, 2));
if (jexpr)
return jsonfp.apply( list, {filter: jexpr} );
// nothing we should do
return list;
};
exports.toJsonExpr = buildJSONFP;
function buildJSONFP(filter, qvalue) {
var jexpr = null,
logicOp;
if (filter.op === 'AND' || filter.op === 'and')
filter.op = logicOp = 'and';
else if (filter.op === 'OR' || filter.op === 'or')
filter.op = logicOp = 'or';
if (logicOp) {
var andField = [];
filter.filters.forEach(function(f) {
var expr = buildJSONFP( f, qvalue );
if (expr)
andField.push( expr );
});
if (andField.length > 0) {
var chainExpr = [andField, {reduce: logicOp}];
jexpr = {chain: chainExpr};
}
}
else if (qvalue.hasOwnProperty(filter.name)) {
var whereCond = {};
// TODO: like
if (filter.op === 'IS NULL')
whereCond['=='] = null;
else if (filter.op === 'IS NOT NULL')
whereCond['!='] = null;
else {
var jop = opMap[filter.op];
whereCond[jop] = qvalue[filter.name];
}
jexpr = {
chain: [
{getter: filter.field || filter.name},
whereCond
]};
}
return jexpr;
};