tg-knex-query-resolver
Version:
TeselaGen's Knex based query resolver
89 lines (75 loc) • 2.65 kB
JavaScript
var knex = require('knex')({ client: 'pg' });
var parse = require('node-sqlparser').parse;
var qry = knex.select("id", "name").from("user");
var log = require('./log');
var qry2 = knex.where({ id: 1});
console.log(qry2.toString());
// var filter = [
// { op: "where", args: ["name", "like", "%adam%"]}
// ];
// var filter = [
// { op: "where", args: ["name", "like", "%adam%"]},
// { op: "andWhere", args: [{id:3}]}
// ];
// var filter = [
// { op: "where", args: ["name", "like", "%adam%"]},
// { op: "orWhere", grp: [
// { op: "where", args:[{ role: "admin" }]},
// { op: "andWhere", args: [{ id: 2}]}
// ]}
// ];
// var filter = [
// { op: "where", args: ["name", "like", "%adam%"]},
// { op: "orWhere", grp: [
// { op: "where", args:[{ role: "admin" }]},
// { op: "andWhereIn", args: ['id', [1,2,3]]}
// ]}
// ];
// var qry3 = knex.select("id", "name").from("user")
// .where("id",1).andWhereIn(function(){
// this.select("id").from("access_control").where({id:5});
// });
// console.log("QRY3: " + qry.toString());
var filter = [
{ op: "where", args: ["name", "like", "%adam%"]},
{ op: "orWhere", grp: [
{ col: "id", op: "whereIn", subqry: [
{ op: "select", args: ["id"]},
{ op: "from", args: ["access_control"]},
{ op: "where", args: [{id: 5}]}
]},
{ col: "id", op: "between", subqry: [
{ op: "select", args: ["id"]},
{ op: "from", args: ["access_control"]},
{ op: "where", args: [{id: 5}]}
]},
{ op: "andWhere", args:[{ role: "admin" }]}
]}
];
resolveFilter(qry, filter);
console.log(qry.toSQL());
var queryAsStr = qry.toString();
console.log(queryAsStr);
log(parse(queryAsStr));
function resolveFilter(qb, filter){
filter.forEach((op) => {
// log("\nQB=========");
// log(qb);
// log("\n");
// log("OP>>>>>>>>>>");
// log(op);
if(isDefined(op, "args") && Array.isArray(op.args)){
qb = qb[op.op].apply(qb, op.args);
}else if(isDefined(op, "grp") && Array.isArray(op.grp)){
qb = qb[op.op](function(){ resolveFilter(this, op.grp); });
}else if(isDefined(op, "subqry") && Array.isArray(op.subqry)){
qb = qb[op.op](op.col, function(){ resolveFilter(this, op.subqry); });
}else{
throw new Error("Unknown operation format: " + op);
}
//console.log(qry.toString());
});
function isDefined(obj, key){
return (typeof obj[key] !== 'undefined');
}
}