UNPKG

dbgate-sqltree

Version:

JavaScript/TypeScript SQL query-builder library

163 lines (162 loc) 6.81 kB
"use strict"; 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;