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
JavaScript
;
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