ddl-manager
Version:
store postgres procedures and triggers in files
89 lines • 3.63 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
exports.buildNoReferenceCondition = exports.buildHasReferenceCondition = void 0;
const ast_1 = require("../../../ast");
function buildHasReferenceCondition(context) {
return buildCheckReferenceCondition(context, "is not null");
}
exports.buildHasReferenceCondition = buildHasReferenceCondition;
function buildNoReferenceCondition(context) {
return buildCheckReferenceCondition(context, "is null");
}
exports.buildNoReferenceCondition = buildNoReferenceCondition;
function buildCheckReferenceCondition(context, check) {
if (!context.referenceMeta.expressions) {
return;
}
return buildReferenceExpression(context.referenceMeta.expressions, "and", context, check);
}
function buildReferenceExpression(expressions, operator, context, check) {
const referenceExpressions = expressions.map(expression => {
const orConditions = expression.splitBy("or");
if (orConditions.length > 1) {
return buildReferenceExpression(orConditions, "or", context, check);
}
return replaceSimpleExpressionToNotNulls(expression, context, check);
})
.filter(expression => !expression.isEmpty());
if (operator === "and") {
return ast_1.Expression.and(referenceExpressions);
}
else {
return ast_1.Expression.or(referenceExpressions);
}
}
function replaceSimpleExpressionToNotNulls(expression, context, check) {
const triggerColumnsRefs = expression.getColumnReferences()
.filter(columnRef => context.isColumnRefToTriggerTable(columnRef))
.filter(columnRef => columnRef.name !== "id");
const notNullTriggerColumns = triggerColumnsRefs.map(columnRef => ast_1.UnknownExpressionElement.fromSql(`${columnRef} ${check}`, { [`${columnRef}`]: columnRef }));
// companies.id = any( orders.clients_ids || orders.partners_ids )
// =>
// new.clients_ids or new.partners_ids
if (expression.isEqualAny()) {
const [leftOperand, rightOperand] = expression.getOperands();
const columnOperand = detectColumnOperand(leftOperand, rightOperand);
const anyOperand = detectAnyOperand(leftOperand, rightOperand);
if (columnOperand && anyOperand) {
const arrOperand = executeAnyContent(anyOperand);
if (/^\s*\w+\.\w+\s*\|\|\s*\w+\.\w+\s*$/.test(arrOperand.toString())) {
return ast_1.Expression.or(notNullTriggerColumns);
}
}
}
// companies.id in ( orders.id_client, orders.id_partner )
// =>
// new.id_client or new.id_partner
if (expression.isIn()) {
return ast_1.Expression.or(notNullTriggerColumns);
}
return ast_1.Expression.and(notNullTriggerColumns);
}
function detectColumnOperand(leftOperand, rightOperand) {
if (leftOperand instanceof ast_1.ColumnReference) {
return leftOperand;
}
if (rightOperand instanceof ast_1.ColumnReference) {
return rightOperand;
}
}
function detectAnyOperand(leftOperand, rightOperand) {
if (isAny(leftOperand)) {
return leftOperand;
}
if (isAny(rightOperand)) {
return rightOperand;
}
}
function isAny(operand) {
return (/^any\s*\(.*\)$/.test(operand.toString().trim().toLowerCase()));
}
function executeAnyContent(anyOperand) {
const sql = anyOperand.toString()
.trim()
.replace(/^any\s*\(/, "")
.replace(/\)$/, "");
const arrOperand = ast_1.UnknownExpressionElement.fromSql(sql, anyOperand.columnsMap);
return arrOperand;
}
//# sourceMappingURL=buildHasReferenceCondition.js.map