diff --git a/forward_engineering/alterScript/alterScriptHelpers/alterEntityHelper.js b/forward_engineering/alterScript/alterScriptHelpers/alterEntityHelper.js index 2687853..3196aa2 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 0000000..1e8b69a --- /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 9eb008d..6854f3b 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 d93f9d7..b0d1778 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};',