UNPKG

rawsql-ts

Version:

High-performance SQL parser and AST analyzer written in TypeScript. Provides fast parsing and advanced transformation capabilities.

88 lines 4.31 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.appendUnique = exports.sameColumnReference = exports.columnReferenceText = exports.cloneColumnReference = exports.cloneValueComponent = exports.rebuildWhereWithoutTerms = exports.collectTopLevelAndTerms = exports.isBinaryOperator = exports.unwrapParens = exports.identifiersEqual = exports.normalizeIdentifier = void 0; const Clause_1 = require("../models/Clause"); const ValueComponent_1 = require("../models/ValueComponent"); const ValueParser_1 = require("../parsers/ValueParser"); const SqlComponentFormatter_1 = require("./SqlComponentFormatter"); const normalizeIdentifier = (value) => value.trim().toLowerCase(); exports.normalizeIdentifier = normalizeIdentifier; const isCaseSensitiveIdentifier = (value) => /[A-Z]/.test(value.trim()); const identifiersEqual = (left, right) => { const trimmedLeft = left.trim(); const trimmedRight = right.trim(); return isCaseSensitiveIdentifier(trimmedLeft) || isCaseSensitiveIdentifier(trimmedRight) ? trimmedLeft === trimmedRight : trimmedLeft.toLowerCase() === trimmedRight.toLowerCase(); }; exports.identifiersEqual = identifiersEqual; const unwrapParens = (expression) => { let candidate = expression; while (candidate instanceof ValueComponent_1.ParenExpression) { candidate = candidate.expression; } return candidate; }; exports.unwrapParens = unwrapParens; const isBinaryOperator = (expression, operator) => { const candidate = (0, exports.unwrapParens)(expression); return candidate instanceof ValueComponent_1.BinaryExpression && candidate.operator.value.trim().toLowerCase() === operator; }; exports.isBinaryOperator = isBinaryOperator; const collectTopLevelAndTerms = (expression) => { const candidate = (0, exports.unwrapParens)(expression); if (!(0, exports.isBinaryOperator)(candidate, "and")) { return [expression]; } return [ ...(0, exports.collectTopLevelAndTerms)(candidate.left), ...(0, exports.collectTopLevelAndTerms)(candidate.right) ]; }; exports.collectTopLevelAndTerms = collectTopLevelAndTerms; const rebuildWhereWithoutTerms = (query, termsToRemove) => { if (!query.whereClause || termsToRemove.size === 0) { return; } const remaining = (0, exports.collectTopLevelAndTerms)(query.whereClause.condition) .filter(term => !termsToRemove.has(term)); if (remaining.length === 0) { query.whereClause = null; return; } let rebuilt = remaining[0]; for (let index = 1; index < remaining.length; index += 1) { rebuilt = new ValueComponent_1.BinaryExpression(rebuilt, "and", remaining[index]); } query.whereClause = new Clause_1.WhereClause(rebuilt); }; exports.rebuildWhereWithoutTerms = rebuildWhereWithoutTerms; // API output shape review: this helper preserves the existing AST -> SQL -> AST clone path used by callers without changing public result.sql/result.query shapes. const cloneValueComponent = (expression, options) => { return ValueParser_1.ValueParser.parse((0, SqlComponentFormatter_1.formatSqlComponent)(expression, options)); }; exports.cloneValueComponent = cloneValueComponent; const cloneColumnReference = (reference) => { var _a, _b; const namespaces = (_b = (_a = reference.namespaces) === null || _a === void 0 ? void 0 : _a.map(namespace => namespace.name)) !== null && _b !== void 0 ? _b : null; return new ValueComponent_1.ColumnReference(namespaces, reference.column.name); }; exports.cloneColumnReference = cloneColumnReference; const columnReferenceText = (reference) => { const namespace = reference.getNamespace(); return namespace ? `${namespace}.${reference.column.name}` : reference.column.name; }; exports.columnReferenceText = columnReferenceText; const sameColumnReference = (left, right) => { return (0, exports.identifiersEqual)(left.column.name, right.column.name) && (0, exports.identifiersEqual)(left.getNamespace(), right.getNamespace()); }; exports.sameColumnReference = sameColumnReference; const appendUnique = (items, value) => { if (!items.includes(value)) { items.push(value); } }; exports.appendUnique = appendUnique; //# sourceMappingURL=PredicateExpressionUtils.js.map