From ba98208fd460c8c2910429b15c6d6f4cb6e35ad2 Mon Sep 17 00:00:00 2001 From: Sylvie Paindeville Date: Thu, 1 Oct 2026 16:01:45 +0200 Subject: [PATCH] HCK-17916: rename views in the PostgreSQL alter script MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Generate ALTER VIEW … RENAME TO from compMod name changes, ordered before table renames like Oracle. Co-authored-by: Cursor --- .../alterScript/alterScriptFromDeltaHelper.js | 36 ++++++++--- .../alterScriptHelpers/alterViewHelper.js | 7 ++- .../viewHelpers/nameHelper.js | 61 +++++++++++++++++++ .../alterScript/types/AlterCollectionDto.js | 8 +++ forward_engineering/ddlProvider/templates.js | 2 + 5 files changed, 104 insertions(+), 10 deletions(-) create mode 100644 forward_engineering/alterScript/alterScriptHelpers/viewHelpers/nameHelper.js diff --git a/forward_engineering/alterScript/alterScriptFromDeltaHelper.js b/forward_engineering/alterScript/alterScriptFromDeltaHelper.js index a23331c..9d2e6d5 100644 --- a/forward_engineering/alterScript/alterScriptFromDeltaHelper.js +++ b/forward_engineering/alterScript/alterScriptFromDeltaHelper.js @@ -232,18 +232,35 @@ const getAlterViewScriptDtos = (collection, app) => { .map(view => ({ ...view, ...view.role })) .map(getDeleteViewScriptDto(app)); - const modifyViewsScriptDtos = modifyScriptsData + const preparedModifyViewsScriptDtos = modifyScriptsData .map(view => ({ ...view, ..._.omit(view.role, 'properties') })) - .flatMap(getModifyViewScriptDtos); + .reduce( + (scripts, view) => { + const { restViewScripts, renameViewScripts } = getModifyViewScriptDtos(view); + + if (restViewScripts.length) { + scripts.restViewScripts.push(...restViewScripts); + } + if (renameViewScripts.length) { + scripts.renameViewScripts.push(...renameViewScripts); + } + + return scripts; + }, + { restViewScripts: [], renameViewScripts: [] }, + ); const modifyCommentScriptDtos = modifyScriptsData.flatMap(getModifiedCommentOnColumnScriptDtos); - return [ - ...deleteViewsScriptDtos, - ...createViewsScriptDtos, - ...modifyViewsScriptDtos, - ...modifyCommentScriptDtos, - ].filter(Boolean); + return { + renameViewScripts: preparedModifyViewsScriptDtos.renameViewScripts, + restViewScripts: [ + ...deleteViewsScriptDtos, + ...createViewsScriptDtos, + ...preparedModifyViewsScriptDtos.restViewScripts, + ...modifyCommentScriptDtos, + ].filter(Boolean), + }; }; /** @@ -437,9 +454,10 @@ const getAlterScriptDtos = (data, app) => { return [ ...containersScriptDtos, ...modelDefinitionsScriptDtos, + ...viewScriptDtos.renameViewScripts, ...collectionsScriptDtos, ...containersSequencesScriptDtos, - ...viewScriptDtos, + ...viewScriptDtos.restViewScripts, ...relationshipScriptDtos, ].filter(Boolean); }; diff --git a/forward_engineering/alterScript/alterScriptHelpers/alterViewHelper.js b/forward_engineering/alterScript/alterScriptHelpers/alterViewHelper.js index dd5a130..674f631 100644 --- a/forward_engineering/alterScript/alterScriptHelpers/alterViewHelper.js +++ b/forward_engineering/alterScript/alterScriptHelpers/alterViewHelper.js @@ -1,5 +1,6 @@ const _ = require('lodash'); const { getModifyViewCommentsScriptDtos } = require('./viewHelpers/commentsHelper'); +const { getRenameViewScriptDtos } = require('./viewHelpers/nameHelper'); const { AlterScriptDto, SCRIPT_TYPE } = require('../types/AlterScriptDto'); const { wrapInQuotes, getId } = require('../../utils/general'); @@ -80,9 +81,13 @@ const getDeleteViewScriptDto = app => view => { * @return {AlterScriptDto[]} * */ const getModifyViewScriptDtos = view => { + const renameViewScriptDtos = getRenameViewScriptDtos(view); const modifyCommentsScriptDtos = getModifyViewCommentsScriptDtos(view); - return [...modifyCommentsScriptDtos].filter(Boolean); + return { + renameViewScripts: renameViewScriptDtos.filter(Boolean), + restViewScripts: modifyCommentsScriptDtos.filter(Boolean), + }; }; module.exports = { diff --git a/forward_engineering/alterScript/alterScriptHelpers/viewHelpers/nameHelper.js b/forward_engineering/alterScript/alterScriptHelpers/viewHelpers/nameHelper.js new file mode 100644 index 0000000..347205d --- /dev/null +++ b/forward_engineering/alterScript/alterScriptHelpers/viewHelpers/nameHelper.js @@ -0,0 +1,61 @@ +const { AlterScriptDto, SCRIPT_TYPE } = require('../../types/AlterScriptDto'); +const { + getViewName, + getNamePrefixedWithSchemaName, + wrapInQuotes, + isParentContainerActivated, + isObjectInDeltaModelActivated, + getId, +} = require('../../../utils/general'); +const assignTemplates = require('../../../utils/assignTemplates'); +const templates = require('../../../ddlProvider/templates'); + +const getDdlName = ({ code, name } = {}) => code || name || ''; + +const valueBeforeChange = (change, currentValue) => { + if (change && change.old !== change.new) { + return change.old; + } + + return currentValue; +}; + +/** + * @param {Object} view + * @return {AlterScriptDto | undefined} + */ +const getRenameViewScriptDto = view => { + const role = view?.role; + const viewSchema = { ...view, ...role }; + const compMod = { ...view?.compMod, ...role?.compMod }; + const newName = getViewName(viewSchema); + const oldName = getDdlName({ + code: valueBeforeChange(compMod.code, viewSchema.code), + name: valueBeforeChange(compMod.name, viewSchema.name), + }); + + if (!oldName || !newName || oldName === newName) { + return; + } + + const script = assignTemplates(templates.renameView, { + viewName: getNamePrefixedWithSchemaName(oldName, compMod.keyspaceName), + newName: wrapInQuotes(newName), + }); + const isContainerActivated = isParentContainerActivated(view); + const isViewActivated = isContainerActivated && isObjectInDeltaModelActivated(view); + + return AlterScriptDto.getInstance(script, isViewActivated, false, SCRIPT_TYPE.alterView, getId(view)); +}; + +/** + * @param {Object} view + * @return {AlterScriptDto[]} + */ +const getRenameViewScriptDtos = view => { + return [getRenameViewScriptDto(view)].filter(Boolean); +}; + +module.exports = { + getRenameViewScriptDtos, +}; diff --git a/forward_engineering/alterScript/types/AlterCollectionDto.js b/forward_engineering/alterScript/types/AlterCollectionDto.js index 6854f3b..bb84ca5 100644 --- a/forward_engineering/alterScript/types/AlterCollectionDto.js +++ b/forward_engineering/alterScript/types/AlterCollectionDto.js @@ -226,6 +226,14 @@ class AlterCollectionRoleCompModDto { */ code; + /** + * @type {{ + * new: string, + * old: string, + * }} + */ + name; + /** * @type {{ * new: boolean, diff --git a/forward_engineering/ddlProvider/templates.js b/forward_engineering/ddlProvider/templates.js index b0d1778..102db80 100644 --- a/forward_engineering/ddlProvider/templates.js +++ b/forward_engineering/ddlProvider/templates.js @@ -39,6 +39,8 @@ module.exports = { renameTable: 'ALTER TABLE IF EXISTS ${tableName} RENAME TO ${newName};', + renameView: 'ALTER VIEW IF EXISTS ${viewName} RENAME TO ${newName};', + addCheckConstraint: 'ALTER TABLE IF EXISTS ${tableName} ADD CONSTRAINT ${constraintName} CHECK (${expression})${noInherit};',