tg-knex-query-resolver
Version:
TeselaGen's Knex based query resolver
78 lines (64 loc) • 2.34 kB
JavaScript
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;
};