ddl-manager
Version:
store postgres procedures and triggers in files
142 lines • 5.11 kB
JavaScript
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.buildUniversalBody = void 0;
const ast_1 = require("../../../ast");
const TableReference_1 = require("../../../database/schema/TableReference");
function buildUniversalBody(ast) {
return new ast_1.Body({
declares: [
new ast_1.Declare({
name: "new_row",
type: "record"
}),
new ast_1.Declare({
name: "old_row",
type: "record"
}),
new ast_1.Declare({
name: "return_row",
type: "record"
})
],
statements: [
new ast_1.If({
if: ast_1.Expression.and([
"TG_OP = 'DELETE'"
]),
then: [
new ast_1.AssignVariable({
variable: "return_row",
value: new ast_1.HardCode({
sql: "old"
})
})
],
else: [
new ast_1.AssignVariable({
variable: "return_row",
value: new ast_1.HardCode({
sql: "new"
})
})
]
}),
new ast_1.BlankLine(),
new ast_1.AssignVariable({
variable: "new_row",
value: new ast_1.HardCode({
sql: "return_row"
})
}),
new ast_1.AssignVariable({
variable: "old_row",
value: new ast_1.HardCode({
sql: "return_row"
})
}),
new ast_1.BlankLine(),
new ast_1.If({
if: ast_1.Expression.and([
"TG_OP in ('INSERT', 'UPDATE')"
]),
then: [
new ast_1.AssignVariable({
variable: "new_row",
value: new ast_1.HardCode({
sql: "new"
})
})
]
}),
new ast_1.If({
if: ast_1.Expression.and([
"TG_OP in ('UPDATE', 'DELETE')"
]),
then: [
new ast_1.AssignVariable({
variable: "old_row",
value: new ast_1.HardCode({
sql: "old"
})
})
]
}),
new ast_1.BlankLine(),
new ast_1.If({
if: ast_1.Expression.and([
"TG_OP = 'UPDATE'"
]),
then: [
new ast_1.If({
if: ast_1.Expression.and([
ast.triggerTableColumns
.filter(column => column !== "id")
.map(column => `new.${column} is NOT distinct from old.${column}`).join(" and ")
]),
then: [
new ast_1.HardCode({
sql: "return new;"
})
]
})
]
}),
new ast_1.BlankLine(),
new ast_1.Update({
with: new ast_1.With({
queries: [
new ast_1.WithQuery({
name: "changed_rows",
select: new ast_1.InlineSelectValues({
values: ast.triggerTableColumns.map(column => `old_row.${column}`),
union: new ast_1.InlineSelectValues({
values: ast.triggerTableColumns.map(column => `new_row.${column}`)
})
})
})
]
}),
table: ast.forTable,
set: [new ast_1.SetSelectItem({
columns: ast.updateColumns,
select: ast.select
})],
from: ast.from.map(fromTable => {
if (fromTable === ast.triggerTable.toStringWithoutPublic()) {
return "changed_rows";
}
return fromTable;
}),
where: ast.where ?
ast.where.replaceTable(ast.triggerTable, new TableReference_1.TableReference(ast.triggerTable, "changed_rows")) :
undefined
}),
new ast_1.BlankLine(),
new ast_1.HardCode({
sql: "return return_row;"
})
]
});
}
exports.buildUniversalBody = buildUniversalBody;
//# sourceMappingURL=buildUniversalBody.js.map