dbgate-sqltree
Version:
JavaScript/TypeScript SQL query-builder library
91 lines (90 loc) • 4.04 kB
JavaScript
"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;