UNPKG

dbgate-sqltree

Version:

JavaScript/TypeScript SQL query-builder library

91 lines (90 loc) 4.04 kB
"use strict"; var __importDefault = (this && this.__importDefault) || function (mod) { return (mod && mod.__esModule) ? mod : { "default": mod }; }; Object.defineProperty(exports, "__esModule", { value: true }); exports.evaluateCondition = void 0; const cloneDeepWith_1 = __importDefault(require("lodash/cloneDeepWith")); const escapeRegExp_1 = __importDefault(require("lodash/escapeRegExp")); const evaluateExpression_1 = require("./evaluateExpression"); function isEmpty(value) { if (value == null) return true; return value.toString().trim() == ''; } function isLike(value, test) { if (!value) return false; if (!test) return false; const regex = new RegExp(`^${(0, escapeRegExp_1.default)(test).replace(/%/g, '.*')}$`, 'i'); const res = !!value.toString().match(regex); return res; } function extractRawValue(value) { if (value === null || value === void 0 ? void 0 : value.$bigint) return value.$bigint; if (value === null || value === void 0 ? void 0 : value.$oid) return value.$oid; return value; } function evaluateCondition(condition, values) { switch (condition.conditionType) { case 'binary': const left = extractRawValue((0, evaluateExpression_1.evaluateExpression)(condition.left, values)); const right = extractRawValue((0, evaluateExpression_1.evaluateExpression)(condition.right, values)); switch (condition.operator) { case '=': return left == right; case '!=': case '<>': return left != right; case '<=': return left <= right; case '>=': return left >= right; case '<': return left < right; case '>': return left > right; } break; case 'isNull': return (0, evaluateExpression_1.evaluateExpression)(condition.expr, values) == null; case 'isNotNull': return (0, evaluateExpression_1.evaluateExpression)(condition.expr, values) != null; case 'isEmpty': return isEmpty((0, evaluateExpression_1.evaluateExpression)(condition.expr, values)); case 'isNotEmpty': return !isEmpty((0, evaluateExpression_1.evaluateExpression)(condition.expr, values)); case 'and': return condition.conditions.every(cond => evaluateCondition(cond, values)); case 'or': return condition.conditions.some(cond => evaluateCondition(cond, values)); case 'like': return isLike(extractRawValue((0, evaluateExpression_1.evaluateExpression)(condition.left, values)), extractRawValue((0, evaluateExpression_1.evaluateExpression)(condition.right, values))); case 'notLike': return !isLike(extractRawValue((0, evaluateExpression_1.evaluateExpression)(condition.left, values)), extractRawValue((0, evaluateExpression_1.evaluateExpression)(condition.right, values))); case 'not': return !evaluateCondition(condition.condition, values); case 'anyColumnPass': return Object.keys(values).some(columnName => { const replaced = (0, cloneDeepWith_1.default)(condition.placeholderCondition, (expr) => { if (expr.exprType == 'placeholder') return { exprType: 'column', columnName, }; }); return evaluateCondition(replaced, values); }); case 'in': const value = extractRawValue((0, evaluateExpression_1.evaluateExpression)(condition.expr, values)); const list = condition.values; if (Array.isArray(list)) { return list.some(item => item == value); } return false; } } exports.evaluateCondition = evaluateCondition;