From 69956bc9d120d9bfcea13ade4c41496342e2a6b0 Mon Sep 17 00:00:00 2001 From: yevhenii-moroziuk Date: Mon, 19 Jan 2026 15:03:43 +0200 Subject: [PATCH 1/6] HCK-14286: Implement CREATE/DROP logic for views --- .../alterScript/alterScriptFromDeltaHelper.js | 35 ++++++++--- .../alterScriptHelpers/alterViewHelper.js | 61 ++++++++++++++++++- .../alterScriptHelpers/viewHelpers/getKeys.js | 46 ++++++++++++++ .../ddlProvider/ddlProvider.js | 16 +++++ forward_engineering/ddlProvider/templates.js | 4 ++ forward_engineering/utils/general.js | 12 ++++ 6 files changed, 166 insertions(+), 8 deletions(-) create mode 100644 forward_engineering/alterScript/alterScriptHelpers/viewHelpers/getKeys.js diff --git a/forward_engineering/alterScript/alterScriptFromDeltaHelper.js b/forward_engineering/alterScript/alterScriptFromDeltaHelper.js index 8207516..a4aa7cd 100644 --- a/forward_engineering/alterScript/alterScriptFromDeltaHelper.js +++ b/forward_engineering/alterScript/alterScriptFromDeltaHelper.js @@ -9,7 +9,7 @@ const { getAddForeignKeyScriptDtos, getModifyForeignKeyScriptDtos, } = require('./alterScriptHelpers/alterForeignKeyHelper'); -const { getModifyViewScriptDtos } = require('./alterScriptHelpers/alterViewHelper'); +const { getViewsScripts } = require('./alterScriptHelpers/alterViewHelper'); const getItems = data => [data?.items].flat().filter(Boolean); @@ -64,13 +64,34 @@ const getAlterCollectionScriptDtos = ({ ); }; -const getAlterViewScriptDtos = collection => { - const modifyViewScriptDtos = getItems(collection.properties?.views?.properties?.modified) - .map(viewWrapper => Object.values(viewWrapper.properties)[0]) +/** + * @param {Object} collection + * @param {App} app + * @return {Array} + */ +const getAlterViewScriptDtos = (collection, app) => { + const { added, deleted, modified } = collection.properties?.views?.properties || {}; + const { getAddViewScriptDto, getDeleteViewScriptDto, getModifyViewScriptDtos } = getViewsScripts(app); + + const addedViews = getItems(added) + .map(item => Object.values(item.properties)[0]) + .map(view => ({ ...view, ...view.role })) + .filter(view => view.compMod?.created); + + const deletedViews = getItems(deleted) + .map(item => Object.values(item.properties)[0]) .map(view => ({ ...view, ...view.role })) - .flatMap(getModifyViewScriptDtos); + .filter(view => view.compMod?.deleted); + + const modifiedViews = getItems(modified) + .map(item => Object.values(item.properties)[0]) + .map(view => ({ ...view, ...view.role })); + + const addedViewScriptDtos = addedViews.map(getAddViewScriptDto); + const deletedViewScriptDtos = deletedViews.map(getDeleteViewScriptDto); + const modifyViewScriptDtos = modifiedViews.flatMap(getModifyViewScriptDtos); - return [...modifyViewScriptDtos].filter(Boolean); + return [...deletedViewScriptDtos, ...addedViewScriptDtos, ...modifyViewScriptDtos].filter(Boolean); }; const getAlterRelationshipsScriptDtos = ({ collection, app, ignoreRelationshipIDs = [] }) => { @@ -169,7 +190,7 @@ const getAlterScriptDtos = (data, app) => { externalDefinitions, }); - const viewScriptDtos = getAlterViewScriptDtos(collection); + const viewScriptDtos = getAlterViewScriptDtos(collection, app); const relationshipScriptDtos = getAlterRelationshipsScriptDtos({ collection, diff --git a/forward_engineering/alterScript/alterScriptHelpers/alterViewHelper.js b/forward_engineering/alterScript/alterScriptHelpers/alterViewHelper.js index c38dd89..6466887 100644 --- a/forward_engineering/alterScript/alterScriptHelpers/alterViewHelper.js +++ b/forward_engineering/alterScript/alterScriptHelpers/alterViewHelper.js @@ -1,4 +1,49 @@ +/** + * @typedef {import('../../../shared/types').App} App + */ const { getModifyViewCommentsScriptDtos } = require('./viewHelpers/commentsHelper'); +const { AlterScriptDto } = require('../types/AlterScriptDto'); +const { wrapInQuotes, getSchemaOfAlterView, getFullViewName } = require('../../utils/general'); +const { getKeys } = require('./viewHelpers/getKeys'); + +/** + * @param {Object} ddlProvider + * @param {Function} mapProperties + * @returns {(view: Object) => AlterScriptDto} + */ +const getAddViewScriptDto = (ddlProvider, mapProperties) => view => { + const viewSchema = { ...view, ...(view.role || {}) }; + const schemaName = viewSchema.schemaName || ''; + const schemaData = { schemaName }; + + const viewData = { + name: viewSchema.code || viewSchema.name, + keys: getKeys({ + viewSchema, + ddlProvider, + mapProperties, + collectionRefsDefinitionsMap: view.compMod?.collectionData?.collectionRefsDefinitionsMap ?? {}, + }), + schemaData, + }; + + const hydratedView = ddlProvider.hydrateView({ viewData, entityData: [viewSchema] }); + const script = ddlProvider.createView(hydratedView, {}, viewSchema.isActivated); + + return AlterScriptDto.getInstance([script], true, false); +}; + +/** + * @param {Object} ddlProvider + * @returns {(view: Object) => AlterScriptDto} + */ +const getDeleteViewScriptDto = ddlProvider => view => { + const viewSchema = getSchemaOfAlterView(view); + const fullViewName = getFullViewName(viewSchema); + const script = ddlProvider.dropView({ viewName: fullViewName }); + + return AlterScriptDto.getInstance([script], true, true); +}; const getModifyViewScriptDtos = view => { const modifyCommentsScriptDtos = getModifyViewCommentsScriptDtos(view); @@ -6,6 +51,20 @@ const getModifyViewScriptDtos = view => { return [...modifyCommentsScriptDtos].filter(Boolean); }; +/** + * @param {App} app + */ +const getViewsScripts = app => { + const ddlProvider = require('../../ddlProvider/ddlProvider')(null, null, app); + const { mapProperties } = app.require('@hackolade/ddl-fe-utils'); + + return { + getAddViewScriptDto: getAddViewScriptDto(ddlProvider, mapProperties), + getDeleteViewScriptDto: getDeleteViewScriptDto(ddlProvider), + getModifyViewScriptDtos, + }; +}; + module.exports = { - getModifyViewScriptDtos, + getViewsScripts, }; diff --git a/forward_engineering/alterScript/alterScriptHelpers/viewHelpers/getKeys.js b/forward_engineering/alterScript/alterScriptHelpers/viewHelpers/getKeys.js new file mode 100644 index 0000000..33c9cd6 --- /dev/null +++ b/forward_engineering/alterScript/alterScriptHelpers/viewHelpers/getKeys.js @@ -0,0 +1,46 @@ +const { get } = require('lodash'); + +const getKeys = ({ viewSchema, collectionRefsDefinitionsMap, mapProperties, ddlProvider }) => { + return mapProperties(viewSchema, (propertyName, schema) => { + const definition = collectionRefsDefinitionsMap[schema.refId]; + + if (!definition) { + return ddlProvider.hydrateViewColumn({ + name: propertyName, + isActivated: schema.isActivated, + }); + } + + const entityName = + get(definition.collection, '[0].code', '') || get(definition.collection, '[0].collectionName', '') || ''; + const dbName = get(definition.bucket, '[0].code') || get(definition.bucket, '[0].name', ''); + const name = definition.name; + + if (name === propertyName) { + return ddlProvider.hydrateViewColumn({ + containerData: definition.bucket, + entityData: definition.collection, + isActivated: schema.isActivated, + definition: definition.definition, + entityName, + name, + dbName, + }); + } + + return ddlProvider.hydrateViewColumn({ + containerData: definition.bucket, + entityData: definition.collection, + isActivated: schema.isActivated, + definition: definition.definition, + alias: propertyName, + entityName, + name, + dbName, + }); + }); +}; + +module.exports = { + getKeys, +}; diff --git a/forward_engineering/ddlProvider/ddlProvider.js b/forward_engineering/ddlProvider/ddlProvider.js index 3f5287c..c9a824b 100644 --- a/forward_engineering/ddlProvider/ddlProvider.js +++ b/forward_engineering/ddlProvider/ddlProvider.js @@ -407,6 +407,22 @@ module.exports = (baseProvider, options, app) => { }); }, + dropTable({ tableName }) { + return assignTemplates({ template: templates.dropTable, templateData: { tableName } }); + }, + + addColumn({ tableName, columnDefinition }) { + return assignTemplates({ template: templates.addColumn, templateData: { tableName, columnDefinition } }); + }, + + dropColumn({ tableName, columnName }) { + return assignTemplates({ template: templates.dropColumn, templateData: { tableName, columnName } }); + }, + + dropView({ viewName }) { + return assignTemplates({ template: templates.dropView, templateData: { viewName } }); + }, + hydrateIndex(indexData, tableData, schemaData) { return { ...indexData, schemaName: schemaData.schemaName }; }, diff --git a/forward_engineering/ddlProvider/templates.js b/forward_engineering/ddlProvider/templates.js index f4ab282..0a929ab 100644 --- a/forward_engineering/ddlProvider/templates.js +++ b/forward_engineering/ddlProvider/templates.js @@ -52,4 +52,8 @@ module.exports = { updateColumnDefaultValue: 'ALTER TABLE ${tableName} ALTER COLUMN ${columnName} SET DEFAULT ${defaultValue};', dropColumnDefaultValue: 'ALTER TABLE ${tableName} ALTER COLUMN ${columnName} DROP DEFAULT;', + + renameColumn: 'ALTER TABLE ${tableName} RENAME COLUMN ${oldColumnName} TO ${newColumnName};', + + dropView: 'DROP VIEW ${viewName};', }; diff --git a/forward_engineering/utils/general.js b/forward_engineering/utils/general.js index 76a365a..9ce8032 100644 --- a/forward_engineering/utils/general.js +++ b/forward_engineering/utils/general.js @@ -136,6 +136,16 @@ const getSchemaOfAlterCollection = collection => { return { ...collection, ...(omit(collection?.role, 'properties') || {}) }; }; +const getSchemaOfAlterView = view => { + return { ...view, ...(omit(view?.role, 'properties') || {}) }; +}; + +const getFullViewName = viewSchema => { + const name = getEntityName(viewSchema); + const schemaName = viewSchema.schemaName || ''; + return getNamePrefixedWithSchemaName({ name, schemaName }); +}; + const isObjectInDeltaModelActivated = modelObject => { return modelObject.compMod?.isActivated?.new ?? modelObject.role?.isActivated; }; @@ -189,6 +199,8 @@ module.exports = { getFullCollectionName, getEntityName, getSchemaOfAlterCollection, + getSchemaOfAlterView, + getFullViewName, isObjectInDeltaModelActivated, isParentContainerActivated, getSchemaNameFromCollection, From 8777dc5b07528c44e87743836d38d1370694a84c Mon Sep 17 00:00:00 2001 From: yevhenii-moroziuk Date: Mon, 19 Jan 2026 18:16:29 +0200 Subject: [PATCH 2/6] HCK-14286: Add logic to rename the view --- .../alterScriptHelpers/alterViewHelper.js | 8 ++-- .../viewHelpers/nameHelper.js | 48 +++++++++++++++++++ forward_engineering/ddlProvider/templates.js | 2 + forward_engineering/utils/general.js | 3 +- 4 files changed, 57 insertions(+), 4 deletions(-) create mode 100644 forward_engineering/alterScript/alterScriptHelpers/viewHelpers/nameHelper.js diff --git a/forward_engineering/alterScript/alterScriptHelpers/alterViewHelper.js b/forward_engineering/alterScript/alterScriptHelpers/alterViewHelper.js index 6466887..50c016a 100644 --- a/forward_engineering/alterScript/alterScriptHelpers/alterViewHelper.js +++ b/forward_engineering/alterScript/alterScriptHelpers/alterViewHelper.js @@ -2,6 +2,7 @@ * @typedef {import('../../../shared/types').App} App */ const { getModifyViewCommentsScriptDtos } = require('./viewHelpers/commentsHelper'); +const { getModifyViewNameScriptDtos, getRenameViewScriptDto } = require('./viewHelpers/nameHelper'); const { AlterScriptDto } = require('../types/AlterScriptDto'); const { wrapInQuotes, getSchemaOfAlterView, getFullViewName } = require('../../utils/general'); const { getKeys } = require('./viewHelpers/getKeys'); @@ -45,10 +46,11 @@ const getDeleteViewScriptDto = ddlProvider => view => { return AlterScriptDto.getInstance([script], true, true); }; -const getModifyViewScriptDtos = view => { +const getModifyViewScriptDtos = (ddlProvider, mapProperties) => view => { + const renameViewNameScriptDtos = getRenameViewScriptDto(view, ddlProvider, mapProperties); const modifyCommentsScriptDtos = getModifyViewCommentsScriptDtos(view); - return [...modifyCommentsScriptDtos].filter(Boolean); + return [renameViewNameScriptDtos, ...modifyCommentsScriptDtos].filter(Boolean); }; /** @@ -61,7 +63,7 @@ const getViewsScripts = app => { return { getAddViewScriptDto: getAddViewScriptDto(ddlProvider, mapProperties), getDeleteViewScriptDto: getDeleteViewScriptDto(ddlProvider), - getModifyViewScriptDtos, + getModifyViewScriptDtos: getModifyViewScriptDtos(ddlProvider, mapProperties), }; }; diff --git a/forward_engineering/alterScript/alterScriptHelpers/viewHelpers/nameHelper.js b/forward_engineering/alterScript/alterScriptHelpers/viewHelpers/nameHelper.js new file mode 100644 index 0000000..e9ab128 --- /dev/null +++ b/forward_engineering/alterScript/alterScriptHelpers/viewHelpers/nameHelper.js @@ -0,0 +1,48 @@ +const { AlterScriptDto } = require('../../types/AlterScriptDto'); +const { getFullViewName, getSchemaOfAlterView } = require('../../../utils/general'); +const { getKeys } = require('./getKeys'); + +/** + * @param {Object} view + * @param {Object} ddlProvider + * @param {Function} mapProperties + * @return {AlterScriptDto | undefined} + */ +const getRenameViewScriptDto = (view, ddlProvider, mapProperties) => { + const viewSchema = getSchemaOfAlterView(view); + const viewName = viewSchema?.compMod?.name; + + if (!viewName) { + return undefined; + } + + const { old: oldName, new: newName } = viewName; + + if (!newName || newName === oldName) { + return undefined; + } + + const oldFullViewName = getFullViewName({ ...viewSchema, code: oldName, name: oldName }); + const dropScript = ddlProvider.dropView({ viewName: oldFullViewName }); + + const schemaData = { schemaName: viewSchema.schemaName || '' }; + const viewData = { + name: newName, + keys: getKeys({ + viewSchema, + ddlProvider, + mapProperties, + collectionRefsDefinitionsMap: view.compMod?.collectionData?.collectionRefsDefinitionsMap ?? {}, + }), + schemaData, + }; + + const hydratedView = ddlProvider.hydrateView({ viewData, entityData: [viewSchema] }); + const createScript = ddlProvider.createView(hydratedView, {}, viewSchema.isActivated); + + return AlterScriptDto.getInstance([dropScript, createScript], true, false); +}; + +module.exports = { + getRenameViewScriptDto, +}; diff --git a/forward_engineering/ddlProvider/templates.js b/forward_engineering/ddlProvider/templates.js index 5c67460..93048f3 100644 --- a/forward_engineering/ddlProvider/templates.js +++ b/forward_engineering/ddlProvider/templates.js @@ -64,4 +64,6 @@ module.exports = { renameColumn: 'ALTER TABLE ${tableName} RENAME COLUMN ${oldColumnName} TO ${newColumnName};', dropView: 'DROP VIEW ${viewName};', + + renameView: 'RENAME VIEW ${oldViewName} TO ${newViewName};', }; diff --git a/forward_engineering/utils/general.js b/forward_engineering/utils/general.js index b49574d..13efc5f 100644 --- a/forward_engineering/utils/general.js +++ b/forward_engineering/utils/general.js @@ -142,7 +142,8 @@ const getSchemaOfAlterView = view => { const getFullViewName = viewSchema => { const name = getEntityName(viewSchema); - const schemaName = viewSchema.schemaName || ''; + const schemaName = viewSchema.compMod?.keyspaceName || ''; + return getNamePrefixedWithSchemaName({ name, schemaName }); }; From c0a4aecd2d3a269919f320708ee513142fd19b08 Mon Sep 17 00:00:00 2001 From: yevhenii-moroziuk Date: Tue, 20 Jan 2026 11:07:01 +0200 Subject: [PATCH 3/6] HCK-14286: Add logic to alter select statement --- .../alterScriptHelpers/alterViewHelper.js | 29 +++++----------- .../{nameHelper.js => alterNameHelper.js} | 20 +++-------- .../viewHelpers/alterViewStatementHelper.js | 27 +++++++++++++++ .../viewHelpers/createView.js | 34 +++++++++++++++++++ forward_engineering/ddlProvider/templates.js | 2 -- forward_engineering/utils/general.js | 8 ----- 6 files changed, 73 insertions(+), 47 deletions(-) rename forward_engineering/alterScript/alterScriptHelpers/viewHelpers/{nameHelper.js => alterNameHelper.js} (54%) create mode 100644 forward_engineering/alterScript/alterScriptHelpers/viewHelpers/alterViewStatementHelper.js create mode 100644 forward_engineering/alterScript/alterScriptHelpers/viewHelpers/createView.js diff --git a/forward_engineering/alterScript/alterScriptHelpers/alterViewHelper.js b/forward_engineering/alterScript/alterScriptHelpers/alterViewHelper.js index 50c016a..dfc10fd 100644 --- a/forward_engineering/alterScript/alterScriptHelpers/alterViewHelper.js +++ b/forward_engineering/alterScript/alterScriptHelpers/alterViewHelper.js @@ -2,10 +2,12 @@ * @typedef {import('../../../shared/types').App} App */ const { getModifyViewCommentsScriptDtos } = require('./viewHelpers/commentsHelper'); -const { getModifyViewNameScriptDtos, getRenameViewScriptDto } = require('./viewHelpers/nameHelper'); +const { getModifyViewNameScriptDtos, getRenameViewScriptDto } = require('./viewHelpers/alterNameHelper'); const { AlterScriptDto } = require('../types/AlterScriptDto'); -const { wrapInQuotes, getSchemaOfAlterView, getFullViewName } = require('../../utils/general'); +const { wrapInQuotes, getSchemaOfAlterView, getFullCollectionName } = require('../../utils/general'); const { getKeys } = require('./viewHelpers/getKeys'); +const { createView } = require('./viewHelpers/createView'); +const { getModifySelectStatementScriptDto } = require('./viewHelpers/alterViewStatementHelper'); /** * @param {Object} ddlProvider @@ -13,23 +15,7 @@ const { getKeys } = require('./viewHelpers/getKeys'); * @returns {(view: Object) => AlterScriptDto} */ const getAddViewScriptDto = (ddlProvider, mapProperties) => view => { - const viewSchema = { ...view, ...(view.role || {}) }; - const schemaName = viewSchema.schemaName || ''; - const schemaData = { schemaName }; - - const viewData = { - name: viewSchema.code || viewSchema.name, - keys: getKeys({ - viewSchema, - ddlProvider, - mapProperties, - collectionRefsDefinitionsMap: view.compMod?.collectionData?.collectionRefsDefinitionsMap ?? {}, - }), - schemaData, - }; - - const hydratedView = ddlProvider.hydrateView({ viewData, entityData: [viewSchema] }); - const script = ddlProvider.createView(hydratedView, {}, viewSchema.isActivated); + const script = createView(ddlProvider, mapProperties, view); return AlterScriptDto.getInstance([script], true, false); }; @@ -40,7 +26,7 @@ const getAddViewScriptDto = (ddlProvider, mapProperties) => view => { */ const getDeleteViewScriptDto = ddlProvider => view => { const viewSchema = getSchemaOfAlterView(view); - const fullViewName = getFullViewName(viewSchema); + const fullViewName = getFullCollectionName(viewSchema); const script = ddlProvider.dropView({ viewName: fullViewName }); return AlterScriptDto.getInstance([script], true, true); @@ -49,8 +35,9 @@ const getDeleteViewScriptDto = ddlProvider => view => { const getModifyViewScriptDtos = (ddlProvider, mapProperties) => view => { const renameViewNameScriptDtos = getRenameViewScriptDto(view, ddlProvider, mapProperties); const modifyCommentsScriptDtos = getModifyViewCommentsScriptDtos(view); + const modifySelectStatementScriptDto = getModifySelectStatementScriptDto(view, ddlProvider, mapProperties); - return [renameViewNameScriptDtos, ...modifyCommentsScriptDtos].filter(Boolean); + return [renameViewNameScriptDtos, modifySelectStatementScriptDto, ...modifyCommentsScriptDtos].filter(Boolean); }; /** diff --git a/forward_engineering/alterScript/alterScriptHelpers/viewHelpers/nameHelper.js b/forward_engineering/alterScript/alterScriptHelpers/viewHelpers/alterNameHelper.js similarity index 54% rename from forward_engineering/alterScript/alterScriptHelpers/viewHelpers/nameHelper.js rename to forward_engineering/alterScript/alterScriptHelpers/viewHelpers/alterNameHelper.js index e9ab128..f4eb223 100644 --- a/forward_engineering/alterScript/alterScriptHelpers/viewHelpers/nameHelper.js +++ b/forward_engineering/alterScript/alterScriptHelpers/viewHelpers/alterNameHelper.js @@ -1,6 +1,7 @@ const { AlterScriptDto } = require('../../types/AlterScriptDto'); -const { getFullViewName, getSchemaOfAlterView } = require('../../../utils/general'); +const { getFullCollectionName, getSchemaOfAlterView } = require('../../../utils/general'); const { getKeys } = require('./getKeys'); +const { createView } = require('./createView'); /** * @param {Object} view @@ -22,23 +23,10 @@ const getRenameViewScriptDto = (view, ddlProvider, mapProperties) => { return undefined; } - const oldFullViewName = getFullViewName({ ...viewSchema, code: oldName, name: oldName }); + const oldFullViewName = getFullCollectionName({ ...viewSchema, code: oldName, name: oldName }); const dropScript = ddlProvider.dropView({ viewName: oldFullViewName }); - const schemaData = { schemaName: viewSchema.schemaName || '' }; - const viewData = { - name: newName, - keys: getKeys({ - viewSchema, - ddlProvider, - mapProperties, - collectionRefsDefinitionsMap: view.compMod?.collectionData?.collectionRefsDefinitionsMap ?? {}, - }), - schemaData, - }; - - const hydratedView = ddlProvider.hydrateView({ viewData, entityData: [viewSchema] }); - const createScript = ddlProvider.createView(hydratedView, {}, viewSchema.isActivated); + const createScript = createView(ddlProvider, mapProperties, view); return AlterScriptDto.getInstance([dropScript, createScript], true, false); }; diff --git a/forward_engineering/alterScript/alterScriptHelpers/viewHelpers/alterViewStatementHelper.js b/forward_engineering/alterScript/alterScriptHelpers/viewHelpers/alterViewStatementHelper.js new file mode 100644 index 0000000..220d087 --- /dev/null +++ b/forward_engineering/alterScript/alterScriptHelpers/viewHelpers/alterViewStatementHelper.js @@ -0,0 +1,27 @@ +const { getFullCollectionName, getSchemaOfAlterView, checkFieldPropertiesChanged } = require('../../../utils/general'); +const { AlterScriptDto } = require('../../types/AlterScriptDto'); +const { createView } = require('./createView'); + +/** + * @param {Object} view + * @param {Object} ddlProvider + * @param {Function} mapProperties + * @returns {AlterScriptDto | undefined} + */ +const getModifySelectStatementScriptDto = (view, ddlProvider, mapProperties) => { + const viewSchema = getSchemaOfAlterView(view); + + if (!checkFieldPropertiesChanged(viewSchema?.compMod, ['selectStatement'])) { + return undefined; + } + + const fullViewName = getFullCollectionName(viewSchema); + const dropScript = ddlProvider.dropView({ viewName: fullViewName }); + const createScript = createView(ddlProvider, mapProperties, view); + + return AlterScriptDto.getInstance([dropScript, createScript], true, false); +}; + +module.exports = { + getModifySelectStatementScriptDto, +}; diff --git a/forward_engineering/alterScript/alterScriptHelpers/viewHelpers/createView.js b/forward_engineering/alterScript/alterScriptHelpers/viewHelpers/createView.js new file mode 100644 index 0000000..f8c5709 --- /dev/null +++ b/forward_engineering/alterScript/alterScriptHelpers/viewHelpers/createView.js @@ -0,0 +1,34 @@ +const { getSchemaOfAlterView, getSchemaNameFromCollection } = require('../../../utils/general'); +const { getKeys } = require('./getKeys'); + +/** + * @param {Object} ddlProvider + * @param {Function} mapProperties + * @param {Object} view + * @returns {string} + */ +const createView = (ddlProvider, mapProperties, view) => { + const viewSchema = getSchemaOfAlterView(view); + const schemaName = getSchemaNameFromCollection({ collection: viewSchema }) || ''; + const schemaData = { schemaName }; + + const viewData = { + name: viewSchema.code || viewSchema.name, + keys: getKeys({ + viewSchema, + ddlProvider, + mapProperties, + collectionRefsDefinitionsMap: view.compMod?.collectionData?.collectionRefsDefinitionsMap ?? {}, + }), + schemaData, + }; + + const hydratedView = ddlProvider.hydrateView({ viewData, entityData: [viewSchema] }); + const script = ddlProvider.createView(hydratedView, {}, viewSchema.isActivated); + + return script; +}; + +module.exports = { + createView, +}; diff --git a/forward_engineering/ddlProvider/templates.js b/forward_engineering/ddlProvider/templates.js index 93048f3..5c67460 100644 --- a/forward_engineering/ddlProvider/templates.js +++ b/forward_engineering/ddlProvider/templates.js @@ -64,6 +64,4 @@ module.exports = { renameColumn: 'ALTER TABLE ${tableName} RENAME COLUMN ${oldColumnName} TO ${newColumnName};', dropView: 'DROP VIEW ${viewName};', - - renameView: 'RENAME VIEW ${oldViewName} TO ${newViewName};', }; diff --git a/forward_engineering/utils/general.js b/forward_engineering/utils/general.js index 13efc5f..6e6c18e 100644 --- a/forward_engineering/utils/general.js +++ b/forward_engineering/utils/general.js @@ -140,13 +140,6 @@ const getSchemaOfAlterView = view => { return { ...view, ...(omit(view?.role, 'properties') || {}) }; }; -const getFullViewName = viewSchema => { - const name = getEntityName(viewSchema); - const schemaName = viewSchema.compMod?.keyspaceName || ''; - - return getNamePrefixedWithSchemaName({ name, schemaName }); -}; - const isObjectInDeltaModelActivated = modelObject => { return modelObject.compMod?.isActivated?.new ?? modelObject.role?.isActivated; }; @@ -205,7 +198,6 @@ module.exports = { getEntityName, getSchemaOfAlterCollection, getSchemaOfAlterView, - getFullViewName, isObjectInDeltaModelActivated, isParentContainerActivated, getSchemaNameFromCollection, From 2f451778a453b799c3a5ce66bb86a39546584d34 Mon Sep 17 00:00:00 2001 From: yevhenii-moroziuk Date: Tue, 20 Jan 2026 19:21:59 +0200 Subject: [PATCH 4/6] HCK-14286: Code cleanup --- .../alterScriptHelpers/alterViewHelper.js | 24 ++-- .../columnHelpers/commentsHelper.js | 7 +- .../entityHelpers/commentsHelper.js | 7 +- .../viewHelpers/alterNameHelper.js | 29 ++--- .../viewHelpers/alterViewStatementHelper.js | 30 +++-- .../viewHelpers/commentsHelper.js | 7 +- .../viewHelpers/createDropViewHelper.js | 103 ++++++++++++++++++ .../viewHelpers/createView.js | 34 ------ .../alterScriptHelpers/viewHelpers/getKeys.js | 46 -------- .../ddlHelpers/comment/commentHelper.js | 27 +++++ forward_engineering/utils/general.js | 5 - 11 files changed, 192 insertions(+), 127 deletions(-) create mode 100644 forward_engineering/alterScript/alterScriptHelpers/viewHelpers/createDropViewHelper.js delete mode 100644 forward_engineering/alterScript/alterScriptHelpers/viewHelpers/createView.js delete mode 100644 forward_engineering/alterScript/alterScriptHelpers/viewHelpers/getKeys.js diff --git a/forward_engineering/alterScript/alterScriptHelpers/alterViewHelper.js b/forward_engineering/alterScript/alterScriptHelpers/alterViewHelper.js index dfc10fd..7c611ef 100644 --- a/forward_engineering/alterScript/alterScriptHelpers/alterViewHelper.js +++ b/forward_engineering/alterScript/alterScriptHelpers/alterViewHelper.js @@ -2,12 +2,11 @@ * @typedef {import('../../../shared/types').App} App */ const { getModifyViewCommentsScriptDtos } = require('./viewHelpers/commentsHelper'); -const { getModifyViewNameScriptDtos, getRenameViewScriptDto } = require('./viewHelpers/alterNameHelper'); +const { getRenameViewScriptDtos } = require('./viewHelpers/alterNameHelper'); const { AlterScriptDto } = require('../types/AlterScriptDto'); -const { wrapInQuotes, getSchemaOfAlterView, getFullCollectionName } = require('../../utils/general'); -const { getKeys } = require('./viewHelpers/getKeys'); -const { createView } = require('./viewHelpers/createView'); -const { getModifySelectStatementScriptDto } = require('./viewHelpers/alterViewStatementHelper'); +const { wrapInQuotes, getSchemaOfAlterCollection, getFullCollectionName } = require('../../utils/general'); +const { createView, dropView } = require('./viewHelpers/createDropViewHelper'); +const { getModifySelectStatementScriptDtos } = require('./viewHelpers/alterViewStatementHelper'); /** * @param {Object} ddlProvider @@ -15,7 +14,7 @@ const { getModifySelectStatementScriptDto } = require('./viewHelpers/alterViewSt * @returns {(view: Object) => AlterScriptDto} */ const getAddViewScriptDto = (ddlProvider, mapProperties) => view => { - const script = createView(ddlProvider, mapProperties, view); + const script = createView({ ddlProvider, mapProperties, view }); return AlterScriptDto.getInstance([script], true, false); }; @@ -25,19 +24,20 @@ const getAddViewScriptDto = (ddlProvider, mapProperties) => view => { * @returns {(view: Object) => AlterScriptDto} */ const getDeleteViewScriptDto = ddlProvider => view => { - const viewSchema = getSchemaOfAlterView(view); - const fullViewName = getFullCollectionName(viewSchema); - const script = ddlProvider.dropView({ viewName: fullViewName }); + const viewSchema = getSchemaOfAlterCollection(view); + const script = dropView({ ddlProvider, viewSchema }); return AlterScriptDto.getInstance([script], true, true); }; const getModifyViewScriptDtos = (ddlProvider, mapProperties) => view => { - const renameViewNameScriptDtos = getRenameViewScriptDto(view, ddlProvider, mapProperties); + const renameViewNameScriptDtos = getRenameViewScriptDtos(view, ddlProvider, mapProperties); + const modifySelectStatementScriptDtos = getModifySelectStatementScriptDtos(view, ddlProvider, mapProperties); const modifyCommentsScriptDtos = getModifyViewCommentsScriptDtos(view); - const modifySelectStatementScriptDto = getModifySelectStatementScriptDto(view, ddlProvider, mapProperties); - return [renameViewNameScriptDtos, modifySelectStatementScriptDto, ...modifyCommentsScriptDtos].filter(Boolean); + return [...renameViewNameScriptDtos, ...modifySelectStatementScriptDtos, ...modifyCommentsScriptDtos].filter( + Boolean, + ); }; /** diff --git a/forward_engineering/alterScript/alterScriptHelpers/columnHelpers/commentsHelper.js b/forward_engineering/alterScript/alterScriptHelpers/columnHelpers/commentsHelper.js index 485f048..4b78ce1 100644 --- a/forward_engineering/alterScript/alterScriptHelpers/columnHelpers/commentsHelper.js +++ b/forward_engineering/alterScript/alterScriptHelpers/columnHelpers/commentsHelper.js @@ -6,7 +6,10 @@ const { getSchemaOfAlterCollection, getFullCollectionName, } = require('../../../utils/general'); -const { getColumnCommentStatement } = require('../../../ddlProvider/ddlHelpers/comment/commentHelper'); +const { + getColumnCommentStatement, + dropTableColumnCommentStatement, +} = require('../../../ddlProvider/ddlHelpers/comment/commentHelper'); const getUpdatedCommentOnColumnScriptDtos = collection => { const isContainerActivated = isParentContainerActivated(collection); @@ -46,7 +49,7 @@ const getDeletedCommentOnColumnScriptDtos = collection => { }) .map(([columnName, jsonSchema]) => { const isActivated = isContainerActivated && isCollectionActivated && jsonSchema.isActivated; - const script = getColumnCommentStatement({ tableName, columnName, description: '' }); + const script = dropTableColumnCommentStatement({ tableName, columnName }); return { script, isActivated }; }) diff --git a/forward_engineering/alterScript/alterScriptHelpers/entityHelpers/commentsHelper.js b/forward_engineering/alterScript/alterScriptHelpers/entityHelpers/commentsHelper.js index b9e3a6c..f5efe69 100644 --- a/forward_engineering/alterScript/alterScriptHelpers/entityHelpers/commentsHelper.js +++ b/forward_engineering/alterScript/alterScriptHelpers/entityHelpers/commentsHelper.js @@ -6,7 +6,10 @@ const { getSchemaOfAlterCollection, getFullCollectionName, } = require('../../../utils/general'); -const { getTableCommentStatement } = require('../../../ddlProvider/ddlHelpers/comment/commentHelper'); +const { + getTableCommentStatement, + dropTableCommentStatement, +} = require('../../../ddlProvider/ddlHelpers/comment/commentHelper'); const getUpdatedCommentOnCollectionScriptDto = collection => { const descriptionInfo = collection?.role.compMod?.description; @@ -46,7 +49,7 @@ const getDeletedCommentOnCollectionScriptDto = collection => { const isContainerActivated = isParentContainerActivated(collection); const isCollectionActivated = isContainerActivated && isObjectInDeltaModelActivated(collection); - const script = getTableCommentStatement({ tableName, description: '' }); + const script = dropTableCommentStatement({ tableName }); return AlterScriptDto.getInstance([script], isCollectionActivated, true); }; diff --git a/forward_engineering/alterScript/alterScriptHelpers/viewHelpers/alterNameHelper.js b/forward_engineering/alterScript/alterScriptHelpers/viewHelpers/alterNameHelper.js index f4eb223..c5b90fa 100644 --- a/forward_engineering/alterScript/alterScriptHelpers/viewHelpers/alterNameHelper.js +++ b/forward_engineering/alterScript/alterScriptHelpers/viewHelpers/alterNameHelper.js @@ -1,7 +1,6 @@ const { AlterScriptDto } = require('../../types/AlterScriptDto'); -const { getFullCollectionName, getSchemaOfAlterView } = require('../../../utils/general'); -const { getKeys } = require('./getKeys'); -const { createView } = require('./createView'); +const { getFullCollectionName, getSchemaOfAlterCollection } = require('../../../utils/general'); +const { createView, dropView } = require('./createDropViewHelper'); /** * @param {Object} view @@ -9,28 +8,32 @@ const { createView } = require('./createView'); * @param {Function} mapProperties * @return {AlterScriptDto | undefined} */ -const getRenameViewScriptDto = (view, ddlProvider, mapProperties) => { - const viewSchema = getSchemaOfAlterView(view); +const getRenameViewScriptDtos = (view, ddlProvider, mapProperties) => { + const viewSchema = getSchemaOfAlterCollection(view); const viewName = viewSchema?.compMod?.name; if (!viewName) { - return undefined; + return [undefined]; } const { old: oldName, new: newName } = viewName; if (!newName || newName === oldName) { - return undefined; + return [undefined]; } - const oldFullViewName = getFullCollectionName({ ...viewSchema, code: oldName, name: oldName }); - const dropScript = ddlProvider.dropView({ viewName: oldFullViewName }); + const dropScript = dropView({ + ddlProvider, + viewSchema: { ...viewSchema, code: oldName, name: oldName }, + }); + const createScript = createView({ ddlProvider, mapProperties, view }); - const createScript = createView(ddlProvider, mapProperties, view); - - return AlterScriptDto.getInstance([dropScript, createScript], true, false); + return [ + AlterScriptDto.getInstance([dropScript], true, true), + AlterScriptDto.getInstance([createScript], true, false), + ]; }; module.exports = { - getRenameViewScriptDto, + getRenameViewScriptDtos, }; diff --git a/forward_engineering/alterScript/alterScriptHelpers/viewHelpers/alterViewStatementHelper.js b/forward_engineering/alterScript/alterScriptHelpers/viewHelpers/alterViewStatementHelper.js index 220d087..0c21a75 100644 --- a/forward_engineering/alterScript/alterScriptHelpers/viewHelpers/alterViewStatementHelper.js +++ b/forward_engineering/alterScript/alterScriptHelpers/viewHelpers/alterViewStatementHelper.js @@ -1,6 +1,10 @@ -const { getFullCollectionName, getSchemaOfAlterView, checkFieldPropertiesChanged } = require('../../../utils/general'); +const { + getFullCollectionName, + getSchemaOfAlterCollection, + checkFieldPropertiesChanged, +} = require('../../../utils/general'); const { AlterScriptDto } = require('../../types/AlterScriptDto'); -const { createView } = require('./createView'); +const { createView, dropView } = require('./createDropViewHelper'); /** * @param {Object} view @@ -8,20 +12,24 @@ const { createView } = require('./createView'); * @param {Function} mapProperties * @returns {AlterScriptDto | undefined} */ -const getModifySelectStatementScriptDto = (view, ddlProvider, mapProperties) => { - const viewSchema = getSchemaOfAlterView(view); +const getModifySelectStatementScriptDtos = (view, ddlProvider, mapProperties) => { + const viewSchema = getSchemaOfAlterCollection(view); - if (!checkFieldPropertiesChanged(viewSchema?.compMod, ['selectStatement'])) { - return undefined; + const selectStatement = viewSchema?.compMod?.selectStatement || {}; + + if ((!selectStatement.new && !selectStatement.old) || selectStatement.new === selectStatement.old) { + return [undefined]; } - const fullViewName = getFullCollectionName(viewSchema); - const dropScript = ddlProvider.dropView({ viewName: fullViewName }); - const createScript = createView(ddlProvider, mapProperties, view); + const dropScript = dropView({ viewSchema, ddlProvider }); + const createScript = createView({ ddlProvider, mapProperties, view }); - return AlterScriptDto.getInstance([dropScript, createScript], true, false); + return [ + AlterScriptDto.getInstance([dropScript], true, true), + AlterScriptDto.getInstance([createScript], true, false), + ]; }; module.exports = { - getModifySelectStatementScriptDto, + getModifySelectStatementScriptDtos, }; diff --git a/forward_engineering/alterScript/alterScriptHelpers/viewHelpers/commentsHelper.js b/forward_engineering/alterScript/alterScriptHelpers/viewHelpers/commentsHelper.js index 89bab01..61615f2 100644 --- a/forward_engineering/alterScript/alterScriptHelpers/viewHelpers/commentsHelper.js +++ b/forward_engineering/alterScript/alterScriptHelpers/viewHelpers/commentsHelper.js @@ -5,7 +5,10 @@ const { getFullCollectionName, getSchemaOfAlterCollection, } = require('../../../utils/general'); -const { getTableCommentStatement } = require('../../../ddlProvider/ddlHelpers/comment/commentHelper'); +const { + getTableCommentStatement, + dropTableCommentStatement, +} = require('../../../ddlProvider/ddlHelpers/comment/commentHelper'); const extractDescription = view => { return view?.role?.compMod?.description || {}; @@ -39,7 +42,7 @@ const getDropCommentsScriptDto = view => { const isContainerActivated = isParentContainerActivated(view); const isViewActivated = isContainerActivated && isObjectInDeltaModelActivated(view); - const script = getTableCommentStatement({ tableName: viewName, description: '' }); + const script = dropTableCommentStatement({ tableName: viewName }); return AlterScriptDto.getInstance([script], isViewActivated, true); } return undefined; diff --git a/forward_engineering/alterScript/alterScriptHelpers/viewHelpers/createDropViewHelper.js b/forward_engineering/alterScript/alterScriptHelpers/viewHelpers/createDropViewHelper.js new file mode 100644 index 0000000..c3151e6 --- /dev/null +++ b/forward_engineering/alterScript/alterScriptHelpers/viewHelpers/createDropViewHelper.js @@ -0,0 +1,103 @@ +const { get } = require('lodash'); +const { + getSchemaOfAlterCollection, + getSchemaNameFromCollection, + getFullCollectionName, +} = require('../../../utils/general'); + +/** + * @param {{ + * viewSchema: Object, + * collectionRefsDefinitionsMap: Object, + * mapProperties: Function, + * ddlProvider: Object + * }} param + */ +const getKeys = ({ viewSchema, collectionRefsDefinitionsMap, mapProperties, ddlProvider }) => { + return mapProperties(viewSchema, (propertyName, schema) => { + const definition = collectionRefsDefinitionsMap[schema.refId]; + + if (!definition) { + return ddlProvider.hydrateViewColumn({ + name: propertyName, + isActivated: schema.isActivated, + }); + } + + const entityName = + get(definition.collection, '[0].code', '') || get(definition.collection, '[0].collectionName', '') || ''; + const dbName = get(definition.bucket, '[0].code') || get(definition.bucket, '[0].name', ''); + const name = definition.name; + + if (name === propertyName) { + return ddlProvider.hydrateViewColumn({ + containerData: definition.bucket, + entityData: definition.collection, + isActivated: schema.isActivated, + definition: definition.definition, + entityName, + name, + dbName, + }); + } + + return ddlProvider.hydrateViewColumn({ + containerData: definition.bucket, + entityData: definition.collection, + isActivated: schema.isActivated, + definition: definition.definition, + alias: propertyName, + entityName, + name, + dbName, + }); + }); +}; + +/** + * @param {{ + * ddlProvider: Object, + * mapProperties: Function, + * view: Object + * }} param + * @returns {string} + */ +const createView = ({ ddlProvider, mapProperties, view }) => { + const viewSchema = getSchemaOfAlterCollection(view); + const schemaName = getSchemaNameFromCollection({ collection: viewSchema }) || ''; + const schemaData = { schemaName }; + + const viewData = { + name: viewSchema.code || viewSchema.name, + keys: getKeys({ + viewSchema, + ddlProvider, + mapProperties, + collectionRefsDefinitionsMap: view.compMod?.collectionData?.collectionRefsDefinitionsMap ?? {}, + }), + schemaData, + }; + + const hydratedView = ddlProvider.hydrateView({ viewData, entityData: [viewSchema] }); + const script = ddlProvider.createView(hydratedView, {}, viewSchema.isActivated); + + return script; +}; + +/** + * @param {{ + * ddlProvider: Object, + * viewSchema: Object + * }} param + * @returns {string} + */ +const dropView = ({ ddlProvider, viewSchema }) => { + const viewName = getFullCollectionName(viewSchema); + + return ddlProvider.dropView({ viewName }); +}; + +module.exports = { + createView, + dropView, +}; diff --git a/forward_engineering/alterScript/alterScriptHelpers/viewHelpers/createView.js b/forward_engineering/alterScript/alterScriptHelpers/viewHelpers/createView.js deleted file mode 100644 index f8c5709..0000000 --- a/forward_engineering/alterScript/alterScriptHelpers/viewHelpers/createView.js +++ /dev/null @@ -1,34 +0,0 @@ -const { getSchemaOfAlterView, getSchemaNameFromCollection } = require('../../../utils/general'); -const { getKeys } = require('./getKeys'); - -/** - * @param {Object} ddlProvider - * @param {Function} mapProperties - * @param {Object} view - * @returns {string} - */ -const createView = (ddlProvider, mapProperties, view) => { - const viewSchema = getSchemaOfAlterView(view); - const schemaName = getSchemaNameFromCollection({ collection: viewSchema }) || ''; - const schemaData = { schemaName }; - - const viewData = { - name: viewSchema.code || viewSchema.name, - keys: getKeys({ - viewSchema, - ddlProvider, - mapProperties, - collectionRefsDefinitionsMap: view.compMod?.collectionData?.collectionRefsDefinitionsMap ?? {}, - }), - schemaData, - }; - - const hydratedView = ddlProvider.hydrateView({ viewData, entityData: [viewSchema] }); - const script = ddlProvider.createView(hydratedView, {}, viewSchema.isActivated); - - return script; -}; - -module.exports = { - createView, -}; diff --git a/forward_engineering/alterScript/alterScriptHelpers/viewHelpers/getKeys.js b/forward_engineering/alterScript/alterScriptHelpers/viewHelpers/getKeys.js deleted file mode 100644 index 33c9cd6..0000000 --- a/forward_engineering/alterScript/alterScriptHelpers/viewHelpers/getKeys.js +++ /dev/null @@ -1,46 +0,0 @@ -const { get } = require('lodash'); - -const getKeys = ({ viewSchema, collectionRefsDefinitionsMap, mapProperties, ddlProvider }) => { - return mapProperties(viewSchema, (propertyName, schema) => { - const definition = collectionRefsDefinitionsMap[schema.refId]; - - if (!definition) { - return ddlProvider.hydrateViewColumn({ - name: propertyName, - isActivated: schema.isActivated, - }); - } - - const entityName = - get(definition.collection, '[0].code', '') || get(definition.collection, '[0].collectionName', '') || ''; - const dbName = get(definition.bucket, '[0].code') || get(definition.bucket, '[0].name', ''); - const name = definition.name; - - if (name === propertyName) { - return ddlProvider.hydrateViewColumn({ - containerData: definition.bucket, - entityData: definition.collection, - isActivated: schema.isActivated, - definition: definition.definition, - entityName, - name, - dbName, - }); - } - - return ddlProvider.hydrateViewColumn({ - containerData: definition.bucket, - entityData: definition.collection, - isActivated: schema.isActivated, - definition: definition.definition, - alias: propertyName, - entityName, - name, - dbName, - }); - }); -}; - -module.exports = { - getKeys, -}; diff --git a/forward_engineering/ddlProvider/ddlHelpers/comment/commentHelper.js b/forward_engineering/ddlProvider/ddlHelpers/comment/commentHelper.js index 3ca70c6..e5d85a6 100644 --- a/forward_engineering/ddlProvider/ddlHelpers/comment/commentHelper.js +++ b/forward_engineering/ddlProvider/ddlHelpers/comment/commentHelper.js @@ -130,6 +130,31 @@ const dropSchemaCommentStatement = ({ schemaName }) => { }); }; +/** + * @param {{ tableName: string }} + * @returns {string} + */ +const dropTableCommentStatement = ({ tableName }) => { + return getCommentStatement({ + objectName: tableName, + objectType: OBJECT_TYPE.table, + mode: COMMENT_MODE.remove, + }); +}; + +/** + * @param {{ tableName: string, columnName: string }} + * @returns {string} + */ +const dropTableColumnCommentStatement = ({ tableName, columnName }) => { + const objectName = tableName + '.' + wrapInQuotes(columnName); + return getCommentStatement({ + objectName, + objectType: OBJECT_TYPE.column, + mode: COMMENT_MODE.remove, + }); +}; + module.exports = { getColumnCommentStatement, getSchemaCommentStatement, @@ -138,4 +163,6 @@ module.exports = { getIndexCommentStatement, dropSchemaCommentStatement, + dropTableCommentStatement, + dropTableColumnCommentStatement, }; diff --git a/forward_engineering/utils/general.js b/forward_engineering/utils/general.js index 6e6c18e..37aa491 100644 --- a/forward_engineering/utils/general.js +++ b/forward_engineering/utils/general.js @@ -136,10 +136,6 @@ const getSchemaOfAlterCollection = collection => { return { ...collection, ...(omit(collection?.role, 'properties') || {}) }; }; -const getSchemaOfAlterView = view => { - return { ...view, ...(omit(view?.role, 'properties') || {}) }; -}; - const isObjectInDeltaModelActivated = modelObject => { return modelObject.compMod?.isActivated?.new ?? modelObject.role?.isActivated; }; @@ -197,7 +193,6 @@ module.exports = { getFullCollectionName, getEntityName, getSchemaOfAlterCollection, - getSchemaOfAlterView, isObjectInDeltaModelActivated, isParentContainerActivated, getSchemaNameFromCollection, From 28bcee4f3adb318f8a32b8d4d1cef64be2ef6831 Mon Sep 17 00:00:00 2001 From: yevhenii-moroziuk Date: Wed, 21 Jan 2026 10:02:41 +0200 Subject: [PATCH 5/6] HCK-14286: Remove unused imports --- .../alterScript/alterScriptHelpers/alterViewHelper.js | 7 ++++++- .../alterScriptHelpers/viewHelpers/alterNameHelper.js | 2 +- .../viewHelpers/alterViewStatementHelper.js | 7 +------ 3 files changed, 8 insertions(+), 8 deletions(-) diff --git a/forward_engineering/alterScript/alterScriptHelpers/alterViewHelper.js b/forward_engineering/alterScript/alterScriptHelpers/alterViewHelper.js index 7c611ef..ae0f447 100644 --- a/forward_engineering/alterScript/alterScriptHelpers/alterViewHelper.js +++ b/forward_engineering/alterScript/alterScriptHelpers/alterViewHelper.js @@ -4,7 +4,7 @@ const { getModifyViewCommentsScriptDtos } = require('./viewHelpers/commentsHelper'); const { getRenameViewScriptDtos } = require('./viewHelpers/alterNameHelper'); const { AlterScriptDto } = require('../types/AlterScriptDto'); -const { wrapInQuotes, getSchemaOfAlterCollection, getFullCollectionName } = require('../../utils/general'); +const { getSchemaOfAlterCollection } = require('../../utils/general'); const { createView, dropView } = require('./viewHelpers/createDropViewHelper'); const { getModifySelectStatementScriptDtos } = require('./viewHelpers/alterViewStatementHelper'); @@ -30,6 +30,11 @@ const getDeleteViewScriptDto = ddlProvider => view => { return AlterScriptDto.getInstance([script], true, true); }; +/** + * @param {Object} ddlProvider + * @param {Function} mapProperties + * @returns {(view: Object) => Array} + */ const getModifyViewScriptDtos = (ddlProvider, mapProperties) => view => { const renameViewNameScriptDtos = getRenameViewScriptDtos(view, ddlProvider, mapProperties); const modifySelectStatementScriptDtos = getModifySelectStatementScriptDtos(view, ddlProvider, mapProperties); diff --git a/forward_engineering/alterScript/alterScriptHelpers/viewHelpers/alterNameHelper.js b/forward_engineering/alterScript/alterScriptHelpers/viewHelpers/alterNameHelper.js index c5b90fa..225acce 100644 --- a/forward_engineering/alterScript/alterScriptHelpers/viewHelpers/alterNameHelper.js +++ b/forward_engineering/alterScript/alterScriptHelpers/viewHelpers/alterNameHelper.js @@ -1,5 +1,5 @@ const { AlterScriptDto } = require('../../types/AlterScriptDto'); -const { getFullCollectionName, getSchemaOfAlterCollection } = require('../../../utils/general'); +const { getSchemaOfAlterCollection } = require('../../../utils/general'); const { createView, dropView } = require('./createDropViewHelper'); /** diff --git a/forward_engineering/alterScript/alterScriptHelpers/viewHelpers/alterViewStatementHelper.js b/forward_engineering/alterScript/alterScriptHelpers/viewHelpers/alterViewStatementHelper.js index 0c21a75..92dabce 100644 --- a/forward_engineering/alterScript/alterScriptHelpers/viewHelpers/alterViewStatementHelper.js +++ b/forward_engineering/alterScript/alterScriptHelpers/viewHelpers/alterViewStatementHelper.js @@ -1,8 +1,4 @@ -const { - getFullCollectionName, - getSchemaOfAlterCollection, - checkFieldPropertiesChanged, -} = require('../../../utils/general'); +const { getSchemaOfAlterCollection } = require('../../../utils/general'); const { AlterScriptDto } = require('../../types/AlterScriptDto'); const { createView, dropView } = require('./createDropViewHelper'); @@ -14,7 +10,6 @@ const { createView, dropView } = require('./createDropViewHelper'); */ const getModifySelectStatementScriptDtos = (view, ddlProvider, mapProperties) => { const viewSchema = getSchemaOfAlterCollection(view); - const selectStatement = viewSchema?.compMod?.selectStatement || {}; if ((!selectStatement.new && !selectStatement.old) || selectStatement.new === selectStatement.old) { From d3f569a43ca76c4e1549ae437ac1aa1abd4df97a Mon Sep 17 00:00:00 2001 From: yevhenii-moroziuk Date: Sat, 24 Jan 2026 15:38:38 +0200 Subject: [PATCH 6/6] HCK-14476: Add logic to alter table names --- .../alterScript/alterScriptFromDeltaHelper.js | 2 +- .../alterScriptHelpers/alterEntityHelper.js | 6 ++- .../entityHelpers/alterTableNameHelper.js | 53 +++++++++++++++++++ forward_engineering/ddlProvider/templates.js | 2 + 4 files changed, 61 insertions(+), 2 deletions(-) create mode 100644 forward_engineering/alterScript/alterScriptHelpers/entityHelpers/alterTableNameHelper.js diff --git a/forward_engineering/alterScript/alterScriptFromDeltaHelper.js b/forward_engineering/alterScript/alterScriptFromDeltaHelper.js index deb20b1..8306a52 100644 --- a/forward_engineering/alterScript/alterScriptFromDeltaHelper.js +++ b/forward_engineering/alterScript/alterScriptFromDeltaHelper.js @@ -100,8 +100,8 @@ const getAlterCollectionScriptDtos = ({ return [ ...deletedCollectionScriptDtos, ...addedCollectionScriptDtos, - ...modifyCollectionScriptDtos, ...deletedColumnScriptDtos, + ...modifyCollectionScriptDtos, ...addedColumnScriptDtos, ...modifyColumnScriptDtos, ...modifyCollectionKeysScriptDtos, diff --git a/forward_engineering/alterScript/alterScriptHelpers/alterEntityHelper.js b/forward_engineering/alterScript/alterScriptHelpers/alterEntityHelper.js index 68a6a4a..0148f52 100644 --- a/forward_engineering/alterScript/alterScriptHelpers/alterEntityHelper.js +++ b/forward_engineering/alterScript/alterScriptHelpers/alterEntityHelper.js @@ -21,6 +21,7 @@ const { } = require('../../utils/general'); const { getRelationshipName } = require('./alterForeignKeyHelper'); const { createColumnDefinitionBySchema } = require('./createColumnDefinition'); +const { getRenameTableScriptDtos } = require('./entityHelpers/alterTableNameHelper'); /** * @param {Object} ddlProvider @@ -99,9 +100,12 @@ const getDeleteCollectionScriptDto = ddlProvider => collection => { * @returns {Array} */ const getModifyCollectionScriptDtos = collection => { + const modifyCollectionNameScriptDtos = getRenameTableScriptDtos(collection); const modifyCheckConstraintScriptDtos = getModifyCheckConstraintScriptDtos(collection); const modifyCommentScriptDtos = getModifyEntityCommentsScriptDtos(collection); - return [...modifyCheckConstraintScriptDtos, ...modifyCommentScriptDtos].filter(Boolean); + return [...modifyCollectionNameScriptDtos, ...modifyCheckConstraintScriptDtos, ...modifyCommentScriptDtos].filter( + Boolean, + ); }; /** diff --git a/forward_engineering/alterScript/alterScriptHelpers/entityHelpers/alterTableNameHelper.js b/forward_engineering/alterScript/alterScriptHelpers/entityHelpers/alterTableNameHelper.js new file mode 100644 index 0000000..d39adf1 --- /dev/null +++ b/forward_engineering/alterScript/alterScriptHelpers/entityHelpers/alterTableNameHelper.js @@ -0,0 +1,53 @@ +const { AlterScriptDto } = require('../../types/AlterScriptDto'); +const { + isParentContainerActivated, + isObjectInDeltaModelActivated, + getSchemaOfAlterCollection, + getSchemaNameFromCollection, + getNamePrefixedWithSchemaName, +} = require('../../../utils/general'); +const { assignTemplates } = require('../../../utils/assignTemplates'); +const templates = require('../../../ddlProvider/templates'); + +/** + * @param {string} oldTableName + * @param {string} newTableName + * @return string + */ +const alterTableName = (oldTableName, newTableName) => { + return assignTemplates({ template: templates.renameTable, templateData: { oldTableName, newTableName } }); +}; + +/** + * @param {Object} collection + * @returns {Array} + */ +const getRenameTableScriptDtos = collection => { + const collectionSchema = getSchemaOfAlterCollection(collection); + const tableName = collectionSchema?.compMod?.collectionName; + + if (!tableName) { + return []; + } + + const { old: oldName, new: newName } = tableName; + + if (!newName || newName === oldName) { + return []; + } + + const schemaName = getSchemaNameFromCollection({ collection: collectionSchema }); + const isContainerActivated = isParentContainerActivated(collection); + const isCollectionActivated = isContainerActivated && isObjectInDeltaModelActivated(collection); + + const script = alterTableName( + getNamePrefixedWithSchemaName({ name: oldName, schemaName }), + getNamePrefixedWithSchemaName({ name: newName, schemaName }), + ); + + return [AlterScriptDto.getInstance([script], isCollectionActivated, false)]; +}; + +module.exports = { + getRenameTableScriptDtos, +}; diff --git a/forward_engineering/ddlProvider/templates.js b/forward_engineering/ddlProvider/templates.js index 5c67460..57906fc 100644 --- a/forward_engineering/ddlProvider/templates.js +++ b/forward_engineering/ddlProvider/templates.js @@ -64,4 +64,6 @@ module.exports = { renameColumn: 'ALTER TABLE ${tableName} RENAME COLUMN ${oldColumnName} TO ${newColumnName};', dropView: 'DROP VIEW ${viewName};', + + renameTable: 'RENAME TABLE ${oldTableName} TO ${newTableName};', };