ddl-manager
Version:
store postgres procedures and triggers in files
110 lines • 5.65 kB
JavaScript
"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