From f2d6ec78e43761004bb52ed2daba8cefa84ca8fc Mon Sep 17 00:00:00 2001 From: yevhenii-moroziuk Date: Wed, 14 Jan 2026 11:24:29 +0200 Subject: [PATCH 01/12] HCK-14285: Add logic to display added/dropped tables --- .../alterScript/alterScriptFromDeltaHelper.js | 41 +++++-- .../alterScriptHelpers/alterEntityHelper.js | 89 ++++++++++++++- .../alterForeignKeyHelper.js | 32 +++--- .../createColumnDefinition.js | 105 ++++++++++++++++++ .../ddlProvider/ddlProvider.js | 4 + forward_engineering/ddlProvider/templates.js | 2 + 6 files changed, 246 insertions(+), 27 deletions(-) create mode 100644 forward_engineering/alterScript/alterScriptHelpers/createColumnDefinition.js diff --git a/forward_engineering/alterScript/alterScriptFromDeltaHelper.js b/forward_engineering/alterScript/alterScriptFromDeltaHelper.js index 8207516..356e704 100644 --- a/forward_engineering/alterScript/alterScriptFromDeltaHelper.js +++ b/forward_engineering/alterScript/alterScriptFromDeltaHelper.js @@ -1,9 +1,5 @@ const { getContainersScripts } = require('./alterScriptHelpers/alterContainerHelper'); -const { - getModifyCollectionScriptDtos, - getModifyCollectionKeysScriptDtos, - getModifyColumnScriptDtos, -} = require('./alterScriptHelpers/alterEntityHelper'); +const { getEntitiesScripts } = require('./alterScriptHelpers/alterEntityHelper'); const { getDeleteForeignKeyScriptDtos, getAddForeignKeyScriptDtos, @@ -50,18 +46,40 @@ const getAlterCollectionScriptDtos = ({ modelDefinitions, internalDefinitions, externalDefinitions, + inlineDeltaRelationships = [], }) => { - const modifyScriptsData = getItems(collection.properties?.entities?.properties?.modified).map( - item => Object.values(item.properties)[0], - ); + const { added, deleted, modified } = collection.properties?.entities?.properties || {}; + const addedContainers = getItems(added); + const deletedContainers = getItems(deleted); + const modifyScriptsData = getItems(modified).map(item => Object.values(item.properties)[0]); + + const { + getAddCollectionScriptDto, + getDeleteCollectionScriptDto, + getModifyCollectionScriptDtos, + getModifyCollectionKeysScriptDtos, + getModifyColumnScriptDtos, + } = getEntitiesScripts(app, inlineDeltaRelationships); + + const addedCollectionScriptDtos = addedContainers + .map(container => Object.values(container.properties)[0]) + .flatMap(getAddCollectionScriptDto); + + const deletedCollectionScriptDtos = deletedContainers + .map(container => Object.values(container.properties)[0]) + .flatMap(getDeleteCollectionScriptDto); const modifyCollectionScriptDtos = modifyScriptsData.flatMap(getModifyCollectionScriptDtos); const modifyCollectionKeysScriptDtos = modifyScriptsData.flatMap(getModifyCollectionKeysScriptDtos); const modifyColumnScriptDtos = modifyScriptsData.flatMap(getModifyColumnScriptDtos); - return [...modifyCollectionScriptDtos, ...modifyColumnScriptDtos, ...modifyCollectionKeysScriptDtos].filter( - Boolean, - ); + return [ + ...deletedCollectionScriptDtos, + ...addedCollectionScriptDtos, + ...modifyCollectionScriptDtos, + ...modifyColumnScriptDtos, + ...modifyCollectionKeysScriptDtos, + ].filter(Boolean); }; const getAlterViewScriptDtos = collection => { @@ -167,6 +185,7 @@ const getAlterScriptDtos = (data, app) => { modelDefinitions, internalDefinitions, externalDefinitions, + inlineDeltaRelationships, }); const viewScriptDtos = getAlterViewScriptDtos(collection); diff --git a/forward_engineering/alterScript/alterScriptHelpers/alterEntityHelper.js b/forward_engineering/alterScript/alterScriptHelpers/alterEntityHelper.js index ddf91b4..b41816f 100644 --- a/forward_engineering/alterScript/alterScriptHelpers/alterEntityHelper.js +++ b/forward_engineering/alterScript/alterScriptHelpers/alterEntityHelper.js @@ -1,3 +1,5 @@ +const { omit, toPairs } = require('lodash'); +const { AlterScriptDto } = require('../types/AlterScriptDto'); const { getModifiedCommentOnColumnScriptDtos } = require('./columnHelpers/commentsHelper'); const { getModifyNonNullColumnsScriptDtos } = require('./columnHelpers/nonNullConstraintHelper'); const { getModifyCheckConstraintScriptDtos } = require('./entityHelpers/checkConstraintHelper'); @@ -5,6 +7,77 @@ const { getModifyEntityCommentsScriptDtos } = require('./entityHelpers/commentsH const { getModifyPkConstraintsScriptDtos } = require('./entityHelpers/primaryKeyHelper'); const { getModifyUkConstraintsScriptDtos } = require('./entityHelpers/uniqueKeyHelper'); const { getModifiedDefaultColumnValueScriptDtos } = require('./columnHelpers/defaultValueHelper'); +const { + getEntityName, + getSchemaNameFromCollection, + getSchemaOfAlterCollection, + getFullCollectionName, +} = require('../../utils/general'); +const { getRelationshipName } = require('./alterForeignKeyHelper'); +const { createColumnDefinitionBySchema } = require('./createColumnDefinition'); + +const getAddCollectionScriptDto = (ddlProvider, inlineDeltaRelationships) => collection => { + const jsonSchema = { ...collection, ...(omit(collection?.role, 'properties') || {}) }; + const schemaName = getSchemaNameFromCollection({ collection }); + const schemaData = { schemaName }; + + const columnDefinitions = toPairs(jsonSchema.properties).map(([name, column]) => + createColumnDefinitionBySchema({ + name, + jsonSchema: column, + parentJsonSchema: jsonSchema, + ddlProvider, + schemaData, + }), + ); + + const checkConstraints = (jsonSchema.chkConstr || []).map(check => + ddlProvider.createCheckConstraint(ddlProvider.hydrateCheckConstraint(check)), + ); + + const foreignKeyConstraints = inlineDeltaRelationships + .filter(relationship => relationship.role.childCollection === collection.role.id) + .map(relationship => { + const compMod = relationship.role.compMod; + const relationshipName = compMod.code?.new || compMod.name?.new || getRelationshipName(relationship) || ''; + return ddlProvider.createForeignKeyConstraint( + { + name: relationshipName, + foreignKey: compMod.child.collection.fkFields, + primaryTable: compMod.parent.collection.name, + primaryKey: compMod.parent.collection.fkFields, + primaryTableActivated: compMod.parent.collection.isActivated, + foreignTableActivated: compMod.child.collection.isActivated, + primarySchemaName: compMod.parent.bucket.name, + customProperties: compMod.customProperties?.new, + }, + {}, + schemaData, + ); + }); + + const tableData = { + name: getEntityName(jsonSchema), + columns: columnDefinitions.map(def => ddlProvider.convertColumnDefinition(def)), + checkConstraints, + foreignKeyConstraints, + schemaData, + columnDefinitions, + }; + + const hydratedTable = ddlProvider.hydrateTable({ tableData, entityData: [jsonSchema], jsonSchema }); + const script = ddlProvider.createTable(hydratedTable, jsonSchema.isActivated); + + return AlterScriptDto.getInstance([script], true, false); +}; + +const getDeleteCollectionScriptDto = ddlProvider => collection => { + const collectionSchema = getSchemaOfAlterCollection(collection); + const fullTableName = getFullCollectionName(collectionSchema); + const script = ddlProvider.dropTable({ tableName: fullTableName }); + + return AlterScriptDto.getInstance([script], true, true); +}; const getModifyCollectionScriptDtos = collection => { const modifyCheckConstraintScriptDtos = getModifyCheckConstraintScriptDtos(collection); @@ -28,8 +101,18 @@ const getModifyColumnScriptDtos = collection => { ); }; +const getEntitiesScripts = (app, inlineDeltaRelationships) => { + const ddlProvider = require('../../ddlProvider/ddlProvider')(null, null, app); + + return { + getAddCollectionScriptDto: getAddCollectionScriptDto(ddlProvider, inlineDeltaRelationships), + getDeleteCollectionScriptDto: getDeleteCollectionScriptDto(ddlProvider), + getModifyCollectionScriptDtos, + getModifyColumnScriptDtos, + getModifyCollectionKeysScriptDtos, + }; +}; + module.exports = { - getModifyCollectionScriptDtos, - getModifyColumnScriptDtos, - getModifyCollectionKeysScriptDtos, + getEntitiesScripts, }; diff --git a/forward_engineering/alterScript/alterScriptHelpers/alterForeignKeyHelper.js b/forward_engineering/alterScript/alterScriptHelpers/alterForeignKeyHelper.js index d201455..1ffd39e 100644 --- a/forward_engineering/alterScript/alterScriptHelpers/alterForeignKeyHelper.js +++ b/forward_engineering/alterScript/alterScriptHelpers/alterForeignKeyHelper.js @@ -24,20 +24,26 @@ const getAddSingleForeignKeyStatementDto = relationship => { const relationshipName = getRelationshipName(relationship); const ddlProvider = require('../../ddlProvider/ddlProvider')(); + const schemaData = { + schemaName: compMod.child.bucket.name, + }; - return ddlProvider.createForeignKey({ - name: relationshipName, - foreignKey: compMod.child.collection.fkFields, - primaryKey: compMod.parent.collection.fkFields, - customProperties: compMod.customProperties?.new, - foreignTable: compMod.child.collection.name, - foreignSchemaName: compMod.child.bucket.name, - foreignTableActivated: compMod.child.collection.isActivated, - primaryTable: compMod.parent.collection.name, - primarySchemaName: compMod.parent.bucket.name, - primaryTableActivated: compMod.parent.collection.isActivated, - isActivated: Boolean(relationship.role?.compMod?.isActivated?.new), - }); + return ddlProvider.createForeignKey( + { + name: relationshipName, + foreignKey: compMod.child.collection.fkFields, + primaryKey: compMod.parent.collection.fkFields, + customProperties: compMod.customProperties?.new, + foreignTable: compMod.child.collection.name, + foreignSchemaName: compMod.child.bucket.name, + foreignTableActivated: compMod.child.collection.isActivated, + primaryTable: compMod.parent.collection.name, + primarySchemaName: compMod.parent.bucket.name, + primaryTableActivated: compMod.parent.collection.isActivated, + }, + {}, + schemaData, + ); }; const canRelationshipBeAdded = relationship => { diff --git a/forward_engineering/alterScript/alterScriptHelpers/createColumnDefinition.js b/forward_engineering/alterScript/alterScriptHelpers/createColumnDefinition.js new file mode 100644 index 0000000..23a57e6 --- /dev/null +++ b/forward_engineering/alterScript/alterScriptHelpers/createColumnDefinition.js @@ -0,0 +1,105 @@ +const { isBoolean, isNumber } = require('lodash'); + +const createColumnDefinition = data => ({ + name: '', + type: '', + nullable: true, + primaryKey: false, + default: '', + length: '', + scale: '', + precision: '', + hasMaxLength: false, + expression: '', + ...data, +}); + +const isNullable = (parentSchema, propertyName) => { + if (!Array.isArray(parentSchema.required)) { + return true; + } + + return !parentSchema.required.includes(propertyName); +}; + +const getDefault = jsonSchema => { + const defaultValue = jsonSchema.default; + + if (isBoolean(defaultValue)) { + return defaultValue; + } else if (jsonSchema.default === null) { + return 'NULL'; + } + + return defaultValue; +}; + +const getLength = jsonSchema => { + if (isNumber(jsonSchema.length)) { + return jsonSchema.length; + } else if (isNumber(jsonSchema.maxLength)) { + return jsonSchema.maxLength; + } + + return ''; +}; + +const getScale = jsonSchema => { + if (isNumber(jsonSchema.scale)) { + return jsonSchema.scale; + } + + return ''; +}; + +const getPrecision = jsonSchema => { + if (isNumber(jsonSchema.precision)) { + return jsonSchema.precision; + } else if (isNumber(jsonSchema.fractSecPrecision)) { + return jsonSchema.fractSecPrecision; + } + + return ''; +}; + +const hasMaxLength = jsonSchema => { + if (jsonSchema.hasMaxLength) { + return jsonSchema.hasMaxLength; + } + + return ''; +}; + +const getType = jsonSchema => { + if (jsonSchema.$ref) { + return jsonSchema.$ref.split('/').pop(); + } + + return jsonSchema.mode || jsonSchema.childType || jsonSchema.type; +}; + +const createColumnDefinitionBySchema = ({ name, jsonSchema, parentJsonSchema, ddlProvider, schemaData }) => { + const columnDefinition = createColumnDefinition({ + name: name, + type: getType(jsonSchema), + nullable: isNullable(parentJsonSchema, name), + default: getDefault(jsonSchema), + primaryKey: jsonSchema.primaryKey, + length: getLength(jsonSchema), + scale: getScale(jsonSchema), + precision: getPrecision(jsonSchema), + hasMaxLength: hasMaxLength(jsonSchema), + isActivated: jsonSchema.isActivated, + expression: jsonSchema.expression, + }); + + return ddlProvider.hydrateColumn({ + columnDefinition, + jsonSchema, + schemaData: {}, + }); +}; + +module.exports = { + createColumnDefinitionBySchema, +}; diff --git a/forward_engineering/ddlProvider/ddlProvider.js b/forward_engineering/ddlProvider/ddlProvider.js index 3f5287c..ecdbe9a 100644 --- a/forward_engineering/ddlProvider/ddlProvider.js +++ b/forward_engineering/ddlProvider/ddlProvider.js @@ -407,6 +407,10 @@ module.exports = (baseProvider, options, app) => { }); }, + dropTable({ tableName }) { + return assignTemplates({ template: templates.dropTable, templateData: { tableName } }); + }, + 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..680c4c9 100644 --- a/forward_engineering/ddlProvider/templates.js +++ b/forward_engineering/ddlProvider/templates.js @@ -7,6 +7,8 @@ module.exports = { createTable: 'CREATE${tableType} TABLE${ifNotExists} ${name}${tableProps}${tableOptions};', + dropTable: 'DROP TABLE ${tableName};', + createAuxiliaryTable: 'CREATE${tableType} TABLE ${name}${tableOptions};', comment: '\nCOMMENT ON ${objectType} ${objectName} IS ${comment};\n', From cb6c4cc07d9c37ffad04a7ced6314369738f0274 Mon Sep 17 00:00:00 2001 From: yevhenii-moroziuk Date: Wed, 14 Jan 2026 17:44:22 +0200 Subject: [PATCH 02/12] HCK-14285: Fix deleting of wrong tables --- .../alterScript/alterScriptFromDeltaHelper.js | 14 ++++++++------ 1 file changed, 8 insertions(+), 6 deletions(-) diff --git a/forward_engineering/alterScript/alterScriptFromDeltaHelper.js b/forward_engineering/alterScript/alterScriptFromDeltaHelper.js index 356e704..4d81cb0 100644 --- a/forward_engineering/alterScript/alterScriptFromDeltaHelper.js +++ b/forward_engineering/alterScript/alterScriptFromDeltaHelper.js @@ -49,8 +49,8 @@ const getAlterCollectionScriptDtos = ({ inlineDeltaRelationships = [], }) => { const { added, deleted, modified } = collection.properties?.entities?.properties || {}; - const addedContainers = getItems(added); - const deletedContainers = getItems(deleted); + const addedCollections = getItems(added); + const deletedCollections = getItems(deleted); const modifyScriptsData = getItems(modified).map(item => Object.values(item.properties)[0]); const { @@ -61,12 +61,14 @@ const getAlterCollectionScriptDtos = ({ getModifyColumnScriptDtos, } = getEntitiesScripts(app, inlineDeltaRelationships); - const addedCollectionScriptDtos = addedContainers - .map(container => Object.values(container.properties)[0]) + const addedCollectionScriptDtos = addedCollections + .map(collection => Object.values(collection.properties)[0]) + .filter(collection => collection.role.compMod.created) .flatMap(getAddCollectionScriptDto); - const deletedCollectionScriptDtos = deletedContainers - .map(container => Object.values(container.properties)[0]) + const deletedCollectionScriptDtos = deletedCollections + .map(collection => Object.values(collection.properties)[0]) + .filter(collection => collection.role.compMod.deleted) .flatMap(getDeleteCollectionScriptDto); const modifyCollectionScriptDtos = modifyScriptsData.flatMap(getModifyCollectionScriptDtos); From 2461552b1ccceeaf003d3ef944a222c6ca75af1c Mon Sep 17 00:00:00 2001 From: yevhenii-moroziuk Date: Thu, 15 Jan 2026 10:21:06 +0200 Subject: [PATCH 03/12] HCK-14285: Add logic to create/drop table column --- .../alterScript/alterScriptFromDeltaHelper.js | 30 ++++++++++++-- .../alterScriptHelpers/alterEntityHelper.js | 40 +++++++++++++++++++ .../ddlProvider/ddlProvider.js | 8 ++++ forward_engineering/ddlProvider/templates.js | 4 ++ 4 files changed, 79 insertions(+), 3 deletions(-) diff --git a/forward_engineering/alterScript/alterScriptFromDeltaHelper.js b/forward_engineering/alterScript/alterScriptFromDeltaHelper.js index 4d81cb0..cb0ec95 100644 --- a/forward_engineering/alterScript/alterScriptFromDeltaHelper.js +++ b/forward_engineering/alterScript/alterScriptFromDeltaHelper.js @@ -37,7 +37,10 @@ const getAlterContainersScriptDtos = ({ collection, app }) => { .map(containerWrapper => Object.values(containerWrapper.properties)[0]) .flatMap(getModifyContainerScriptDto); - return [...addContainersScriptDtos, ...deleteContainersScriptDtos, ...modifyContainersScriptDtos].filter(Boolean); + return { + deletedContainersScriptDtos: deleteContainersScriptDtos, + upsertedContainersScriptDtos: [...addContainersScriptDtos, ...modifyContainersScriptDtos], + }; }; const getAlterCollectionScriptDtos = ({ @@ -59,6 +62,8 @@ const getAlterCollectionScriptDtos = ({ getModifyCollectionScriptDtos, getModifyCollectionKeysScriptDtos, getModifyColumnScriptDtos, + getAddColumnScriptDtos, + getDeleteColumnScriptDtos, } = getEntitiesScripts(app, inlineDeltaRelationships); const addedCollectionScriptDtos = addedCollections @@ -66,11 +71,19 @@ const getAlterCollectionScriptDtos = ({ .filter(collection => collection.role.compMod.created) .flatMap(getAddCollectionScriptDto); + const addedColumnScriptDtos = addedCollections + .map(collection => Object.values(collection.properties)[0]) + .flatMap(getAddColumnScriptDtos); + const deletedCollectionScriptDtos = deletedCollections .map(collection => Object.values(collection.properties)[0]) .filter(collection => collection.role.compMod.deleted) .flatMap(getDeleteCollectionScriptDto); + const deletedColumnScriptDtos = deletedCollections + .map(collection => Object.values(collection.properties)[0]) + .flatMap(getDeleteColumnScriptDtos); + const modifyCollectionScriptDtos = modifyScriptsData.flatMap(getModifyCollectionScriptDtos); const modifyCollectionKeysScriptDtos = modifyScriptsData.flatMap(getModifyCollectionKeysScriptDtos); const modifyColumnScriptDtos = modifyScriptsData.flatMap(getModifyColumnScriptDtos); @@ -79,6 +92,8 @@ const getAlterCollectionScriptDtos = ({ ...deletedCollectionScriptDtos, ...addedCollectionScriptDtos, ...modifyCollectionScriptDtos, + ...deletedColumnScriptDtos, + ...addedColumnScriptDtos, ...modifyColumnScriptDtos, ...modifyCollectionKeysScriptDtos, ].filter(Boolean); @@ -179,7 +194,10 @@ const getAlterScriptDtos = (data, app) => { const inlineDeltaRelationships = getInlineRelationships({ collection, options: data.options }); const ignoreRelationshipIDs = inlineDeltaRelationships.map(relationship => relationship.role.id); - const containersScriptDtos = getAlterContainersScriptDtos({ collection, app }); + const { deletedContainersScriptDtos, upsertedContainersScriptDtos } = getAlterContainersScriptDtos({ + collection, + app, + }); const collectionsScriptDtos = getAlterCollectionScriptDtos({ collection, @@ -198,7 +216,13 @@ const getAlterScriptDtos = (data, app) => { ignoreRelationshipIDs, }); - return [...containersScriptDtos, ...collectionsScriptDtos, ...viewScriptDtos, ...relationshipScriptDtos] + return [ + ...upsertedContainersScriptDtos, + ...collectionsScriptDtos, + ...viewScriptDtos, + ...relationshipScriptDtos, + ...deletedContainersScriptDtos, + ] .filter(Boolean) .map(dto => dto && prettifyAlterScriptDto(dto)) .filter(Boolean); diff --git a/forward_engineering/alterScript/alterScriptHelpers/alterEntityHelper.js b/forward_engineering/alterScript/alterScriptHelpers/alterEntityHelper.js index b41816f..ab5bbf2 100644 --- a/forward_engineering/alterScript/alterScriptHelpers/alterEntityHelper.js +++ b/forward_engineering/alterScript/alterScriptHelpers/alterEntityHelper.js @@ -12,6 +12,7 @@ const { getSchemaNameFromCollection, getSchemaOfAlterCollection, getFullCollectionName, + wrapInQuotes, } = require('../../utils/general'); const { getRelationshipName } = require('./alterForeignKeyHelper'); const { createColumnDefinitionBySchema } = require('./createColumnDefinition'); @@ -91,6 +92,43 @@ const getModifyCollectionKeysScriptDtos = collection => { return [...modifyPkConstraintDtos, ...modifyUkConstraintDtos].filter(Boolean); }; +const getAddColumnScriptDtos = ddlProvider => collection => { + const collectionSchema = getSchemaOfAlterCollection(collection); + const fullTableName = getFullCollectionName(collectionSchema); + const schemaName = getSchemaNameFromCollection({ collection }); + const schemaData = { schemaName }; + + return toPairs(collection.properties) + .filter(([name, jsonSchema]) => !jsonSchema.compMod) + .map(([name, jsonSchema]) => { + const columnDefinition = createColumnDefinitionBySchema({ + name, + jsonSchema, + parentJsonSchema: collectionSchema, + ddlProvider, + schemaData, + }); + const columnDef = ddlProvider.convertColumnDefinition(columnDefinition); + const script = ddlProvider.addColumn({ tableName: fullTableName, columnDefinition }); + return AlterScriptDto.getInstance([script], true, false); + }) + .filter(Boolean); +}; + +const getDeleteColumnScriptDtos = ddlProvider => collection => { + const collectionSchema = getSchemaOfAlterCollection(collection); + const fullTableName = getFullCollectionName(collectionSchema); + + return toPairs(collection.properties) + .filter(([name, jsonSchema]) => !jsonSchema.compMod) + .map(([name]) => { + const columnName = wrapInQuotes(name); + const script = ddlProvider.dropColumn({ tableName: fullTableName, columnName }); + return AlterScriptDto.getInstance([script], true, true); + }) + .filter(Boolean); +}; + const getModifyColumnScriptDtos = collection => { const modifyNotNullScriptDtos = getModifyNonNullColumnsScriptDtos(collection); const modifyCommentScriptDtos = getModifiedCommentOnColumnScriptDtos(collection); @@ -110,6 +148,8 @@ const getEntitiesScripts = (app, inlineDeltaRelationships) => { getModifyCollectionScriptDtos, getModifyColumnScriptDtos, getModifyCollectionKeysScriptDtos, + getAddColumnScriptDtos: getAddColumnScriptDtos(ddlProvider), + getDeleteColumnScriptDtos: getDeleteColumnScriptDtos(ddlProvider), }; }; diff --git a/forward_engineering/ddlProvider/ddlProvider.js b/forward_engineering/ddlProvider/ddlProvider.js index ecdbe9a..6933aed 100644 --- a/forward_engineering/ddlProvider/ddlProvider.js +++ b/forward_engineering/ddlProvider/ddlProvider.js @@ -411,6 +411,14 @@ module.exports = (baseProvider, options, app) => { 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 } }); + }, + hydrateIndex(indexData, tableData, schemaData) { return { ...indexData, schemaName: schemaData.schemaName }; }, diff --git a/forward_engineering/ddlProvider/templates.js b/forward_engineering/ddlProvider/templates.js index 680c4c9..4a8a002 100644 --- a/forward_engineering/ddlProvider/templates.js +++ b/forward_engineering/ddlProvider/templates.js @@ -9,6 +9,10 @@ module.exports = { dropTable: 'DROP TABLE ${tableName};', + addColumn: 'ALTER TABLE ${tableName} ADD COLUMN ${columnDefinition};', + + dropColumn: 'ALTER TABLE ${tableName} DROP COLUMN ${columnName};', + createAuxiliaryTable: 'CREATE${tableType} TABLE ${name}${tableOptions};', comment: '\nCOMMENT ON ${objectType} ${objectName} IS ${comment};\n', From 765c99537ca84873ccbc5afa514224a11f80664e Mon Sep 17 00:00:00 2001 From: yevhenii-moroziuk Date: Thu, 15 Jan 2026 13:15:06 +0200 Subject: [PATCH 04/12] HCK-14285: Do not render columns of deleted tables --- .../alterScript/alterScriptFromDeltaHelper.js | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/forward_engineering/alterScript/alterScriptFromDeltaHelper.js b/forward_engineering/alterScript/alterScriptFromDeltaHelper.js index cb0ec95..b2a754b 100644 --- a/forward_engineering/alterScript/alterScriptFromDeltaHelper.js +++ b/forward_engineering/alterScript/alterScriptFromDeltaHelper.js @@ -25,21 +25,21 @@ const getAlterContainersScriptDtos = ({ collection, app }) => { const { getAddContainerScriptDto, getDeleteContainerScriptDto, getModifyContainerScriptDto } = getContainersScripts(app); - const addContainersScriptDtos = addedContainers + const addedContainersScriptDtos = addedContainers .map(container => Object.values(container.properties)[0]) .flatMap(getAddContainerScriptDto); - const deleteContainersScriptDtos = deletedContainers + const deletedContainersScriptDtos = deletedContainers .map(container => Object.values(container.properties)[0]) .flatMap(getDeleteContainerScriptDto); - const modifyContainersScriptDtos = modifiedContainers + const modifiedContainersScriptDtos = modifiedContainers .map(containerWrapper => Object.values(containerWrapper.properties)[0]) .flatMap(getModifyContainerScriptDto); return { - deletedContainersScriptDtos: deleteContainersScriptDtos, - upsertedContainersScriptDtos: [...addContainersScriptDtos, ...modifyContainersScriptDtos], + deletedContainersScriptDtos, + upsertedContainersScriptDtos: [...addedContainersScriptDtos, ...modifiedContainersScriptDtos], }; }; @@ -82,6 +82,7 @@ const getAlterCollectionScriptDtos = ({ const deletedColumnScriptDtos = deletedCollections .map(collection => Object.values(collection.properties)[0]) + .filter(collection => !collection.role.compMod.deleted) .flatMap(getDeleteColumnScriptDtos); const modifyCollectionScriptDtos = modifyScriptsData.flatMap(getModifyCollectionScriptDtos); From 3e5894b801472f823a9a7ac7c4d3a82ccf21aad0 Mon Sep 17 00:00:00 2001 From: yevhenii-moroziuk Date: Thu, 15 Jan 2026 14:36:37 +0200 Subject: [PATCH 05/12] HCK-14285: Add logic to change column's data type --- .../alterScriptHelpers/alterEntityHelper.js | 23 ++-- .../columnHelpers/alterTypeHelper.js | 108 ++++++++++++++++++ forward_engineering/ddlProvider/templates.js | 2 + forward_engineering/utils/general.js | 5 + 4 files changed, 130 insertions(+), 8 deletions(-) create mode 100644 forward_engineering/alterScript/alterScriptHelpers/columnHelpers/alterTypeHelper.js diff --git a/forward_engineering/alterScript/alterScriptHelpers/alterEntityHelper.js b/forward_engineering/alterScript/alterScriptHelpers/alterEntityHelper.js index ab5bbf2..deed96c 100644 --- a/forward_engineering/alterScript/alterScriptHelpers/alterEntityHelper.js +++ b/forward_engineering/alterScript/alterScriptHelpers/alterEntityHelper.js @@ -2,6 +2,7 @@ const { omit, toPairs } = require('lodash'); const { AlterScriptDto } = require('../types/AlterScriptDto'); const { getModifiedCommentOnColumnScriptDtos } = require('./columnHelpers/commentsHelper'); const { getModifyNonNullColumnsScriptDtos } = require('./columnHelpers/nonNullConstraintHelper'); +const { getUpdateTypesScriptDtos } = require('./columnHelpers/alterTypeHelper'); const { getModifyCheckConstraintScriptDtos } = require('./entityHelpers/checkConstraintHelper'); const { getModifyEntityCommentsScriptDtos } = require('./entityHelpers/commentsHelper'); const { getModifyPkConstraintsScriptDtos } = require('./entityHelpers/primaryKeyHelper'); @@ -108,8 +109,10 @@ const getAddColumnScriptDtos = ddlProvider => collection => { ddlProvider, schemaData, }); - const columnDef = ddlProvider.convertColumnDefinition(columnDefinition); - const script = ddlProvider.addColumn({ tableName: fullTableName, columnDefinition }); + const script = ddlProvider.addColumn({ + tableName: fullTableName, + columnDefinition: ddlProvider.convertColumnDefinition(columnDefinition), + }); return AlterScriptDto.getInstance([script], true, false); }) .filter(Boolean); @@ -129,14 +132,18 @@ const getDeleteColumnScriptDtos = ddlProvider => collection => { .filter(Boolean); }; -const getModifyColumnScriptDtos = collection => { +const getModifyColumnScriptDtos = ddlProvider => collection => { const modifyNotNullScriptDtos = getModifyNonNullColumnsScriptDtos(collection); const modifyCommentScriptDtos = getModifiedCommentOnColumnScriptDtos(collection); const modifyDefaultColumnValueScriptDtos = getModifiedDefaultColumnValueScriptDtos({ collection }); - - return [...modifyNotNullScriptDtos, ...modifyDefaultColumnValueScriptDtos, ...modifyCommentScriptDtos].filter( - Boolean, - ); + const modifyTypeScriptDtos = getUpdateTypesScriptDtos(ddlProvider)(collection); + + return [ + ...modifyTypeScriptDtos, + ...modifyNotNullScriptDtos, + ...modifyDefaultColumnValueScriptDtos, + ...modifyCommentScriptDtos, + ].filter(Boolean); }; const getEntitiesScripts = (app, inlineDeltaRelationships) => { @@ -146,7 +153,7 @@ const getEntitiesScripts = (app, inlineDeltaRelationships) => { getAddCollectionScriptDto: getAddCollectionScriptDto(ddlProvider, inlineDeltaRelationships), getDeleteCollectionScriptDto: getDeleteCollectionScriptDto(ddlProvider), getModifyCollectionScriptDtos, - getModifyColumnScriptDtos, + getModifyColumnScriptDtos: getModifyColumnScriptDtos(ddlProvider), getModifyCollectionKeysScriptDtos, getAddColumnScriptDtos: getAddColumnScriptDtos(ddlProvider), getDeleteColumnScriptDtos: getDeleteColumnScriptDtos(ddlProvider), diff --git a/forward_engineering/alterScript/alterScriptHelpers/columnHelpers/alterTypeHelper.js b/forward_engineering/alterScript/alterScriptHelpers/columnHelpers/alterTypeHelper.js new file mode 100644 index 0000000..13338c4 --- /dev/null +++ b/forward_engineering/alterScript/alterScriptHelpers/columnHelpers/alterTypeHelper.js @@ -0,0 +1,108 @@ +const { toPairs } = require('lodash'); +const { AlterScriptDto } = require('../../types/AlterScriptDto'); +const { + checkFieldPropertiesChanged, + getFullCollectionName, + wrapInQuotes, + isObjectInDeltaModelActivated, + isParentContainerActivated, + getSchemaOfAlterCollection, + getSchemaNameFromCollection, +} = require('../../../utils/general'); +const { assignTemplates } = require('../../../utils/assignTemplates'); +const templates = require('../../../ddlProvider/templates'); +const { createColumnDefinitionBySchema } = require('../createColumnDefinition'); +const { getColumnType } = require('../../../ddlProvider/ddlHelpers/columnDefinition/getColumnType'); + +/** + * @param {string} tableName + * @param {string} columnName + * @param {string} dataType + * @return string + * */ +const alterColumnType = (tableName, columnName, dataType) => { + return assignTemplates({ + template: templates.updateColumnType, + templateData: { + tableName, + columnName, + dataType, + }, + }); +}; + +/** + * @return {boolean} + * */ +const hasLengthChanged = (collection, oldFieldName, currentJsonSchema) => { + const oldProperty = collection.role.properties[oldFieldName]; + + const previousLength = oldProperty?.length; + const newLength = currentJsonSchema?.length; + return previousLength !== newLength; +}; + +/** + * @return {boolean} + * */ +const hasPrecisionOrScaleChanged = (collection, oldFieldName, currentJsonSchema) => { + const oldProperty = collection.role.properties[oldFieldName]; + + const previousPrecision = oldProperty?.precision; + const newPrecision = currentJsonSchema?.precision; + const previousScale = oldProperty?.scale; + const newScale = currentJsonSchema?.scale; + + return previousPrecision !== newPrecision || previousScale !== newScale; +}; + +/** + * @param {Object} ddlProvider + * @return {(collection: Object) => Array} + * */ +const getUpdateTypesScriptDtos = ddlProvider => collection => { + const collectionSchema = getSchemaOfAlterCollection(collection); + const fullTableName = getFullCollectionName(collectionSchema); + const isContainerActivated = isParentContainerActivated(collection); + const isCollectionActivated = isObjectInDeltaModelActivated(collection); + const schemaName = getSchemaNameFromCollection({ collection }); + const schemaData = { schemaName }; + + return toPairs(collection.properties) + .filter(([name, jsonSchema]) => { + if (!jsonSchema.compMod) { + return false; + } + const hasTypeChanged = checkFieldPropertiesChanged(jsonSchema.compMod, ['type', 'mode']); + if (!hasTypeChanged) { + const oldName = jsonSchema.compMod.oldField.name; + const isNewLength = hasLengthChanged(collection, oldName, jsonSchema); + const isNewPrecisionOrScale = hasPrecisionOrScaleChanged(collection, oldName, jsonSchema); + return isNewLength || isNewPrecisionOrScale; + } + return true; + }) + .map(([columnName, jsonSchema]) => { + const columnDefinition = createColumnDefinitionBySchema({ + name: columnName, + jsonSchema, + parentJsonSchema: collectionSchema, + ddlProvider, + schemaData, + }); + + // Get the formatted data type using the helper function + const dataType = getColumnType(columnDefinition).trim(); + + const columnNameQuoted = wrapInQuotes(columnName); + const script = alterColumnType(fullTableName, columnNameQuoted, dataType); + const isActivated = isContainerActivated && isCollectionActivated && jsonSchema.isActivated; + + return AlterScriptDto.getInstance([script], isActivated, false); + }) + .filter(Boolean); +}; + +module.exports = { + getUpdateTypesScriptDtos, +}; diff --git a/forward_engineering/ddlProvider/templates.js b/forward_engineering/ddlProvider/templates.js index 4a8a002..dff81a0 100644 --- a/forward_engineering/ddlProvider/templates.js +++ b/forward_engineering/ddlProvider/templates.js @@ -55,6 +55,8 @@ module.exports = { dropCheckConstraint: 'ALTER TABLE ${tableName} DROP CHECK ${constraintName};', + updateColumnType: 'ALTER TABLE ${tableName} ALTER COLUMN ${columnName} SET DATA TYPE ${dataType};', + updateColumnDefaultValue: 'ALTER TABLE ${tableName} ALTER COLUMN ${columnName} SET DEFAULT ${defaultValue};', dropColumnDefaultValue: 'ALTER TABLE ${tableName} ALTER COLUMN ${columnName} DROP DEFAULT;', diff --git a/forward_engineering/utils/general.js b/forward_engineering/utils/general.js index 76a365a..37aa491 100644 --- a/forward_engineering/utils/general.js +++ b/forward_engineering/utils/general.js @@ -146,6 +146,10 @@ const isParentContainerActivated = collection => { ); }; +const checkFieldPropertiesChanged = (compMod, propertiesToCheck) => { + return propertiesToCheck.some(prop => compMod?.oldField[prop] !== compMod?.newField[prop]); +}; + /** * * @template {object} T @@ -193,4 +197,5 @@ module.exports = { isParentContainerActivated, getSchemaNameFromCollection, getUpdatedProperties, + checkFieldPropertiesChanged, }; From c47225333f246183d56a5fece6aeffd00d78d346 Mon Sep 17 00:00:00 2001 From: yevhenii-moroziuk Date: Sat, 17 Jan 2026 10:24:57 +0200 Subject: [PATCH 06/12] HCK-14285: Add logic to rename columns --- .../alterScriptHelpers/alterEntityHelper.js | 3 + .../columnHelpers/alterColumnNameHelper.js | 55 +++++++++++++++++++ .../columnHelpers/alterTypeHelper.js | 3 +- .../createColumnDefinition.js | 2 +- forward_engineering/ddlProvider/templates.js | 2 + 5 files changed, 62 insertions(+), 3 deletions(-) create mode 100644 forward_engineering/alterScript/alterScriptHelpers/columnHelpers/alterColumnNameHelper.js diff --git a/forward_engineering/alterScript/alterScriptHelpers/alterEntityHelper.js b/forward_engineering/alterScript/alterScriptHelpers/alterEntityHelper.js index deed96c..c3a12fa 100644 --- a/forward_engineering/alterScript/alterScriptHelpers/alterEntityHelper.js +++ b/forward_engineering/alterScript/alterScriptHelpers/alterEntityHelper.js @@ -4,6 +4,7 @@ const { getModifiedCommentOnColumnScriptDtos } = require('./columnHelpers/commen const { getModifyNonNullColumnsScriptDtos } = require('./columnHelpers/nonNullConstraintHelper'); const { getUpdateTypesScriptDtos } = require('./columnHelpers/alterTypeHelper'); const { getModifyCheckConstraintScriptDtos } = require('./entityHelpers/checkConstraintHelper'); +const { getRenameColumnScriptDtos } = require('./columnHelpers/alterColumnNameHelper'); const { getModifyEntityCommentsScriptDtos } = require('./entityHelpers/commentsHelper'); const { getModifyPkConstraintsScriptDtos } = require('./entityHelpers/primaryKeyHelper'); const { getModifyUkConstraintsScriptDtos } = require('./entityHelpers/uniqueKeyHelper'); @@ -133,12 +134,14 @@ const getDeleteColumnScriptDtos = ddlProvider => collection => { }; const getModifyColumnScriptDtos = ddlProvider => collection => { + const renamedColumnsScriptDtos = getRenameColumnScriptDtos(ddlProvider)(collection); const modifyNotNullScriptDtos = getModifyNonNullColumnsScriptDtos(collection); const modifyCommentScriptDtos = getModifiedCommentOnColumnScriptDtos(collection); const modifyDefaultColumnValueScriptDtos = getModifiedDefaultColumnValueScriptDtos({ collection }); const modifyTypeScriptDtos = getUpdateTypesScriptDtos(ddlProvider)(collection); return [ + ...renamedColumnsScriptDtos, ...modifyTypeScriptDtos, ...modifyNotNullScriptDtos, ...modifyDefaultColumnValueScriptDtos, diff --git a/forward_engineering/alterScript/alterScriptHelpers/columnHelpers/alterColumnNameHelper.js b/forward_engineering/alterScript/alterScriptHelpers/columnHelpers/alterColumnNameHelper.js new file mode 100644 index 0000000..eb501f8 --- /dev/null +++ b/forward_engineering/alterScript/alterScriptHelpers/columnHelpers/alterColumnNameHelper.js @@ -0,0 +1,55 @@ +const { toPairs } = require('lodash'); +const { + getSchemaOfAlterCollection, + getFullCollectionName, + isParentContainerActivated, + isObjectInDeltaModelActivated, + getSchemaNameFromCollection, + wrapInQuotes, +} = require('../../../utils/general'); +const templates = require('../../../ddlProvider/templates'); +const { AlterScriptDto } = require('../../types/AlterScriptDto'); +const { assignTemplates } = require('../../../utils/assignTemplates'); + +/** + * @param {Object} ddlProvider + * @return {(collection: Object) => Array} + * */ +const getRenameColumnScriptDtos = ddlProvider => collection => { + const collectionSchema = getSchemaOfAlterCollection(collection); + const fullTableName = getFullCollectionName(collectionSchema); + const isContainerActivated = isParentContainerActivated(collection); + const isCollectionActivated = isObjectInDeltaModelActivated(collection); + const schemaName = getSchemaNameFromCollection({ collection }); + const schemaData = { schemaName }; + + return toPairs(collection.properties) + .map(([_, jsonSchema]) => { + if (!jsonSchema.compMod) { + return false; + } + const compMod = jsonSchema.compMod || {}; + const { newField = {}, oldField = {} } = compMod; + + if (newField.name && oldField.name && newField.name !== oldField.name) { + const isActivated = isContainerActivated && isCollectionActivated && jsonSchema.isActivated; + const script = assignTemplates({ + template: templates.renameColumn, + templateData: { + tableName: fullTableName, + oldColumnName: wrapInQuotes(oldField.name), + newColumnName: wrapInQuotes(newField.name), + }, + }); + + return AlterScriptDto.getInstance([script], isActivated, false); + } + + return null; + }) + .filter(Boolean); +}; + +module.exports = { + getRenameColumnScriptDtos, +}; diff --git a/forward_engineering/alterScript/alterScriptHelpers/columnHelpers/alterTypeHelper.js b/forward_engineering/alterScript/alterScriptHelpers/columnHelpers/alterTypeHelper.js index 13338c4..3781f01 100644 --- a/forward_engineering/alterScript/alterScriptHelpers/columnHelpers/alterTypeHelper.js +++ b/forward_engineering/alterScript/alterScriptHelpers/columnHelpers/alterTypeHelper.js @@ -69,7 +69,7 @@ const getUpdateTypesScriptDtos = ddlProvider => collection => { const schemaData = { schemaName }; return toPairs(collection.properties) - .filter(([name, jsonSchema]) => { + .filter(([_, jsonSchema]) => { if (!jsonSchema.compMod) { return false; } @@ -91,7 +91,6 @@ const getUpdateTypesScriptDtos = ddlProvider => collection => { schemaData, }); - // Get the formatted data type using the helper function const dataType = getColumnType(columnDefinition).trim(); const columnNameQuoted = wrapInQuotes(columnName); diff --git a/forward_engineering/alterScript/alterScriptHelpers/createColumnDefinition.js b/forward_engineering/alterScript/alterScriptHelpers/createColumnDefinition.js index 23a57e6..c7a5752 100644 --- a/forward_engineering/alterScript/alterScriptHelpers/createColumnDefinition.js +++ b/forward_engineering/alterScript/alterScriptHelpers/createColumnDefinition.js @@ -80,7 +80,7 @@ const getType = jsonSchema => { const createColumnDefinitionBySchema = ({ name, jsonSchema, parentJsonSchema, ddlProvider, schemaData }) => { const columnDefinition = createColumnDefinition({ - name: name, + name, type: getType(jsonSchema), nullable: isNullable(parentJsonSchema, name), default: getDefault(jsonSchema), diff --git a/forward_engineering/ddlProvider/templates.js b/forward_engineering/ddlProvider/templates.js index dff81a0..8948b23 100644 --- a/forward_engineering/ddlProvider/templates.js +++ b/forward_engineering/ddlProvider/templates.js @@ -60,4 +60,6 @@ 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};', }; From d3fbbdce09f5c18efecf8d7c5c9ccc66f46ea234 Mon Sep 17 00:00:00 2001 From: yevhenii-moroziuk Date: Sat, 17 Jan 2026 14:39:27 +0200 Subject: [PATCH 07/12] HCK-14285: Add JS doc --- .../alterScript/alterScriptFromDeltaHelper.js | 52 ++++++++++++++----- .../alterScriptHelpers/alterEntityHelper.js | 37 ++++++++++++- .../columnHelpers/alterColumnNameHelper.js | 52 +++++++++++-------- .../columnHelpers/alterTypeHelper.js | 3 +- 4 files changed, 104 insertions(+), 40 deletions(-) diff --git a/forward_engineering/alterScript/alterScriptFromDeltaHelper.js b/forward_engineering/alterScript/alterScriptFromDeltaHelper.js index b2a754b..6b1355b 100644 --- a/forward_engineering/alterScript/alterScriptFromDeltaHelper.js +++ b/forward_engineering/alterScript/alterScriptFromDeltaHelper.js @@ -7,14 +7,18 @@ const { } = require('./alterScriptHelpers/alterForeignKeyHelper'); const { getModifyViewScriptDtos } = require('./alterScriptHelpers/alterViewHelper'); +/** + * @param {T} data + * @return {Array} + */ const getItems = data => [data?.items].flat().filter(Boolean); /** - * @param dto {{ + * @param {{ * collection: Object, * app: App - * }} - * @return {AlterScriptDto[]} + * }} param + * @return {Array} * */ const getAlterContainersScriptDtos = ({ collection, app }) => { const { added, deleted, modified } = collection.properties?.containers?.properties || {}; @@ -43,6 +47,10 @@ const getAlterContainersScriptDtos = ({ collection, app }) => { }; }; +/** + * @param {{collection: Object, app: App, modelDefinitions: Object, internalDefinitions: Object, externalDefinitions: Object, inlineDeltaRelationships?: any[]}} param + * @return {Array} + */ const getAlterCollectionScriptDtos = ({ collection, app, @@ -52,8 +60,8 @@ const getAlterCollectionScriptDtos = ({ inlineDeltaRelationships = [], }) => { const { added, deleted, modified } = collection.properties?.entities?.properties || {}; - const addedCollections = getItems(added); - const deletedCollections = getItems(deleted); + const addedCollections = getItems(added).map(item => Object.values(item.properties)[0]); + const deletedCollections = getItems(deleted).map(item => Object.values(item.properties)[0]); const modifyScriptsData = getItems(modified).map(item => Object.values(item.properties)[0]); const { @@ -67,21 +75,16 @@ const getAlterCollectionScriptDtos = ({ } = getEntitiesScripts(app, inlineDeltaRelationships); const addedCollectionScriptDtos = addedCollections - .map(collection => Object.values(collection.properties)[0]) .filter(collection => collection.role.compMod.created) - .flatMap(getAddCollectionScriptDto); + .map(getAddCollectionScriptDto); - const addedColumnScriptDtos = addedCollections - .map(collection => Object.values(collection.properties)[0]) - .flatMap(getAddColumnScriptDtos); + const addedColumnScriptDtos = addedCollections.flatMap(getAddColumnScriptDtos); const deletedCollectionScriptDtos = deletedCollections - .map(collection => Object.values(collection.properties)[0]) .filter(collection => collection.role.compMod.deleted) - .flatMap(getDeleteCollectionScriptDto); + .map(getDeleteCollectionScriptDto); const deletedColumnScriptDtos = deletedCollections - .map(collection => Object.values(collection.properties)[0]) .filter(collection => !collection.role.compMod.deleted) .flatMap(getDeleteColumnScriptDtos); @@ -100,6 +103,10 @@ const getAlterCollectionScriptDtos = ({ ].filter(Boolean); }; +/** + * @param {Object} collection + * @return {Array} + */ const getAlterViewScriptDtos = collection => { const modifyViewScriptDtos = getItems(collection.properties?.views?.properties?.modified) .map(viewWrapper => Object.values(viewWrapper.properties)[0]) @@ -109,6 +116,10 @@ const getAlterViewScriptDtos = collection => { return [...modifyViewScriptDtos].filter(Boolean); }; +/** + * @param {{collection: Object, app: App, ignoreRelationshipIDs?: string[]}} param + * @return {Array} + */ const getAlterRelationshipsScriptDtos = ({ collection, app, ignoreRelationshipIDs = [] }) => { const addedRelationships = getItems(collection.properties?.relationships?.properties?.added) .filter(Boolean) @@ -141,6 +152,10 @@ const getAlterRelationshipsScriptDtos = ({ collection, app, ignoreRelationshipID return [...deleteFkScriptDtos, ...addFkScriptDtos, ...modifiedFkScriptDtos].filter(Boolean); }; +/** + * @param {{collection: Object, options: Object}} param + * @return {Array} + */ const getInlineRelationships = ({ collection, options }) => { if (options?.scriptGenerationOptions?.feActiveOptions?.foreignKeys !== 'inline') { return []; @@ -157,13 +172,17 @@ const getInlineRelationships = ({ collection, options }) => { return addedRelationships; }; +/** + * @param {AlterScriptDto} dto + * @return {AlterScriptDto | undefined} + */ const prettifyAlterScriptDto = dto => { if (!dto) { return undefined; } /** * @type {Array} - * */ + */ const nonEmptyScriptModificationDtos = dto.scripts .map(scriptDto => ({ ...scriptDto, @@ -179,6 +198,11 @@ const prettifyAlterScriptDto = dto => { }; }; +/** + * @param {Object} data + * @param {App} app + * @return {Array} + */ const getAlterScriptDtos = (data, app) => { const collection = JSON.parse(data.jsonSchema); diff --git a/forward_engineering/alterScript/alterScriptHelpers/alterEntityHelper.js b/forward_engineering/alterScript/alterScriptHelpers/alterEntityHelper.js index c3a12fa..1347ac4 100644 --- a/forward_engineering/alterScript/alterScriptHelpers/alterEntityHelper.js +++ b/forward_engineering/alterScript/alterScriptHelpers/alterEntityHelper.js @@ -19,6 +19,11 @@ const { const { getRelationshipName } = require('./alterForeignKeyHelper'); const { createColumnDefinitionBySchema } = require('./createColumnDefinition'); +/** + * @param {Object} ddlProvider + * @param {Array} inlineDeltaRelationships + * @returns {(collection: Object) => AlterScriptDto} + */ const getAddCollectionScriptDto = (ddlProvider, inlineDeltaRelationships) => collection => { const jsonSchema = { ...collection, ...(omit(collection?.role, 'properties') || {}) }; const schemaName = getSchemaNameFromCollection({ collection }); @@ -74,6 +79,10 @@ const getAddCollectionScriptDto = (ddlProvider, inlineDeltaRelationships) => col return AlterScriptDto.getInstance([script], true, false); }; +/** + * @param {Object} ddlProvider + * @returns {(collection: Object) => AlterScriptDto} + */ const getDeleteCollectionScriptDto = ddlProvider => collection => { const collectionSchema = getSchemaOfAlterCollection(collection); const fullTableName = getFullCollectionName(collectionSchema); @@ -82,18 +91,30 @@ const getDeleteCollectionScriptDto = ddlProvider => collection => { return AlterScriptDto.getInstance([script], true, true); }; +/** + * @param {Object} collection + * @returns {Array} + */ const getModifyCollectionScriptDtos = collection => { const modifyCheckConstraintScriptDtos = getModifyCheckConstraintScriptDtos(collection); const modifyCommentScriptDtos = getModifyEntityCommentsScriptDtos(collection); return [...modifyCheckConstraintScriptDtos, ...modifyCommentScriptDtos].filter(Boolean); }; +/** + * @param {Object} collection + * @returns {Array} + */ const getModifyCollectionKeysScriptDtos = collection => { const modifyPkConstraintDtos = getModifyPkConstraintsScriptDtos(collection); const modifyUkConstraintDtos = getModifyUkConstraintsScriptDtos(collection); return [...modifyPkConstraintDtos, ...modifyUkConstraintDtos].filter(Boolean); }; +/** + * @param {Object} ddlProvider + * @returns {(collection: Object) => Array} + */ const getAddColumnScriptDtos = ddlProvider => collection => { const collectionSchema = getSchemaOfAlterCollection(collection); const fullTableName = getFullCollectionName(collectionSchema); @@ -119,6 +140,10 @@ const getAddColumnScriptDtos = ddlProvider => collection => { .filter(Boolean); }; +/** + * @param {Object} ddlProvider + * @returns {(collection: Object) => Array} + */ const getDeleteColumnScriptDtos = ddlProvider => collection => { const collectionSchema = getSchemaOfAlterCollection(collection); const fullTableName = getFullCollectionName(collectionSchema); @@ -133,22 +158,30 @@ const getDeleteColumnScriptDtos = ddlProvider => collection => { .filter(Boolean); }; +/** + * @param {Object} ddlProvider + * @returns {(collection: Object) => Array} + */ const getModifyColumnScriptDtos = ddlProvider => collection => { const renamedColumnsScriptDtos = getRenameColumnScriptDtos(ddlProvider)(collection); + const updateTypeScriptDtos = getUpdateTypesScriptDtos(ddlProvider)(collection); const modifyNotNullScriptDtos = getModifyNonNullColumnsScriptDtos(collection); const modifyCommentScriptDtos = getModifiedCommentOnColumnScriptDtos(collection); const modifyDefaultColumnValueScriptDtos = getModifiedDefaultColumnValueScriptDtos({ collection }); - const modifyTypeScriptDtos = getUpdateTypesScriptDtos(ddlProvider)(collection); return [ ...renamedColumnsScriptDtos, - ...modifyTypeScriptDtos, + ...updateTypeScriptDtos, ...modifyNotNullScriptDtos, ...modifyDefaultColumnValueScriptDtos, ...modifyCommentScriptDtos, ].filter(Boolean); }; +/** + * @param {App} app + * @param {Array} inlineDeltaRelationships + */ const getEntitiesScripts = (app, inlineDeltaRelationships) => { const ddlProvider = require('../../ddlProvider/ddlProvider')(null, null, app); diff --git a/forward_engineering/alterScript/alterScriptHelpers/columnHelpers/alterColumnNameHelper.js b/forward_engineering/alterScript/alterScriptHelpers/columnHelpers/alterColumnNameHelper.js index eb501f8..cc13127 100644 --- a/forward_engineering/alterScript/alterScriptHelpers/columnHelpers/alterColumnNameHelper.js +++ b/forward_engineering/alterScript/alterScriptHelpers/columnHelpers/alterColumnNameHelper.js @@ -11,6 +11,23 @@ const templates = require('../../../ddlProvider/templates'); const { AlterScriptDto } = require('../../types/AlterScriptDto'); const { assignTemplates } = require('../../../utils/assignTemplates'); +/** + * @param {string} tableName + * @param {string} oldColumnName + * @param {string} newColumnName + * @return string + * */ +const alterColumnName = (tableName, oldColumnName, newColumnName) => { + return assignTemplates({ + template: templates.renameColumn, + templateData: { + tableName, + oldColumnName: wrapInQuotes(oldColumnName), + newColumnName: wrapInQuotes(newColumnName), + }, + }); +}; + /** * @param {Object} ddlProvider * @return {(collection: Object) => Array} @@ -23,31 +40,22 @@ const getRenameColumnScriptDtos = ddlProvider => collection => { const schemaName = getSchemaNameFromCollection({ collection }); const schemaData = { schemaName }; - return toPairs(collection.properties) - .map(([_, jsonSchema]) => { - if (!jsonSchema.compMod) { - return false; - } - const compMod = jsonSchema.compMod || {}; - const { newField = {}, oldField = {} } = compMod; + return toPairs(collection.properties).map(([_, jsonSchema]) => { + if (!jsonSchema.compMod) { + return false; + } + const compMod = jsonSchema.compMod || {}; + const { newField = {}, oldField = {} } = compMod; - if (newField.name && oldField.name && newField.name !== oldField.name) { - const isActivated = isContainerActivated && isCollectionActivated && jsonSchema.isActivated; - const script = assignTemplates({ - template: templates.renameColumn, - templateData: { - tableName: fullTableName, - oldColumnName: wrapInQuotes(oldField.name), - newColumnName: wrapInQuotes(newField.name), - }, - }); + if (newField.name && oldField.name && newField.name !== oldField.name) { + const isActivated = isContainerActivated && isCollectionActivated && jsonSchema.isActivated; + const script = alterColumnName(fullTableName, oldField.name, newField.name); - return AlterScriptDto.getInstance([script], isActivated, false); - } + return AlterScriptDto.getInstance([script], isActivated, false); + } - return null; - }) - .filter(Boolean); + return undefined; + }); }; module.exports = { diff --git a/forward_engineering/alterScript/alterScriptHelpers/columnHelpers/alterTypeHelper.js b/forward_engineering/alterScript/alterScriptHelpers/columnHelpers/alterTypeHelper.js index 3781f01..3c10f16 100644 --- a/forward_engineering/alterScript/alterScriptHelpers/columnHelpers/alterTypeHelper.js +++ b/forward_engineering/alterScript/alterScriptHelpers/columnHelpers/alterTypeHelper.js @@ -98,8 +98,7 @@ const getUpdateTypesScriptDtos = ddlProvider => collection => { const isActivated = isContainerActivated && isCollectionActivated && jsonSchema.isActivated; return AlterScriptDto.getInstance([script], isActivated, false); - }) - .filter(Boolean); + }); }; module.exports = { From 7626cd4561478417909256dbb04130da03e041e2 Mon Sep 17 00:00:00 2001 From: yevhenii-moroziuk Date: Sun, 18 Jan 2026 19:29:05 +0200 Subject: [PATCH 08/12] HCK-14285: Fix drop FK logic --- .../alterScriptHelpers/alterForeignKeyHelper.js | 15 ++++++++------- forward_engineering/ddlProvider/templates.js | 4 ++-- 2 files changed, 10 insertions(+), 9 deletions(-) diff --git a/forward_engineering/alterScript/alterScriptHelpers/alterForeignKeyHelper.js b/forward_engineering/alterScript/alterScriptHelpers/alterForeignKeyHelper.js index 1ffd39e..532b489 100644 --- a/forward_engineering/alterScript/alterScriptHelpers/alterForeignKeyHelper.js +++ b/forward_engineering/alterScript/alterScriptHelpers/alterForeignKeyHelper.js @@ -7,8 +7,7 @@ const { assignTemplates } = require('../../utils/assignTemplates'); const getRelationshipName = relationship => { const compMod = relationship.role.compMod; - const name = compMod.code?.new || compMod.name?.new || relationship.role.code || relationship.role.name; - return name; + return compMod.code?.new || compMod.name?.new || relationship.role.code || relationship.role.name; }; const getFullChildTableName = relationship => { @@ -74,16 +73,14 @@ const getAddForeignKeyScriptDtos = addedRelationships => { const getDeleteSingleForeignKeyStatementDto = relationship => { const compMod = relationship.role.compMod; - const tableName = getFullChildTableName(relationship); - const relationshipName = getRelationshipName(relationship); - const fkConstraintName = wrapInQuotes(relationshipName); + const constraintName = wrapInQuotes(relationshipName); const statement = assignTemplates({ template: templates.dropForeignKey, templateData: { tableName, - fkConstraintName, + constraintName, }, }); @@ -100,7 +97,11 @@ const canRelationshipBeDeleted = relationship => { if (!compMod) { return false; } - return [compMod.code?.old || compMod.name?.old, compMod.child?.bucket, compMod.child?.collection].every(Boolean); + return [ + compMod.code?.old || compMod.name?.old || getRelationshipName(relationship), + compMod.child?.bucket, + compMod.child?.collection, + ].every(Boolean); }; const getDeleteForeignKeyScriptDtos = deletedRelationships => { diff --git a/forward_engineering/ddlProvider/templates.js b/forward_engineering/ddlProvider/templates.js index 8948b23..1d73c01 100644 --- a/forward_engineering/ddlProvider/templates.js +++ b/forward_engineering/ddlProvider/templates.js @@ -1,7 +1,7 @@ module.exports = { createSchema: 'CREATE SCHEMA ${schemaName}${authorization}${dataCapture};', - dropSchema: 'DROP SCHEMA ${schemaName} RESTRICT', + dropSchema: 'DROP SCHEMA ${schemaName} RESTRICT;', alterSchema: 'ALTER SCHEMA ${schemaName}${dataCapture};', @@ -24,7 +24,7 @@ module.exports = { createForeignKey: 'ALTER TABLE ${foreignTable} ADD CONSTRAINT ${name} FOREIGN KEY (${foreignKey}) REFERENCES ${primaryTable} (${primaryKey})${onDelete};', - dropForeignKey: 'ALTER TABLE {$tableName} DROP FOREIGN KEY ${constraintName};', + dropForeignKey: 'ALTER TABLE ${tableName} DROP FOREIGN KEY ${constraintName};', createForeignKeyConstraint: '${name} FOREIGN KEY (${foreignKey}) REFERENCES ${primaryTable} (${primaryKey})${onDelete}', From 0a788674b6fa990462b4b2ebb83b10edf97ec28a Mon Sep 17 00:00:00 2001 From: yevhenii-moroziuk Date: Mon, 19 Jan 2026 10:27:33 +0200 Subject: [PATCH 09/12] Fix SQ warnings --- .../alterScriptHelpers/columnHelpers/alterColumnNameHelper.js | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/forward_engineering/alterScript/alterScriptHelpers/columnHelpers/alterColumnNameHelper.js b/forward_engineering/alterScript/alterScriptHelpers/columnHelpers/alterColumnNameHelper.js index cc13127..58e7406 100644 --- a/forward_engineering/alterScript/alterScriptHelpers/columnHelpers/alterColumnNameHelper.js +++ b/forward_engineering/alterScript/alterScriptHelpers/columnHelpers/alterColumnNameHelper.js @@ -38,11 +38,10 @@ const getRenameColumnScriptDtos = ddlProvider => collection => { const isContainerActivated = isParentContainerActivated(collection); const isCollectionActivated = isObjectInDeltaModelActivated(collection); const schemaName = getSchemaNameFromCollection({ collection }); - const schemaData = { schemaName }; return toPairs(collection.properties).map(([_, jsonSchema]) => { if (!jsonSchema.compMod) { - return false; + return undefined; } const compMod = jsonSchema.compMod || {}; const { newField = {}, oldField = {} } = compMod; From 36c59f3f3b71ebdb9ecc06edb068d93deb8d868b Mon Sep 17 00:00:00 2001 From: yevhenii-moroziuk Date: Mon, 19 Jan 2026 10:36:52 +0200 Subject: [PATCH 10/12] Fix SQ warnings --- .../alterScriptHelpers/columnHelpers/alterColumnNameHelper.js | 1 - 1 file changed, 1 deletion(-) diff --git a/forward_engineering/alterScript/alterScriptHelpers/columnHelpers/alterColumnNameHelper.js b/forward_engineering/alterScript/alterScriptHelpers/columnHelpers/alterColumnNameHelper.js index 58e7406..9cdbdfb 100644 --- a/forward_engineering/alterScript/alterScriptHelpers/columnHelpers/alterColumnNameHelper.js +++ b/forward_engineering/alterScript/alterScriptHelpers/columnHelpers/alterColumnNameHelper.js @@ -37,7 +37,6 @@ const getRenameColumnScriptDtos = ddlProvider => collection => { const fullTableName = getFullCollectionName(collectionSchema); const isContainerActivated = isParentContainerActivated(collection); const isCollectionActivated = isObjectInDeltaModelActivated(collection); - const schemaName = getSchemaNameFromCollection({ collection }); return toPairs(collection.properties).map(([_, jsonSchema]) => { if (!jsonSchema.compMod) { From 47ff708a8f1467695d751af867af3ad47f849b0a Mon Sep 17 00:00:00 2001 From: yevhenii-moroziuk Date: Mon, 19 Jan 2026 11:48:37 +0200 Subject: [PATCH 11/12] HCK-14324: Add explanation on why DROP SCHEMA is executed afterward --- .../alterScript/alterScriptFromDeltaHelper.js | 5 ++-- .../columnHelpers/alterColumnNameHelper.js | 4 ++-- .../columnHelpers/alterTypeHelper.js | 8 +++---- .../columnHelpers/defaultValueHelper.js | 10 ++++---- .../columnHelpers/nonNullConstraintHelper.js | 6 ++--- .../entityHelpers/primaryKeyHelper.js | 6 ++--- .../alterScript/types/AlterKeyDto.js | 24 +++++++++---------- .../alterScript/types/AlterScriptDto.js | 16 ++++++------- .../ddlHelpers/key/constraintsHelper.js | 2 +- .../joinActivatedAndDeactivatedStatements.js | 4 ++-- 10 files changed, 43 insertions(+), 42 deletions(-) diff --git a/forward_engineering/alterScript/alterScriptFromDeltaHelper.js b/forward_engineering/alterScript/alterScriptFromDeltaHelper.js index 6b1355b..ece275f 100644 --- a/forward_engineering/alterScript/alterScriptFromDeltaHelper.js +++ b/forward_engineering/alterScript/alterScriptFromDeltaHelper.js @@ -18,8 +18,7 @@ const getItems = data => [data?.items].flat().filter(Boolean); * collection: Object, * app: App * }} param - * @return {Array} - * */ + */ const getAlterContainersScriptDtos = ({ collection, app }) => { const { added, deleted, modified } = collection.properties?.containers?.properties || {}; const addedContainers = getItems(added); @@ -41,6 +40,8 @@ const getAlterContainersScriptDtos = ({ collection, app }) => { .map(containerWrapper => Object.values(containerWrapper.properties)[0]) .flatMap(getModifyContainerScriptDto); + // Schemas can only be dropped after all contained tables are removed, + // so container cleanup must happen last. return { deletedContainersScriptDtos, upsertedContainersScriptDtos: [...addedContainersScriptDtos, ...modifiedContainersScriptDtos], diff --git a/forward_engineering/alterScript/alterScriptHelpers/columnHelpers/alterColumnNameHelper.js b/forward_engineering/alterScript/alterScriptHelpers/columnHelpers/alterColumnNameHelper.js index 9cdbdfb..fee1de4 100644 --- a/forward_engineering/alterScript/alterScriptHelpers/columnHelpers/alterColumnNameHelper.js +++ b/forward_engineering/alterScript/alterScriptHelpers/columnHelpers/alterColumnNameHelper.js @@ -16,7 +16,7 @@ const { assignTemplates } = require('../../../utils/assignTemplates'); * @param {string} oldColumnName * @param {string} newColumnName * @return string - * */ + */ const alterColumnName = (tableName, oldColumnName, newColumnName) => { return assignTemplates({ template: templates.renameColumn, @@ -31,7 +31,7 @@ const alterColumnName = (tableName, oldColumnName, newColumnName) => { /** * @param {Object} ddlProvider * @return {(collection: Object) => Array} - * */ + */ const getRenameColumnScriptDtos = ddlProvider => collection => { const collectionSchema = getSchemaOfAlterCollection(collection); const fullTableName = getFullCollectionName(collectionSchema); diff --git a/forward_engineering/alterScript/alterScriptHelpers/columnHelpers/alterTypeHelper.js b/forward_engineering/alterScript/alterScriptHelpers/columnHelpers/alterTypeHelper.js index 3c10f16..cea2a67 100644 --- a/forward_engineering/alterScript/alterScriptHelpers/columnHelpers/alterTypeHelper.js +++ b/forward_engineering/alterScript/alterScriptHelpers/columnHelpers/alterTypeHelper.js @@ -19,7 +19,7 @@ const { getColumnType } = require('../../../ddlProvider/ddlHelpers/columnDefinit * @param {string} columnName * @param {string} dataType * @return string - * */ + */ const alterColumnType = (tableName, columnName, dataType) => { return assignTemplates({ template: templates.updateColumnType, @@ -33,7 +33,7 @@ const alterColumnType = (tableName, columnName, dataType) => { /** * @return {boolean} - * */ + */ const hasLengthChanged = (collection, oldFieldName, currentJsonSchema) => { const oldProperty = collection.role.properties[oldFieldName]; @@ -44,7 +44,7 @@ const hasLengthChanged = (collection, oldFieldName, currentJsonSchema) => { /** * @return {boolean} - * */ + */ const hasPrecisionOrScaleChanged = (collection, oldFieldName, currentJsonSchema) => { const oldProperty = collection.role.properties[oldFieldName]; @@ -59,7 +59,7 @@ const hasPrecisionOrScaleChanged = (collection, oldFieldName, currentJsonSchema) /** * @param {Object} ddlProvider * @return {(collection: Object) => Array} - * */ + */ const getUpdateTypesScriptDtos = ddlProvider => collection => { const collectionSchema = getSchemaOfAlterCollection(collection); const fullTableName = getFullCollectionName(collectionSchema); diff --git a/forward_engineering/alterScript/alterScriptHelpers/columnHelpers/defaultValueHelper.js b/forward_engineering/alterScript/alterScriptHelpers/columnHelpers/defaultValueHelper.js index cca83e2..ee02612 100644 --- a/forward_engineering/alterScript/alterScriptHelpers/columnHelpers/defaultValueHelper.js +++ b/forward_engineering/alterScript/alterScriptHelpers/columnHelpers/defaultValueHelper.js @@ -16,7 +16,7 @@ const templates = require('../../../ddlProvider/templates'); * @param {string} props.columnName * @param {string} props.defaultValue * @return string - * */ + */ const updateColumnDefaultValue = ({ tableName, columnName, defaultValue }) => { const templateConfig = { tableName, @@ -30,7 +30,7 @@ const updateColumnDefaultValue = ({ tableName, columnName, defaultValue }) => { * @param {Object} props * @param {Object} props.collection * @returns { Array } - * */ + */ const getUpdatedDefaultColumnValueScriptDtos = ({ collection }) => { const isContainerActivated = isParentContainerActivated(collection); const isCollectionActivated = isObjectInDeltaModelActivated(collection); @@ -62,7 +62,7 @@ const getUpdatedDefaultColumnValueScriptDtos = ({ collection }) => { * @param {string} props.tableName * @param {string} props.columnName * @return string - * */ + */ const dropColumnDefaultValue = ({ tableName, columnName }) => { const templateConfig = { tableName, @@ -75,7 +75,7 @@ const dropColumnDefaultValue = ({ tableName, columnName }) => { * @param {Object} props * @param {Object} props.collection * @returns { Array } - * */ + */ const getDeletedDefaultColumnValueScriptDtos = ({ collection }) => { const isContainerActivated = isParentContainerActivated(collection); const isCollectionActivated = isObjectInDeltaModelActivated(collection); @@ -106,7 +106,7 @@ const getDeletedDefaultColumnValueScriptDtos = ({ collection }) => { * @param {Object} props * @param {Object} props.collection * @returns { Array } - * */ + */ const getModifiedDefaultColumnValueScriptDtos = ({ collection }) => { const updatedDefaultValuesScriptDtos = getUpdatedDefaultColumnValueScriptDtos({ collection }); const dropDefaultValuesScriptDtos = getDeletedDefaultColumnValueScriptDtos({ collection }); diff --git a/forward_engineering/alterScript/alterScriptHelpers/columnHelpers/nonNullConstraintHelper.js b/forward_engineering/alterScript/alterScriptHelpers/columnHelpers/nonNullConstraintHelper.js index 6d38d13..7f901e8 100644 --- a/forward_engineering/alterScript/alterScriptHelpers/columnHelpers/nonNullConstraintHelper.js +++ b/forward_engineering/alterScript/alterScriptHelpers/columnHelpers/nonNullConstraintHelper.js @@ -14,7 +14,7 @@ const templates = require('../../../ddlProvider/templates'); * @param tableName {string} * @param columnName {string} * @return string - * */ + */ const setNotNullConstraint = (tableName, columnName) => { return assignTemplates({ template: templates.alterNotNull, @@ -29,7 +29,7 @@ const setNotNullConstraint = (tableName, columnName) => { * @param tableName {string} * @param columnName {string} * @return string - * */ + */ const dropNotNullConstraint = (tableName, columnName) => { return assignTemplates({ template: templates.dropNotNull, @@ -43,7 +43,7 @@ const dropNotNullConstraint = (tableName, columnName) => { /** * @param {Object} collection * @return {AlterScriptDto[]} - * */ + */ const getModifyNonNullColumnsScriptDtos = collection => { const collectionSchema = getSchemaOfAlterCollection(collection); const fullTableName = getFullCollectionName(collectionSchema); diff --git a/forward_engineering/alterScript/alterScriptHelpers/entityHelpers/primaryKeyHelper.js b/forward_engineering/alterScript/alterScriptHelpers/entityHelpers/primaryKeyHelper.js index d760d9c..20e9b0e 100644 --- a/forward_engineering/alterScript/alterScriptHelpers/entityHelpers/primaryKeyHelper.js +++ b/forward_engineering/alterScript/alterScriptHelpers/entityHelpers/primaryKeyHelper.js @@ -77,11 +77,11 @@ const wasCompositePkChangedInTransitionFromCompositeToRegular = collection => { const wasCompositePkChangedInTransitionFromRegularToComposite = collection => { /** * @type {AlterCollectionRoleCompModPrimaryKey} - * */ + */ const pkDto = collection?.role?.compMod?.primaryKey || {}; /** * @type {AlterCollectionRoleCompModPKDto[]} - * */ + */ const newPrimaryKeys = pkDto.new || []; const idsOfColumns = newPrimaryKeys.flatMap(pk => pk.compositePrimaryKey?.map(dto => dto.keyId) || []); if (idsOfColumns.length !== amountOfColumnsInRegularPk) { @@ -142,7 +142,7 @@ const getCreateCompositePKDDLProviderConfig = (primaryKey, entityName, entity) = const getAddCompositePkScriptDtos = collection => { /** * @type {AlterCollectionRoleCompModPrimaryKey} - * */ + */ const pkDto = collection?.role?.compMod?.primaryKey || {}; const newPrimaryKeys = pkDto.new || []; const oldPrimaryKeys = pkDto.old || []; diff --git a/forward_engineering/alterScript/types/AlterKeyDto.js b/forward_engineering/alterScript/types/AlterKeyDto.js index 56e0421..5c21323 100644 --- a/forward_engineering/alterScript/types/AlterKeyDto.js +++ b/forward_engineering/alterScript/types/AlterKeyDto.js @@ -1,12 +1,12 @@ class KeyTransitionDto { /** * @type {boolean} - * */ + */ didTransitionHappen; /** * @return {KeyTransitionDto} - * */ + */ static noTransition() { return { didTransitionHappen: false, @@ -15,7 +15,7 @@ class KeyTransitionDto { /** * @return {KeyTransitionDto} - * */ + */ static transition() { return { didTransitionHappen: true, @@ -26,13 +26,13 @@ class KeyTransitionDto { class PrimaryKeyTransitionDto extends KeyTransitionDto { /** * @type {boolean | undefined} - * */ + */ wasPkChangedInTransition; /** * @param {boolean} wasPkChangedInTransition * @return {PrimaryKeyTransitionDto} - * */ + */ static transition(wasPkChangedInTransition) { return { didTransitionHappen: true, @@ -44,13 +44,13 @@ class PrimaryKeyTransitionDto extends KeyTransitionDto { class UniqueKeyTransitionDto extends KeyTransitionDto { /** * @type {boolean | undefined} - * */ + */ wasUniqueKeyChangedInTransition; /** * @param {boolean} wasUniqueKeyChangedInTransition * @return {UniqueKeyTransitionDto} - * */ + */ static transition(wasUniqueKeyChangedInTransition) { return { didTransitionHappen: true, @@ -62,22 +62,22 @@ class UniqueKeyTransitionDto extends KeyTransitionDto { class KeyScriptModificationDto { /** * @type {string} - * */ + */ script; /** * @type {boolean} - * */ + */ isDropScript; /** * @type {string} - * */ + */ fullTableName; /** * @type {boolean} - * */ + */ isActivated; /** @@ -85,7 +85,7 @@ class KeyScriptModificationDto { * @param {string} script * @param {boolean} isDropScript * @param {boolean} isActivated - * */ + */ constructor(script, fullTableName, isDropScript, isActivated) { this.script = script; this.isDropScript = isDropScript; diff --git a/forward_engineering/alterScript/types/AlterScriptDto.js b/forward_engineering/alterScript/types/AlterScriptDto.js index 599c33f..eca0f18 100644 --- a/forward_engineering/alterScript/types/AlterScriptDto.js +++ b/forward_engineering/alterScript/types/AlterScriptDto.js @@ -1,24 +1,24 @@ class ModificationScript { /** * @type string - * */ + */ script; /** * @type boolean - * */ + */ isDropScript; } class AlterScriptDto { /** * @type {boolean | undefined} - * */ + */ isActivated; /** * @type {Array} - * */ + */ scripts; /** @@ -26,7 +26,7 @@ class AlterScriptDto { * @param isActivated {boolean} * @param isDropScripts {boolean} * @return {Array} - * */ + */ static getInstances(scripts, isActivated, isDropScripts) { return (scripts || []).filter(Boolean).map(script => ({ isActivated, @@ -44,7 +44,7 @@ class AlterScriptDto { * @param isActivated {boolean} * @param isDropScripts {boolean} * @return {AlterScriptDto | undefined} - * */ + */ static getInstance(scripts, isActivated, isDropScripts) { if (!scripts?.filter(Boolean)?.length) { return undefined; @@ -63,11 +63,11 @@ class AlterScriptDto { * @param createScript {string | undefined} * @param isActivated {boolean} * @return {AlterScriptDto | undefined} - * */ + */ static getDropAndRecreateInstance(dropScript, createScript, isActivated) { /** * @type {ModificationScript[]} - * */ + */ const scriptModificationDtos = []; if (dropScript) { scriptModificationDtos.push({ diff --git a/forward_engineering/ddlProvider/ddlHelpers/key/constraintsHelper.js b/forward_engineering/ddlProvider/ddlHelpers/key/constraintsHelper.js index fcb1fc8..ebf1134 100644 --- a/forward_engineering/ddlProvider/ddlHelpers/key/constraintsHelper.js +++ b/forward_engineering/ddlProvider/ddlHelpers/key/constraintsHelper.js @@ -70,7 +70,7 @@ const alterUkConstraint = (tableName, isParentActivated, keyData) => { /** * @param tableName {string} * @param constraintName {string} - * */ + */ const dropUkConstraint = (tableName, constraintName) => { const templateData = { tableName, diff --git a/forward_engineering/utils/joinActivatedAndDeactivatedStatements.js b/forward_engineering/utils/joinActivatedAndDeactivatedStatements.js index ff95b9a..98f1e03 100644 --- a/forward_engineering/utils/joinActivatedAndDeactivatedStatements.js +++ b/forward_engineering/utils/joinActivatedAndDeactivatedStatements.js @@ -8,7 +8,7 @@ const { INLINE_COMMENT } = require('../../constants/constants'); * delimiter: string; * }} * @return {string} - * */ + */ const getDelimiter = ({ index, numberOfStatements, lastIndexOfActivatedStatement, delimiter }) => { const isLastStatement = index === numberOfStatements - 1; const isLastActivatedStatement = index === lastIndexOfActivatedStatement; @@ -31,7 +31,7 @@ const getDelimiter = ({ index, numberOfStatements, lastIndexOfActivatedStatement * indent?: string; * }} * @return {string} - * */ + */ const joinActivatedAndDeactivatedStatements = ({ statements, delimiter = ',', indent = '\n' }) => { const lastIndexOfActivatedStatement = statements.findLastIndex(statement => !statement.startsWith(INLINE_COMMENT)); const numberOfStatements = statements.length; From ff0fe66713ab2cfe588dbc1e0203b39a00dbd0ce Mon Sep 17 00:00:00 2001 From: yevhenii-moroziuk Date: Mon, 19 Jan 2026 13:09:03 +0200 Subject: [PATCH 12/12] Fix comments --- .../alterScript/alterScriptFromDeltaHelper.js | 4 ++++ .../alterScript/alterScriptHelpers/alterEntityHelper.js | 5 ++++- .../columnHelpers/alterColumnNameHelper.js | 7 +++---- 3 files changed, 11 insertions(+), 5 deletions(-) diff --git a/forward_engineering/alterScript/alterScriptFromDeltaHelper.js b/forward_engineering/alterScript/alterScriptFromDeltaHelper.js index ece275f..4eb9a01 100644 --- a/forward_engineering/alterScript/alterScriptFromDeltaHelper.js +++ b/forward_engineering/alterScript/alterScriptFromDeltaHelper.js @@ -1,3 +1,7 @@ +/** + * @typedef {import('../../shared/types').App} App + * @typedef {import('./types/AlterScriptDto').AlterScriptDto} AlterScriptDto + */ const { getContainersScripts } = require('./alterScriptHelpers/alterContainerHelper'); const { getEntitiesScripts } = require('./alterScriptHelpers/alterEntityHelper'); const { diff --git a/forward_engineering/alterScript/alterScriptHelpers/alterEntityHelper.js b/forward_engineering/alterScript/alterScriptHelpers/alterEntityHelper.js index 1347ac4..68a6a4a 100644 --- a/forward_engineering/alterScript/alterScriptHelpers/alterEntityHelper.js +++ b/forward_engineering/alterScript/alterScriptHelpers/alterEntityHelper.js @@ -1,3 +1,6 @@ +/** + * @typedef {import('../../../shared/types').App} App + */ const { omit, toPairs } = require('lodash'); const { AlterScriptDto } = require('../types/AlterScriptDto'); const { getModifiedCommentOnColumnScriptDtos } = require('./columnHelpers/commentsHelper'); @@ -163,7 +166,7 @@ const getDeleteColumnScriptDtos = ddlProvider => collection => { * @returns {(collection: Object) => Array} */ const getModifyColumnScriptDtos = ddlProvider => collection => { - const renamedColumnsScriptDtos = getRenameColumnScriptDtos(ddlProvider)(collection); + const renamedColumnsScriptDtos = getRenameColumnScriptDtos(collection); const updateTypeScriptDtos = getUpdateTypesScriptDtos(ddlProvider)(collection); const modifyNotNullScriptDtos = getModifyNonNullColumnsScriptDtos(collection); const modifyCommentScriptDtos = getModifiedCommentOnColumnScriptDtos(collection); diff --git a/forward_engineering/alterScript/alterScriptHelpers/columnHelpers/alterColumnNameHelper.js b/forward_engineering/alterScript/alterScriptHelpers/columnHelpers/alterColumnNameHelper.js index fee1de4..00b20e9 100644 --- a/forward_engineering/alterScript/alterScriptHelpers/columnHelpers/alterColumnNameHelper.js +++ b/forward_engineering/alterScript/alterScriptHelpers/columnHelpers/alterColumnNameHelper.js @@ -4,7 +4,6 @@ const { getFullCollectionName, isParentContainerActivated, isObjectInDeltaModelActivated, - getSchemaNameFromCollection, wrapInQuotes, } = require('../../../utils/general'); const templates = require('../../../ddlProvider/templates'); @@ -29,10 +28,10 @@ const alterColumnName = (tableName, oldColumnName, newColumnName) => { }; /** - * @param {Object} ddlProvider - * @return {(collection: Object) => Array} + * @param {Object} collection + * @return {Array} */ -const getRenameColumnScriptDtos = ddlProvider => collection => { +const getRenameColumnScriptDtos = collection => { const collectionSchema = getSchemaOfAlterCollection(collection); const fullTableName = getFullCollectionName(collectionSchema); const isContainerActivated = isParentContainerActivated(collection);