From 44355e7a3e0840f953bbb61eeee73cb80ffdf4ba Mon Sep 17 00:00:00 2001 From: Sylvie Paindeville Date: Mon, 28 Sep 2026 17:32:01 +0200 Subject: [PATCH] feat: rename PostgreSQL tables in the alter script The delta model already records a table rename. Emit ALTER TABLE ... RENAME TO before the other changes on that table, using the same name the rest of the script uses. Co-authored-by: Cursor --- .../alterScriptHelpers/alterEntityHelper.js | 6 +- .../entityHelpers/nameHelper.js | 62 +++++++++++++++++++ .../alterScript/types/AlterCollectionDto.js | 13 ++++ forward_engineering/ddlProvider/templates.js | 2 + 4 files changed, 82 insertions(+), 1 deletion(-) create mode 100644 forward_engineering/alterScript/alterScriptHelpers/entityHelpers/nameHelper.js diff --git a/forward_engineering/alterScript/alterScriptHelpers/alterEntityHelper.js b/forward_engineering/alterScript/alterScriptHelpers/alterEntityHelper.js index 2687853a..3196aa2d 100644 --- a/forward_engineering/alterScript/alterScriptHelpers/alterEntityHelper.js +++ b/forward_engineering/alterScript/alterScriptHelpers/alterEntityHelper.js @@ -1,6 +1,7 @@ const _ = require('lodash'); const { getModifyCheckConstraintScriptDtos } = require('./entityHelpers/checkConstraintHelper'); const { getModifyEntityCommentsScriptDtos } = require('./entityHelpers/commentsHelper'); +const { getRenameCollectionScriptDtos } = require('./entityHelpers/nameHelper'); const { getUpdateTypesScriptDtos } = require('./columnHelpers/alterTypeHelper'); const { getModifyNonNullColumnsScriptDtos } = require('./columnHelpers/nonNullConstraintHelper'); const { @@ -122,12 +123,15 @@ const getDeleteCollectionScriptDto = app => collection => { const getModifyCollectionScriptDtos = ({ dbVersion, shouldIgnoreTableComments = false }) => collection => { + const renameCollectionScriptDtos = getRenameCollectionScriptDtos(collection); const modifyCheckConstraintScriptDtos = getModifyCheckConstraintScriptDtos(collection); const modifyCommentScriptDtos = getModifyEntityCommentsScriptDtos({ collection, shouldIgnoreTableComments, }); - return [...modifyCheckConstraintScriptDtos, ...modifyCommentScriptDtos].filter(Boolean); + return [...renameCollectionScriptDtos, ...modifyCheckConstraintScriptDtos, ...modifyCommentScriptDtos].filter( + Boolean, + ); }; /** diff --git a/forward_engineering/alterScript/alterScriptHelpers/entityHelpers/nameHelper.js b/forward_engineering/alterScript/alterScriptHelpers/entityHelpers/nameHelper.js new file mode 100644 index 00000000..1e8b69a8 --- /dev/null +++ b/forward_engineering/alterScript/alterScriptHelpers/entityHelpers/nameHelper.js @@ -0,0 +1,62 @@ +const { AlterScriptDto, SCRIPT_TYPE } = require('../../types/AlterScriptDto'); +const { + getEntityName, + getNamePrefixedWithSchemaName, + wrapInQuotes, + isParentContainerActivated, + isObjectInDeltaModelActivated, + getId, +} = require('../../../utils/general'); +const assignTemplates = require('../../../utils/assignTemplates'); +const templates = require('../../../ddlProvider/templates'); + +const getDdlName = ({ code, collectionName, name } = {}) => code || collectionName || name || ''; + +const valueBeforeChange = (change, currentValue) => { + if (change && change.old !== change.new) { + return change.old; + } + + return currentValue; +}; + +/** + * @param {Object} collection + * @return {AlterScriptDto | undefined} + */ +const getRenameCollectionScriptDto = collection => { + const role = collection?.role; + const collectionSchema = { ...collection, ...role }; + const compMod = { ...collection?.compMod, ...role?.compMod }; + const newName = getEntityName(collectionSchema); + const oldName = getDdlName({ + code: valueBeforeChange(compMod.code, collectionSchema.code), + collectionName: valueBeforeChange(compMod.collectionName, collectionSchema.collectionName), + name: valueBeforeChange(compMod.name, collectionSchema.name), + }); + + if (!oldName || !newName || oldName === newName) { + return; + } + + const script = assignTemplates(templates.renameTable, { + tableName: getNamePrefixedWithSchemaName(oldName, compMod.keyspaceName), + newName: wrapInQuotes(newName), + }); + const isContainerActivated = isParentContainerActivated(collection); + const isCollectionActivated = isContainerActivated && isObjectInDeltaModelActivated(collection); + + return AlterScriptDto.getInstance(script, isCollectionActivated, false, SCRIPT_TYPE.alterEntity, getId(collection)); +}; + +/** + * @param {Object} collection + * @return {AlterScriptDto[]} + */ +const getRenameCollectionScriptDtos = collection => { + return [getRenameCollectionScriptDto(collection)].filter(Boolean); +}; + +module.exports = { + getRenameCollectionScriptDtos, +}; diff --git a/forward_engineering/alterScript/types/AlterCollectionDto.js b/forward_engineering/alterScript/types/AlterCollectionDto.js index 9eb008da..6854f3b0 100644 --- a/forward_engineering/alterScript/types/AlterCollectionDto.js +++ b/forward_engineering/alterScript/types/AlterCollectionDto.js @@ -218,6 +218,14 @@ class AlterCollectionRoleCompModDto { */ collectionName; + /** + * @type {{ + * new: string, + * old: string, + * }} + */ + code; + /** * @type {{ * new: boolean, @@ -295,6 +303,11 @@ class AlterCollectionRoleDto { */ collectionName; + /** + * @type {string} + */ + code; + /** * @type {{ * [propertyName: string]: AlterCollectionColumnDto diff --git a/forward_engineering/ddlProvider/templates.js b/forward_engineering/ddlProvider/templates.js index d93f9d7f..b0d17788 100644 --- a/forward_engineering/ddlProvider/templates.js +++ b/forward_engineering/ddlProvider/templates.js @@ -37,6 +37,8 @@ module.exports = { renameColumn: 'ALTER TABLE IF EXISTS ${tableName} RENAME COLUMN ${oldColumnName} TO ${newColumnName};', + renameTable: 'ALTER TABLE IF EXISTS ${tableName} RENAME TO ${newName};', + addCheckConstraint: 'ALTER TABLE IF EXISTS ${tableName} ADD CONSTRAINT ${constraintName} CHECK (${expression})${noInherit};',