UNPKG

ddl-manager

Version:

store postgres procedures and triggers in files

142 lines 5.11 kB
"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