UNPKG

ddl-manager

Version:

store postgres procedures and triggers in files

110 lines 5.65 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.ArrayRefCommutativeTriggerBuilder = void 0; const AbstractTriggerBuilder_1 = require("../AbstractTriggerBuilder"); const buildArrayCommutativeBody_1 = require("../body/buildArrayCommutativeBody"); const ast_1 = require("../../../ast"); const buildArrVars_1 = require("../../processor/buildArrVars"); const CoalesceFalseExpression_1 = require("../../../ast/expression/CoalesceFalseExpression"); const TableReference_1 = require("../../../database/schema/TableReference"); const buildHasReferenceCondition_1 = require("../condition/buildHasReferenceCondition"); const SetItemsFactory_1 = require("../../processor/SetItemsFactory"); class ArrayRefCommutativeTriggerBuilder extends AbstractTriggerBuilder_1.AbstractTriggerBuilder { constructor() { super(...arguments); this.setItems = new SetItemsFactory_1.SetItemsFactory(this.context); } createTriggers() { return [{ trigger: this.createDatabaseTriggerOnDIU(), procedure: this.createDatabaseFunction(this.createBody()) }]; } createBody() { const deltaSetItems = this.setItems.plus(); const insertedArrElements = buildArrVars_1.buildArrVars(this.context, "inserted_"); const notChangedArrElements = deltaSetItems.length ? buildArrVars_1.buildArrVars(this.context, "not_changed_") : []; const deletedArrElements = buildArrVars_1.buildArrVars(this.context, "deleted_"); const body = buildArrayCommutativeBody_1.buildArrayCommutativeBody({ needInsertCase: this.context.withoutInsertCase() ? false : true, hasMutableColumns: this.conditions.hasMutableColumns(), noChanges: this.conditions.noChanges(), deleteCase: { hasReference: this.conditions.hasReferenceWithoutJoins("old"), needUpdate: this.conditions.filtersWithJoins("old"), update: new ast_1.Update({ table: this.context.cache.for.toString(), set: this.setItems.minus(), where: this.conditions.simpleWhere("old") }) }, insertCase: { hasReference: this.conditions.hasReferenceWithoutJoins("new"), needUpdate: this.conditions.filtersWithJoins("new"), update: new ast_1.Update({ table: this.context.cache.for.toString(), set: this.setItems.plus(), where: this.conditions.simpleWhere("new") }) }, updateCase: { deleted: { needUpdate: this.hasReferenceWithArrVars(deletedArrElements), update: new ast_1.Update({ table: this.context.cache.for.toString(), set: this.setItems.minus(), where: this.simpleWhereOnUpdate("old", deletedArrElements) }) }, notChanged: deltaSetItems.length ? { needUpdate: this.hasReferenceWithArrVars(notChangedArrElements), update: new ast_1.Update({ table: this.context.cache.for.toString(), set: deltaSetItems, where: this.simpleWhereOnUpdate("new", notChangedArrElements) }) } : undefined, inserted: { needUpdate: this.hasReferenceWithArrVars(insertedArrElements), update: new ast_1.Update({ table: this.context.cache.for.toString(), set: this.setItems.plus(), where: this.simpleWhereOnUpdate("new", insertedArrElements) }) } }, insertedArrElements, notChangedArrElements, deletedArrElements, needMatching: this.context.referenceMeta.filters.length > 0, matchedNew: this.matched("new"), matchedOld: this.matched("old") }); return body; } matched(row) { const matchedExpression = new CoalesceFalseExpression_1.CoalesceFalseExpression(ast_1.Expression.and(this.context.referenceMeta.filters) .replaceTable(this.context.triggerTable, new TableReference_1.TableReference(this.context.triggerTable, row))); return this.conditions.replaceTriggerTableRefsTo(matchedExpression, row); } hasReferenceWithArrVars(arrVars) { const refCondition = this.conditions.replaceTriggerTableRefsTo(buildHasReferenceCondition_1.buildHasReferenceCondition(this.context), "new"); return this.replaceArrayColumnsToVariables(refCondition, arrVars, "new"); } simpleWhereOnUpdate(row, arrVars) { const where = this.conditions.simpleWhereOnUpdate(row); return this.replaceArrayColumnsToVariables(where, arrVars, row); } replaceArrayColumnsToVariables(expression, arrVars, row) { const tableRef = new TableReference_1.TableReference(this.context.triggerTable, row); for (const arrVar of arrVars) { const columnRef = new ast_1.ColumnReference(tableRef, arrVar.triggerColumn); expression = expression.replaceColumn(columnRef, ast_1.Expression.unknown(arrVar.name)); } return expression; } } exports.ArrayRefCommutativeTriggerBuilder = ArrayRefCommutativeTriggerBuilder; //# sourceMappingURL=ArrayRefCommutativeTriggerBuilder.js.map