UNPKG

ddl-manager

Version:

store postgres procedures and triggers in files

89 lines 3.63 kB
"use strict"; 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