UNPKG

tg-knex-query-resolver

Version:

TeselaGen's Knex based query resolver

78 lines (64 loc) 2.34 kB
var parseExpression = require("./parse-expression"); var countAllowedExpression = [ "greaterThan", "lessThan", "greaterThanEquals", "lessThanEquals", "equals", ]; module.exports = function (filter, joinOperator, parseFilter, entity) { var modifier = ""; if (filter.modifier === "not") modifier = "Not"; var op = "where" + modifier + "Exists"; // var op = "where" + modifier + "In"; var chainOperator = filter.chainedWith || joinOperator || undefined; if (chainOperator === "and") chainOperator = undefined; if (chainOperator) op = chainOperator + "Where" + modifier + "Exists"; // if (chainOperator) op = chainOperator + "Where" + modifier + "In"; // var existsFilter = [{ [filter.key]: filter.foreignKey }]; var existsFilter = [ `??.?? = ??.??`, [entity, filter.foreignKey, filter.entity, filter.key], ]; // console.log(`subqry filter: `, filter); var subqueryOp = { col: filter.foreignKey, op: op, subqry: [ { op: "select", args: [filter.key] }, { op: "from", args: [filter.entity] }, ], }; filter.filters.forEach((item, idx) => { if (idx === 2) { subqueryOp.subqry.push(parseFilter(item, undefined, filter.entity)); } else { subqueryOp.subqry.push(parseFilter(item, filter.operator, filter.entity)); } }); if (filter.countExpression) { if (countAllowedExpression.indexOf(countParsedExpression.name) == -1) { throw new Error( "count expression " + countParsedExpression.name + " not allowed" ); } var countParsedExpression = parseExpression(filter.countExpression); countParsedExpression.op = "havingRaw"; var countExpressionOperator = countParsedExpression.args[1]; var countExpressionOperand = countParsedExpression.args[2]; countParsedExpression.args = [ "count(*) " + countExpressionOperator + " ?", [countExpressionOperand], ]; subqueryOp.subqry.push({ op: "groupBy", args: [filter.key] }); subqueryOp.subqry.push(countParsedExpression); } if (subqueryOp.subqry.length > 2) { //additional filters have been applied subqueryOp.subqry.push({ op: "andWhereRaw", args: existsFilter }); } else { // no filters have been applied subqueryOp.subqry.push({ op: "whereRaw", args: existsFilter }); } return subqueryOp; };