dbgate-sqltree
Version:
JavaScript/TypeScript SQL query-builder library
163 lines (162 loc) • 6.81 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
exports.dumpSqlCondition = void 0;
const dumpSqlExpression_1 = require("./dumpSqlExpression");
const dumpSqlCommand_1 = require("./dumpSqlCommand");
function dumpLikeAsFunctionCondition(dmp, condition) {
// For DynamoDB: contains() works only on string attributes
// For numeric values, search both as number and as string
const likeExpr = condition.right;
let isNumericValue = false;
let numericStringValue = '';
if (likeExpr.exprType === 'value' && typeof likeExpr.value === 'string') {
const cleanedStr = (likeExpr.value || '').replace(/%/g, '').trim();
// Only match valid decimal numbers (not Infinity, NaN, etc.)
isNumericValue = /^-?\d+(\.\d+)?$/.test(cleanedStr);
numericStringValue = cleanedStr;
}
else if (likeExpr.exprType === 'value' && typeof likeExpr.value === 'number') {
isNumericValue = Number.isFinite(likeExpr.value);
numericStringValue = String(likeExpr.value);
}
if (isNumericValue) {
// For numeric values: (column = value OR contains(column, 'value'))
dmp.putRaw('(');
(0, dumpSqlExpression_1.dumpSqlExpression)(dmp, condition.left);
dmp.putRaw(' = ');
dmp.put('%s', numericStringValue);
dmp.putRaw(' OR contains(');
(0, dumpSqlExpression_1.dumpSqlExpression)(dmp, condition.left);
dmp.putRaw(', ');
dmp.put('%v', numericStringValue);
dmp.putRaw('))');
}
else {
// String value: contains(column, value)
dmp.putRaw('contains(');
(0, dumpSqlExpression_1.dumpSqlExpression)(dmp, condition.left);
dmp.putRaw(', ');
if (likeExpr.exprType === 'value') {
let cleanValue = likeExpr.value;
if (typeof cleanValue === 'string') {
cleanValue = cleanValue.replace(/%/g, '');
}
dmp.put('%v', cleanValue);
}
else {
(0, dumpSqlExpression_1.dumpSqlExpression)(dmp, likeExpr);
}
dmp.putRaw(')');
}
}
function dumpSqlCondition(dmp, condition) {
var _a, _b, _c, _d, _e, _f;
switch (condition.conditionType) {
case 'binary':
(0, dumpSqlExpression_1.dumpSqlExpression)(dmp, condition.left);
dmp.put(' %s ', condition.operator);
(0, dumpSqlExpression_1.dumpSqlExpression)(dmp, condition.right);
break;
case 'isNull':
(0, dumpSqlExpression_1.dumpSqlExpression)(dmp, condition.expr);
dmp.put(' ^is ^null');
break;
case 'isNotNull':
(0, dumpSqlExpression_1.dumpSqlExpression)(dmp, condition.expr);
dmp.put(' ^is ^not ^null');
break;
case 'isEmpty':
// Use DATALENGTH for MSSQL TEXT/NTEXT/IMAGE columns to avoid TRIM error
if ((_b = (_a = dmp.dialect).useDatalengthForEmptyString) === null || _b === void 0 ? void 0 : _b.call(_a, (_c = condition.expr) === null || _c === void 0 ? void 0 : _c['dataType'])) {
dmp.put('^datalength(');
(0, dumpSqlExpression_1.dumpSqlExpression)(dmp, condition.expr);
dmp.put(') = 0');
}
else {
dmp.put('^trim(');
(0, dumpSqlExpression_1.dumpSqlExpression)(dmp, condition.expr);
dmp.put(") = ''");
}
break;
case 'isNotEmpty':
// Use DATALENGTH for MSSQL TEXT/NTEXT/IMAGE columns to avoid TRIM error
if ((_e = (_d = dmp.dialect).useDatalengthForEmptyString) === null || _e === void 0 ? void 0 : _e.call(_d, (_f = condition.expr) === null || _f === void 0 ? void 0 : _f['dataType'])) {
dmp.put('^datalength(');
(0, dumpSqlExpression_1.dumpSqlExpression)(dmp, condition.expr);
dmp.put(') > 0');
}
else {
dmp.put('^trim(');
(0, dumpSqlExpression_1.dumpSqlExpression)(dmp, condition.expr);
dmp.put(") <> ''");
}
break;
case 'and':
case 'or':
dmp.putCollection(` ^${condition.conditionType} `, condition.conditions, cond => {
dmp.putRaw('(');
dumpSqlCondition(dmp, cond);
dmp.putRaw(')');
});
break;
case 'like':
if (dmp.dialect.likeAsFunction) {
dumpLikeAsFunctionCondition(dmp, condition);
}
else {
(0, dumpSqlExpression_1.dumpSqlExpression)(dmp, condition.left);
dmp.put(dmp.dialect.ilike ? ' ^ilike ' : ' ^like ');
(0, dumpSqlExpression_1.dumpSqlExpression)(dmp, condition.right);
}
break;
case 'notLike':
(0, dumpSqlExpression_1.dumpSqlExpression)(dmp, condition.left);
dmp.put(' ^not ^like ');
(0, dumpSqlExpression_1.dumpSqlExpression)(dmp, condition.right);
break;
case 'not':
dmp.put('^not (');
dumpSqlCondition(dmp, condition.condition);
dmp.put(')');
break;
case 'exists':
dmp.put('^exists (');
(0, dumpSqlCommand_1.dumpSqlSelect)(dmp, condition.subQuery);
dmp.put(')');
break;
case 'notExists':
dmp.put('^not ^exists (');
(0, dumpSqlCommand_1.dumpSqlSelect)(dmp, condition.subQuery);
dmp.put(')');
break;
case 'between':
(0, dumpSqlExpression_1.dumpSqlExpression)(dmp, condition.expr);
dmp.put(' ^between ');
(0, dumpSqlExpression_1.dumpSqlExpression)(dmp, condition.left);
dmp.put(' ^and ');
(0, dumpSqlExpression_1.dumpSqlExpression)(dmp, condition.right);
break;
case 'expression':
(0, dumpSqlExpression_1.dumpSqlExpression)(dmp, condition.expr);
break;
case 'in':
(0, dumpSqlExpression_1.dumpSqlExpression)(dmp, condition.expr);
dmp.put(' ^in (%,v)', condition.values);
break;
case 'notIn':
(0, dumpSqlExpression_1.dumpSqlExpression)(dmp, condition.expr);
dmp.put(' ^not ^in (%,v)', condition.values);
break;
case 'rawTemplate':
let was = false;
for (const item of condition.templateSql.split('$$')) {
if (was) {
(0, dumpSqlExpression_1.dumpSqlExpression)(dmp, condition.expr);
}
dmp.putRaw(item);
was = true;
}
break;
}
}
exports.dumpSqlCondition = dumpSqlCondition;