diff --git a/forward_engineering/alterScript/alterScriptFromDeltaHelper.js b/forward_engineering/alterScript/alterScriptFromDeltaHelper.js index 0cbfe71..9249dc8 100644 --- a/forward_engineering/alterScript/alterScriptFromDeltaHelper.js +++ b/forward_engineering/alterScript/alterScriptFromDeltaHelper.js @@ -144,32 +144,51 @@ const getAlterCollectionsScriptDtos = ({ * @param app {App} * @param dbVersion {string} * @param scriptFormat {string} - * @return {AlterScriptDto[]} + * @return {{ restViewScripts: AlterScriptDto[], renameViewScripts: AlterScriptDto[]}} * */ const getAlterViewScriptDtos = (collection, app, dbVersion, scriptFormat) => { - const createViewsScriptDtos = [] - .concat(collection.properties?.views?.properties?.added?.items) - .filter(Boolean) - .map(item => Object.values(item.properties)[0]) - .map(view => ({ ...view, ...(view.role || {}) })) + const properties = collection.properties?.views?.properties; + if (!properties) { + return []; + } + + const prepareDtos = mutationType => { + if (!mutationType.items) { + return []; + } + + return mutationType.items + .filter(Boolean) + .map(item => Object.values(item.properties)[0]) + .map(view => ({ ...view, ...(view.role || {}) })); + }; + + const createViewsScriptDtos = prepareDtos(properties.added) .filter(view => view.compMod?.created) .map(getAddViewScriptDto(app, scriptFormat)); - const deleteViewsScriptDtos = [] - .concat(collection.properties?.views?.properties?.deleted?.items) - .filter(Boolean) - .map(item => Object.values(item.properties)[0]) - .map(view => ({ ...view, ...(view.role || {}) })) - .map(getDeleteViewScriptDto(app, scriptFormat)); + const deleteViewsScriptDtos = prepareDtos(properties.deleted).map(getDeleteViewScriptDto(app, scriptFormat)); - const modifyViewsScriptDtos = [] - .concat(collection.properties?.views?.properties?.modified?.items) - .filter(Boolean) - .map(viewWrapper => Object.values(viewWrapper.properties)[0]) - .map(view => ({ ...view, ...(view.role || {}) })) - .flatMap(getModifyViewScriptDtos({ scriptFormat })); + const preparedModifyViewsScriptDtos = prepareDtos(properties.modified).reduce( + (scripts, view) => { + const { restViewScripts, renameViewScripts } = getModifyViewScriptDtos({ scriptFormat })(view); + + restViewScripts.length && scripts.restViewScripts.push(...restViewScripts); + renameViewScripts.length && scripts.renameViewScripts.push(...renameViewScripts); - return [...deleteViewsScriptDtos, ...createViewsScriptDtos, ...modifyViewsScriptDtos].filter(Boolean); + return scripts; + }, + { restViewScripts: [], renameViewScripts: [] }, + ); + + return { + restViewScripts: [ + ...deleteViewsScriptDtos, + ...createViewsScriptDtos, + ...preparedModifyViewsScriptDtos.restViewScripts, + ].filter(Boolean), + renameViewScripts: preparedModifyViewsScriptDtos.renameViewScripts, + }; }; /** @@ -372,8 +391,11 @@ const getAlterScriptDtos = (data, app) => { const modelDefinitions = JSON.parse(data.modelDefinitions); const internalDefinitions = JSON.parse(data.internalDefinitions); const externalDefinitions = JSON.parse(data.externalDefinitions); + const dbVersion = data.modelData[0]?.dbVersion; + const containersScriptDtos = getAlterContainersScriptDtos({ collection, app, scriptFormat }); + const collectionsScriptDtos = getAlterCollectionsScriptDtos({ collection, app, @@ -383,7 +405,9 @@ const getAlterScriptDtos = (data, app) => { externalDefinitions, scriptFormat, }); + const viewScriptDtos = getAlterViewScriptDtos(collection, app, dbVersion, scriptFormat); + const modelDefinitionsScriptDtos = getAlterModelDefinitionsScriptDtos({ collection, app, @@ -393,15 +417,18 @@ const getAlterScriptDtos = (data, app) => { externalDefinitions, scriptFormat, }); + const relationshipScriptDtos = getAlterRelationshipsScriptDtos({ collection, app, scriptFormat }); + const containersSequencesScriptDtos = getAlterContainersSequencesScriptDtos({ collection, app, dbVersion }); return [ ...containersScriptDtos, ...containersSequencesScriptDtos, ...modelDefinitionsScriptDtos, + ...viewScriptDtos.renameViewScripts, ...collectionsScriptDtos, - ...viewScriptDtos, + ...viewScriptDtos.restViewScripts, ...relationshipScriptDtos, ] .filter(Boolean) diff --git a/forward_engineering/alterScript/alterScriptHelpers/alterEntityHelper.js b/forward_engineering/alterScript/alterScriptHelpers/alterEntityHelper.js index a2a9dda..17ce8cf 100644 --- a/forward_engineering/alterScript/alterScriptHelpers/alterEntityHelper.js +++ b/forward_engineering/alterScript/alterScriptHelpers/alterEntityHelper.js @@ -12,6 +12,7 @@ const { const { getModifyCheckConstraintScriptDtos } = require('./entityHelpers/checkConstraintHelper'); const { getModifyPkConstraintsScriptDtos } = require('./entityHelpers/primaryKeyHelper'); const { getModifyUniqueKeyConstraintsScriptDtos } = require('./entityHelpers/uniqueKeyHelper'); +const { getModifyCollectionNameScriptDtos } = require('./entityHelpers/nameHelper'); const { getModifyNonNullColumnsScriptDtos } = require('./columnHelpers/nonNullConstraintHelper'); const { getModifiedDefaultColumnValueScriptDtos } = require('./columnHelpers/defaultValueHelper'); const { getModifyEntityCommentsScriptDtos } = require('./entityHelpers/commentsHelper'); @@ -103,8 +104,10 @@ const getModifyCollectionScriptDtos = const modifyUniqueKeyConstraintDtos = getModifyUniqueKeyConstraintsScriptDtos({ scriptFormat, collection }); const modifyCheckConstraintScriptDtos = getModifyCheckConstraintScriptDtos({ scriptFormat })(collection); const modifyIndexesScriptDtos = getModifyIndexesScriptDtos({ ddlProvider, scriptFormat })({ collection }); + const modifyEntityNameScriptDtos = getModifyCollectionNameScriptDtos({ scriptFormat, collection }); return [ + ...modifyEntityNameScriptDtos, ...modifyPKConstraintDtos, ...modifyCommentScriptDtos, ...modifyUniqueKeyConstraintDtos, diff --git a/forward_engineering/alterScript/alterScriptHelpers/alterViewHelper.js b/forward_engineering/alterScript/alterScriptHelpers/alterViewHelper.js index 3e0a9bc..302f569 100644 --- a/forward_engineering/alterScript/alterScriptHelpers/alterViewHelper.js +++ b/forward_engineering/alterScript/alterScriptHelpers/alterViewHelper.js @@ -3,6 +3,7 @@ const { AlterScriptDto } = require('../types/AlterScriptDto'); const { mapDeltaDualityViewToFeDualityView } = require('./dualityViewHelpers/deltaDualityViewToFeDualityViewMapper'); const { prepareNameForScriptFormat } = require('../../utils/general'); const { getModifyViewCommentsScriptDtos } = require('./viewHelpers/commentsHelper'); +const { getModifyEntityNameScriptDtos } = require('./viewHelpers/nameHelper'); /** * @return {(view: Object) => AlterScriptDto | undefined} @@ -66,14 +67,20 @@ const getDeleteViewScriptDto = (app, scriptFormat) => view => { /** * @param {object} params * @property {string} [scriptFormat] - * @return {(view: AlterCollectionDto) => AlterScriptDto[]} + * @return {(view: AlterCollectionDto) => { restViewScripts: AlterScriptDto[], renameViewScripts: AlterScriptDto[] }} * */ const getModifyViewScriptDtos = ({ scriptFormat }) => view => { const modifyCommentsScriptDtos = getModifyViewCommentsScriptDtos({ scriptFormat, view }); - return [...modifyCommentsScriptDtos].filter(Boolean); + // RENAME view statements must go *before* renaming table statements + const modifyEntityNameScriptDtos = getModifyEntityNameScriptDtos({ scriptFormat, entity: view }); + + const restViewScripts = modifyCommentsScriptDtos.filter(Boolean); + const renameViewScripts = modifyEntityNameScriptDtos.filter(Boolean); + + return { restViewScripts, renameViewScripts }; }; const getKeys = ({ view, collectionRefsDefinitionsMap, ddlProvider, app }) => { diff --git a/forward_engineering/alterScript/alterScriptHelpers/entityHelpers/nameHelper.js b/forward_engineering/alterScript/alterScriptHelpers/entityHelpers/nameHelper.js new file mode 100644 index 0000000..ce084f2 --- /dev/null +++ b/forward_engineering/alterScript/alterScriptHelpers/entityHelpers/nameHelper.js @@ -0,0 +1,57 @@ +const { AlterScriptDto } = require('../../types/AlterScriptDto'); +const { AlterCollectionDto } = require('../../types/AlterCollectionDto'); +const { assignTemplates } = require('../../../utils/assignTemplates'); +const { + prepareNameForScriptFormat, + getSchemaOfAlterCollection, + getNamePrefixedWithSchemaNameForScriptFormat, +} = require('../../../utils/general'); +const templates = require('../../../ddlProvider/templates'); + +/** + * @param {object} params + * @property {string} params.scriptFormat + * @property {AlterCollectionDto} params.collection + * @return {AlterScriptDto} + */ +const getRenameCollectionScriptDto = ({ scriptFormat, collection }) => { + const collectionName = collection?.role?.compMod?.collectionName; + + if (!collectionName) { + return undefined; + } + + const { old: name, new: newName } = collectionName; + + if (!newName || newName === name) { + return undefined; + } + + const collectionSchema = getSchemaOfAlterCollection(collection); + const bucketName = collectionSchema.compMod?.keyspaceName; + + const fullTableName = getNamePrefixedWithSchemaNameForScriptFormat(scriptFormat)(name, bucketName); + + const script = assignTemplates(templates.renameTable, { + tableName: fullTableName, + newName: prepareNameForScriptFormat(scriptFormat)(newName), + }); + + return AlterScriptDto.getInstance([script], true, false); +}; + +/** + * @param {object} params + * @param {string} params.scriptFormat + * @param {AlterCollectionDto} params.collection + * @return {Array} + * */ +const getModifyCollectionNameScriptDtos = ({ scriptFormat, collection }) => { + const renameEntityScript = getRenameCollectionScriptDto({ scriptFormat, collection }); + + return [renameEntityScript]; +}; + +module.exports = { + getModifyCollectionNameScriptDtos, +}; diff --git a/forward_engineering/alterScript/alterScriptHelpers/viewHelpers/nameHelper.js b/forward_engineering/alterScript/alterScriptHelpers/viewHelpers/nameHelper.js new file mode 100644 index 0000000..9f644a6 --- /dev/null +++ b/forward_engineering/alterScript/alterScriptHelpers/viewHelpers/nameHelper.js @@ -0,0 +1,54 @@ +const { AlterScriptDto } = require('../../types/AlterScriptDto'); +const { AlterCollectionDto } = require('../../types/AlterCollectionDto'); +const { assignTemplates } = require('../../../utils/assignTemplates'); +const { prepareNameForScriptFormat } = require('../../../utils/general'); +const templates = require('../../../ddlProvider/templates'); + +/** + * @param {object} params + * @property {string} params.scriptFormat + * @property {AlterCollectionDto} params.entity + * @return {AlterScriptDto} + */ +const getRenameEntityScriptDto = ({ scriptFormat, entity }) => { + const entityName = entity?.role?.compMod?.name; + + if (!entityName) { + return undefined; + } + + const { old: name, new: newName } = entityName; + + if (!newName || newName === name) { + return undefined; + } + + const renameScript = assignTemplates(templates.renameEntity, { + name: prepareNameForScriptFormat(scriptFormat)(name), + newName: prepareNameForScriptFormat(scriptFormat)(newName), + }); + + const schemaName = prepareNameForScriptFormat(scriptFormat)(entity.role.compMod.keyspaceName); + + const alterSessionScript = assignTemplates(templates.alterSession, { + schemaName, + }); + + return AlterScriptDto.getInstance([alterSessionScript, renameScript], true, false); +}; + +/** + * @param {object} params + * @param {string} params.scriptFormat + * @param {AlterCollectionDto} params.entity + * @return {Array} + * */ +const getModifyEntityNameScriptDtos = ({ scriptFormat, entity }) => { + const renameEntityScript = getRenameEntityScriptDto({ scriptFormat, entity }); + + return [renameEntityScript].filter(Boolean); +}; + +module.exports = { + getModifyEntityNameScriptDtos, +}; diff --git a/forward_engineering/ddlProvider/ddlHelpers/sequenceHelper.js b/forward_engineering/ddlProvider/ddlHelpers/sequenceHelper.js index ae5f7bf..8882195 100644 --- a/forward_engineering/ddlProvider/ddlHelpers/sequenceHelper.js +++ b/forward_engineering/ddlProvider/ddlHelpers/sequenceHelper.js @@ -74,7 +74,7 @@ module.exports = ({ templates, assignTemplates, getNamePrefixedWithSchemaName, w */ const configs = [ { key: 'options', value: options, name: fullName, template: templates.alterSequence }, - { key: 'newName', value: newName, name: wrappedSequenceName, template: templates.renameSequence }, + { key: 'newName', value: newName, name: wrappedSequenceName, template: templates.renameEntity }, ]; return configs diff --git a/forward_engineering/ddlProvider/templates.js b/forward_engineering/ddlProvider/templates.js index 8c28d77..beec1d3 100644 --- a/forward_engineering/ddlProvider/templates.js +++ b/forward_engineering/ddlProvider/templates.js @@ -52,7 +52,11 @@ module.exports = { dropSequence: 'DROP SEQUENCE${ifExists} ${name};\n', - renameSequence: 'RENAME ${name} TO ${newName};\n', + // works for tables, views, sequences, synonyms, and private user-owned objects + // Note: can't have full path, prefixed with schema name. Only works on objects in your current schema. + renameEntity: 'RENAME ${name} TO ${newName};\n', + + renameTable: 'ALTER TABLE ${tableName} RENAME TO ${newName};\n', alterSequence: 'ALTER SEQUENCE${ifExists} ${name}' + '${options};\n',