From 89ac4ea5e0891977b3f8fe8976549ee825a01040 Mon Sep 17 00:00:00 2001 From: yevhenii-moroziuk Date: Mon, 12 Jan 2026 16:17:03 +0200 Subject: [PATCH 1/6] HCK-14284: Add support of Create/Drop statements --- .../alterScript/alterScriptFromDeltaHelper.js | 36 +++++++++++++++- .../alterContainerHelper.js | 43 +++++++++++++++++++ .../ddlProvider/ddlProvider.js | 10 +++++ forward_engineering/ddlProvider/templates.js | 2 + 4 files changed, 90 insertions(+), 1 deletion(-) create mode 100644 forward_engineering/alterScript/alterScriptHelpers/alterContainerHelper.js diff --git a/forward_engineering/alterScript/alterScriptFromDeltaHelper.js b/forward_engineering/alterScript/alterScriptFromDeltaHelper.js index fc1ab92..496cc5c 100644 --- a/forward_engineering/alterScript/alterScriptFromDeltaHelper.js +++ b/forward_engineering/alterScript/alterScriptFromDeltaHelper.js @@ -1,3 +1,5 @@ +const { isObjectInDeltaModelActivated } = require('../utils/general'); +const { getContainersScripts } = require('./alterScriptHelpers/alterContainerHelper'); const { getModifyCollectionScriptDtos, getModifyCollectionKeysScriptDtos, @@ -12,6 +14,36 @@ const { getModifyViewScriptDtos } = require('./alterScriptHelpers/alterViewHelpe const getItems = data => [data?.items].flat().filter(Boolean); +/** + * @param dto {{ + * collection: Object, + * app: App + * }} + * @return {AlterScriptDto[]} + * */ +const getAlterContainersScriptDtos = ({ collection, app }) => { + const addedContainers = getItems(collection.properties?.containers?.properties?.added); + const deletedContainers = getItems(collection.properties?.containers?.properties?.deleted); + const modifiedContainers = getItems(collection.properties?.containers?.properties?.modified); + + const { getAddContainerScriptDto, getDeleteContainerScriptDto, getModifyContainerScriptDto } = + getContainersScripts(app); + + const addContainersScriptDtos = addedContainers + .map(container => Object.values(container.properties)[0]) + .flatMap(getAddContainerScriptDto); + + const deleteContainersScriptDtos = deletedContainers + .map(container => Object.values(container.properties)[0]) + .flatMap(getDeleteContainerScriptDto); + + const modifyContainersScriptDtos = modifiedContainers + .map(containerWrapper => Object.values(containerWrapper.properties)[0]) + .flatMap(getModifyContainerScriptDto); + + return [...addContainersScriptDtos, ...deleteContainersScriptDtos, ...modifyContainersScriptDtos].filter(Boolean); +}; + const getAlterCollectionScriptDtos = ({ collection, app, @@ -127,6 +159,8 @@ 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 collectionsScriptDtos = getAlterCollectionScriptDtos({ collection, app, @@ -143,7 +177,7 @@ const getAlterScriptDtos = (data, app) => { ignoreRelationshipIDs, }); - return [...collectionsScriptDtos, ...viewScriptDtos, ...relationshipScriptDtos] + return [...containersScriptDtos, ...collectionsScriptDtos, ...viewScriptDtos, ...relationshipScriptDtos] .filter(Boolean) .map(dto => dto && prettifyAlterScriptDto(dto)) .filter(Boolean); diff --git a/forward_engineering/alterScript/alterScriptHelpers/alterContainerHelper.js b/forward_engineering/alterScript/alterScriptHelpers/alterContainerHelper.js new file mode 100644 index 0000000..a0c7a90 --- /dev/null +++ b/forward_engineering/alterScript/alterScriptHelpers/alterContainerHelper.js @@ -0,0 +1,43 @@ +const _ = require('lodash'); +const ddlProvider = require('../../ddlProvider'); +const { AlterScriptDto } = require('../types/AlterScriptDto'); + +const getSchemaName = containerData => containerData.role.name; + +const getAddContainerScriptDto = ddlProvider => containerData => { + const schemaData = { + ...containerData.role, + schemaName: getSchemaName(containerData), + }; + const script = ddlProvider.createSchema(schemaData); + + return AlterScriptDto.getInstance([script], true, false); +}; + +const getDeleteContainerScriptDto = ddlProvider => containerData => { + const script = ddlProvider.dropSchema({ name: getSchemaName(containerData) }); + + return AlterScriptDto.getInstance([script], true, true); +}; + +const getModifyContainerScriptDto = ddlProvider => containerData => { + const scripts = []; + const compMod = containerData.role?.compMod || {}; + const schemaName = getSchemaName(containerData); + + return scripts.filter(Boolean); +}; + +const getContainersScripts = app => { + const ddlProvider = require('../../ddlProvider/ddlProvider')(null, null, app); + + return { + getAddContainerScriptDto: getAddContainerScriptDto(ddlProvider), + getDeleteContainerScriptDto: getDeleteContainerScriptDto(ddlProvider), + getModifyContainerScriptDto: getModifyContainerScriptDto(ddlProvider), + }; +}; + +module.exports = { + getContainersScripts, +}; diff --git a/forward_engineering/ddlProvider/ddlProvider.js b/forward_engineering/ddlProvider/ddlProvider.js index dc487af..f86060f 100644 --- a/forward_engineering/ddlProvider/ddlProvider.js +++ b/forward_engineering/ddlProvider/ddlProvider.js @@ -81,6 +81,16 @@ module.exports = (baseProvider, options, app) => { return commentIfDeactivated(schemaStatement, { isActivated }); }, + dropSchema({ name, isActivated = true }) { + const dropSchemaStatement = assignTemplates({ + template: templates.dropSchema, + templateData: { + schemaName: wrapInQuotes(name), + }, + }); + + return commentIfDeactivated(dropSchemaStatement, { isActivated }); + }, hydrateColumn({ columnDefinition, jsonSchema, schemaData, definitionJsonSchema = {} }) { const isUDTRef = !!jsonSchema.$ref; const type = isUDTRef ? columnDefinition.type : toUpper(jsonSchema.mode || jsonSchema.type); diff --git a/forward_engineering/ddlProvider/templates.js b/forward_engineering/ddlProvider/templates.js index fe6725d..240677d 100644 --- a/forward_engineering/ddlProvider/templates.js +++ b/forward_engineering/ddlProvider/templates.js @@ -1,6 +1,8 @@ module.exports = { createSchema: 'CREATE SCHEMA ${schemaName}${authorization}${dataCapture};', + dropSchema: 'DROP SCHEMA ${schemaName} RESTRICT', + createTable: 'CREATE${tableType} TABLE${ifNotExists} ${name}${tableProps}${tableOptions};', createAuxiliaryTable: 'CREATE${tableType} TABLE ${name}${tableOptions};', From a3e6ebf69cf1be584f63770ae74e9f5d292cb60c Mon Sep 17 00:00:00 2001 From: yevhenii-moroziuk Date: Mon, 12 Jan 2026 17:03:47 +0200 Subject: [PATCH 2/6] HCK-14284: Allow to edit dataCapture --- .../alterScriptHelpers/alterContainerHelper.js | 8 ++++++++ forward_engineering/ddlProvider/ddlProvider.js | 11 +++++++++++ forward_engineering/ddlProvider/templates.js | 2 ++ 3 files changed, 21 insertions(+) diff --git a/forward_engineering/alterScript/alterScriptHelpers/alterContainerHelper.js b/forward_engineering/alterScript/alterScriptHelpers/alterContainerHelper.js index a0c7a90..494905e 100644 --- a/forward_engineering/alterScript/alterScriptHelpers/alterContainerHelper.js +++ b/forward_engineering/alterScript/alterScriptHelpers/alterContainerHelper.js @@ -1,6 +1,7 @@ const _ = require('lodash'); const ddlProvider = require('../../ddlProvider'); const { AlterScriptDto } = require('../types/AlterScriptDto'); +const { getSchemaCommentStatement } = require('../../ddlProvider/ddlHelpers/comment/commentHelper'); const getSchemaName = containerData => containerData.role.name; @@ -24,6 +25,13 @@ const getModifyContainerScriptDto = ddlProvider => containerData => { const scripts = []; const compMod = containerData.role?.compMod || {}; const schemaName = getSchemaName(containerData); + const isActivated = containerData.isActivated !== false; + + const dataCapture = compMod.dataCapture || {}; + if (dataCapture.new && dataCapture.new !== dataCapture.old) { + const alterDataCaptureScript = ddlProvider.alterSchema(schemaName, dataCapture.new); + scripts.push(AlterScriptDto.getInstance([alterDataCaptureScript], isActivated, false)); + } return scripts.filter(Boolean); }; diff --git a/forward_engineering/ddlProvider/ddlProvider.js b/forward_engineering/ddlProvider/ddlProvider.js index f86060f..a51d3cf 100644 --- a/forward_engineering/ddlProvider/ddlProvider.js +++ b/forward_engineering/ddlProvider/ddlProvider.js @@ -91,6 +91,17 @@ module.exports = (baseProvider, options, app) => { return commentIfDeactivated(dropSchemaStatement, { isActivated }); }, + + alterSchema(schemaName, dataCapture) { + return assignTemplates({ + template: templates.alterSchema, + templateData: { + schemaName: wrapInQuotes(schemaName), + dataCapture, + }, + }); + }, + hydrateColumn({ columnDefinition, jsonSchema, schemaData, definitionJsonSchema = {} }) { const isUDTRef = !!jsonSchema.$ref; const type = isUDTRef ? columnDefinition.type : toUpper(jsonSchema.mode || jsonSchema.type); diff --git a/forward_engineering/ddlProvider/templates.js b/forward_engineering/ddlProvider/templates.js index 240677d..ec01f0a 100644 --- a/forward_engineering/ddlProvider/templates.js +++ b/forward_engineering/ddlProvider/templates.js @@ -3,6 +3,8 @@ module.exports = { dropSchema: 'DROP SCHEMA ${schemaName} RESTRICT', + alterSchema: 'ALTER SCHEMA ${schemaName} DATA CAPTURE ${dataCapture};', + createTable: 'CREATE${tableType} TABLE${ifNotExists} ${name}${tableProps}${tableOptions};', createAuxiliaryTable: 'CREATE${tableType} TABLE ${name}${tableOptions};', From 3b131a102559c266f2a76833e70f6386b42ad1f8 Mon Sep 17 00:00:00 2001 From: yevhenii-moroziuk Date: Tue, 13 Jan 2026 10:03:11 +0200 Subject: [PATCH 3/6] HCK-14284: Add logic to render changed comments --- .../alterContainerHelper.js | 15 ++- .../containerHelpers/commentsHelper.js | 27 +++++ .../ddlHelpers/comment/commentHelper.js | 111 ++++++++++++++++-- .../ddlProvider/ddlProvider.js | 12 +- 4 files changed, 152 insertions(+), 13 deletions(-) create mode 100644 forward_engineering/alterScript/alterScriptHelpers/containerHelpers/commentsHelper.js diff --git a/forward_engineering/alterScript/alterScriptHelpers/alterContainerHelper.js b/forward_engineering/alterScript/alterScriptHelpers/alterContainerHelper.js index 494905e..48cdc21 100644 --- a/forward_engineering/alterScript/alterScriptHelpers/alterContainerHelper.js +++ b/forward_engineering/alterScript/alterScriptHelpers/alterContainerHelper.js @@ -1,7 +1,12 @@ const _ = require('lodash'); const ddlProvider = require('../../ddlProvider'); const { AlterScriptDto } = require('../types/AlterScriptDto'); -const { getSchemaCommentStatement } = require('../../ddlProvider/ddlHelpers/comment/commentHelper'); +const { + getSchemaCommentStatement, + getDeleteCommentStatement, +} = require('../../ddlProvider/ddlHelpers/comment/commentHelper'); +const { wrapInQuotes } = require('../../utils/general'); +const { getModifiedCommentOnSchemaScriptDtos } = require('./containerHelpers/commentsHelper'); const getSchemaName = containerData => containerData.role.name; @@ -33,7 +38,13 @@ const getModifyContainerScriptDto = ddlProvider => containerData => { scripts.push(AlterScriptDto.getInstance([alterDataCaptureScript], isActivated, false)); } - return scripts.filter(Boolean); + const commentScripts = getModifiedCommentOnSchemaScriptDtos({ + schemaName, + compMod, + isActivated, + }); + + return [...scripts, ...commentScripts].filter(Boolean); }; const getContainersScripts = app => { diff --git a/forward_engineering/alterScript/alterScriptHelpers/containerHelpers/commentsHelper.js b/forward_engineering/alterScript/alterScriptHelpers/containerHelpers/commentsHelper.js new file mode 100644 index 0000000..ffbae62 --- /dev/null +++ b/forward_engineering/alterScript/alterScriptHelpers/containerHelpers/commentsHelper.js @@ -0,0 +1,27 @@ +const { AlterScriptDto } = require('../../types/AlterScriptDto'); +const { + getSchemaCommentStatement, + dropSchemaCommentStatement, +} = require('../../../ddlProvider/ddlHelpers/comment/commentHelper'); +const { wrapInQuotes } = require('../../../utils/general'); + +const getModifiedCommentOnSchemaScriptDtos = ({ schemaName, compMod, isActivated }) => { + const scripts = []; + const description = compMod.description || {}; + + if (description.new && description.new !== description.old) { + const script = getSchemaCommentStatement({ schemaName, description: description.new }); + scripts.push(AlterScriptDto.getInstance([script], isActivated, false)); + } + + if (description.old && !description.new) { + const script = dropSchemaCommentStatement({ schemaName }); + scripts.push(AlterScriptDto.getInstance([script], isActivated, true)); + } + + return scripts; +}; + +module.exports = { + getModifiedCommentOnSchemaScriptDtos, +}; diff --git a/forward_engineering/ddlProvider/ddlHelpers/comment/commentHelper.js b/forward_engineering/ddlProvider/ddlHelpers/comment/commentHelper.js index d6c8db8..b299525 100644 --- a/forward_engineering/ddlProvider/ddlHelpers/comment/commentHelper.js +++ b/forward_engineering/ddlProvider/ddlHelpers/comment/commentHelper.js @@ -7,11 +7,20 @@ const { wrapInQuotes, commentIfDeactivated, wrapInSingleQuotes } = require('../. * @enum {string} */ const OBJECT_TYPE = { + schema: 'SCHEMA', column: 'COLUMN', table: 'TABLE', index: 'INDEX', }; +/** + * @enum {string} + */ +const COMMENT_MODE = { + set: 'set', + remove: 'remove', +}; + /** * @param {string} description * @returns {string} @@ -19,31 +28,39 @@ const OBJECT_TYPE = { const escapeSpecialCharacters = description => description.replace(/'/g, "''"); /** - * @param {{ objectName: string, objectType: OBJECT_TYPE, description?: string }} + * @param {{ objectName: string, objectType: OBJECT_TYPE, description?: string, mode?: COMMENT_MODE }} * @returns {string} */ -const getCommentStatement = ({ objectName, objectType, description }) => { - if (!description) { +const getCommentStatement = ({ objectName, objectType, description, mode = COMMENT_MODE.set }) => { + if (mode === COMMENT_MODE.set && !description) { return ''; } + const commentValue = + mode === COMMENT_MODE.remove ? 'NULL' : wrapInSingleQuotes({ name: escapeSpecialCharacters(description) }); + return assignTemplates({ template: templates.comment, templateData: { objectType, objectName: trim(objectName), - comment: wrapInSingleQuotes({ name: escapeSpecialCharacters(description) }), + comment: commentValue, }, }); }; /** - * @param {{ tableName, string, columnName: string, description?: string }} + * @param {{ tableName, columnName: string, description?: string }} * @returns {string} */ const getColumnCommentStatement = ({ tableName, columnName, description }) => { const objectName = tableName + '.' + wrapInQuotes(columnName); - return getCommentStatement({ objectName, objectType: OBJECT_TYPE.column, description }); + return getCommentStatement({ + objectName, + objectType: OBJECT_TYPE.column, + description, + mode: COMMENT_MODE.set, + }); }; /** @@ -51,7 +68,12 @@ const getColumnCommentStatement = ({ tableName, columnName, description }) => { * @returns {string} */ const getTableCommentStatement = ({ tableName, description }) => { - return getCommentStatement({ objectName: tableName, objectType: OBJECT_TYPE.table, description }); + return getCommentStatement({ + objectName: tableName, + objectType: OBJECT_TYPE.table, + description, + mode: COMMENT_MODE.set, + }); }; /** @@ -59,7 +81,25 @@ const getTableCommentStatement = ({ tableName, description }) => { * @returns {string} */ const getIndexCommentStatement = ({ indexName, description }) => { - return getCommentStatement({ objectName: indexName, objectType: OBJECT_TYPE.index, description }); + return getCommentStatement({ + objectName: indexName, + objectType: OBJECT_TYPE.index, + description, + mode: COMMENT_MODE.set, + }); +}; + +/** + * @param {{ schemaName: string, description?: string }} + * @returns {string} + */ +const getSchemaCommentStatement = ({ schemaName, description }) => { + return getCommentStatement({ + objectName: schemaName, + objectType: OBJECT_TYPE.schema, + description, + mode: COMMENT_MODE.set, + }); }; /** @@ -81,9 +121,64 @@ const getColumnComments = ({ tableName, columnDefinitions = [] }) => { .join('\n'); }; +/** + * @param {{ tableName: string, columnName: string }} + * @returns {string} + */ +const dropColumnCommentStatement = ({ tableName, columnName }) => { + const objectName = tableName + '.' + wrapInQuotes(columnName); + return getCommentStatement({ + objectName, + objectType: OBJECT_TYPE.column, + mode: COMMENT_MODE.remove, + }); +}; + +/** + * @param {{ tableName: string }} + * @returns {string} + */ +const dropTableCommentStatement = ({ tableName }) => { + return getCommentStatement({ + objectName: tableName, + objectType: OBJECT_TYPE.table, + mode: COMMENT_MODE.remove, + }); +}; + +/** + * @param {{ indexName: string }} + * @returns {string} + */ +const dropIndexCommentStatement = ({ indexName }) => { + return getCommentStatement({ + objectName: indexName, + objectType: OBJECT_TYPE.index, + mode: COMMENT_MODE.remove, + }); +}; + +/** + * @param {{ schemaName: string }} + * @returns {string} + */ +const dropSchemaCommentStatement = ({ schemaName }) => { + return getCommentStatement({ + objectName: schemaName, + objectType: OBJECT_TYPE.schema, + mode: COMMENT_MODE.remove, + }); +}; + module.exports = { getColumnCommentStatement, + getSchemaCommentStatement, getTableCommentStatement, getColumnComments, getIndexCommentStatement, + + dropSchemaCommentStatement, + dropColumnCommentStatement, + dropTableCommentStatement, + dropIndexCommentStatement, }; diff --git a/forward_engineering/ddlProvider/ddlProvider.js b/forward_engineering/ddlProvider/ddlProvider.js index a51d3cf..0918f05 100644 --- a/forward_engineering/ddlProvider/ddlProvider.js +++ b/forward_engineering/ddlProvider/ddlProvider.js @@ -20,6 +20,7 @@ const { getTableCommentStatement, getColumnComments, getIndexCommentStatement, + getSchemaCommentStatement, } = require('./ddlHelpers/comment/commentHelper.js'); const { getTableProps } = require('./ddlHelpers/table/getTableProps.js'); const { getTableOptions } = require('./ddlHelpers/table/getTableOptions.js'); @@ -65,20 +66,25 @@ module.exports = (baseProvider, options, app) => { authorizationName: containerData.authorizationName, dataCapture: containerData.dataCapture, isActivated: containerData.isActivated, + description: containerData.description, }; }, - createSchema({ schemaName, ifNotExist, authorizationName, dataCapture, isActivated = true }) { + createSchema({ schemaName, ifNotExist, authorizationName, dataCapture, description, isActivated = true }) { + const wrappedSchemaName = wrapInQuotes(schemaName); const schemaStatement = assignTemplates({ template: templates.createSchema, templateData: { - schemaName: wrapInQuotes(schemaName), + schemaName: wrappedSchemaName, authorization: authorizationName ? ' AUTHORIZATION ' + authorizationName : '', dataCapture: dataCapture ? ' DATA CAPTURE ' + dataCapture : '', }, }); - return commentIfDeactivated(schemaStatement, { isActivated }); + const comment = getSchemaCommentStatement({ schemaName: wrappedSchemaName, description }); + const commentStatement = comment ? '\n' + comment + '\n' : '\n'; + + return commentIfDeactivated(schemaStatement + commentStatement, { isActivated }); }, dropSchema({ name, isActivated = true }) { From b340981294c15dd0ca9a45b5066bdfbc6c634ed6 Mon Sep 17 00:00:00 2001 From: yevhenii-moroziuk Date: Tue, 13 Jan 2026 11:35:53 +0200 Subject: [PATCH 4/6] HCK-14284: Improve handling of changed props --- .../alterContainerHelper.js | 10 +++---- .../ddlProvider/ddlProvider.js | 4 +-- forward_engineering/ddlProvider/templates.js | 2 +- forward_engineering/utils/general.js | 30 ++++++++++++++++++- 4 files changed, 37 insertions(+), 9 deletions(-) diff --git a/forward_engineering/alterScript/alterScriptHelpers/alterContainerHelper.js b/forward_engineering/alterScript/alterScriptHelpers/alterContainerHelper.js index 48cdc21..3e708dc 100644 --- a/forward_engineering/alterScript/alterScriptHelpers/alterContainerHelper.js +++ b/forward_engineering/alterScript/alterScriptHelpers/alterContainerHelper.js @@ -1,11 +1,11 @@ -const _ = require('lodash'); +const { isEmpty } = require('lodash'); const ddlProvider = require('../../ddlProvider'); const { AlterScriptDto } = require('../types/AlterScriptDto'); const { getSchemaCommentStatement, getDeleteCommentStatement, } = require('../../ddlProvider/ddlHelpers/comment/commentHelper'); -const { wrapInQuotes } = require('../../utils/general'); +const { wrapInQuotes, getIsChangeProperties, getUpdatedProperties } = require('../../utils/general'); const { getModifiedCommentOnSchemaScriptDtos } = require('./containerHelpers/commentsHelper'); const getSchemaName = containerData => containerData.role.name; @@ -31,10 +31,10 @@ const getModifyContainerScriptDto = ddlProvider => containerData => { const compMod = containerData.role?.compMod || {}; const schemaName = getSchemaName(containerData); const isActivated = containerData.isActivated !== false; + const updatedProperties = getUpdatedProperties(compMod, ['dataCapture']); - const dataCapture = compMod.dataCapture || {}; - if (dataCapture.new && dataCapture.new !== dataCapture.old) { - const alterDataCaptureScript = ddlProvider.alterSchema(schemaName, dataCapture.new); + if (!isEmpty(updatedProperties)) { + const alterDataCaptureScript = ddlProvider.alterSchema(schemaName, updatedProperties); scripts.push(AlterScriptDto.getInstance([alterDataCaptureScript], isActivated, false)); } diff --git a/forward_engineering/ddlProvider/ddlProvider.js b/forward_engineering/ddlProvider/ddlProvider.js index 0918f05..3f5287c 100644 --- a/forward_engineering/ddlProvider/ddlProvider.js +++ b/forward_engineering/ddlProvider/ddlProvider.js @@ -98,12 +98,12 @@ module.exports = (baseProvider, options, app) => { return commentIfDeactivated(dropSchemaStatement, { isActivated }); }, - alterSchema(schemaName, dataCapture) { + alterSchema(schemaName, { dataCapture }) { return assignTemplates({ template: templates.alterSchema, templateData: { schemaName: wrapInQuotes(schemaName), - dataCapture, + dataCapture: dataCapture ? ' DATA CAPTURE ' + dataCapture : '', }, }); }, diff --git a/forward_engineering/ddlProvider/templates.js b/forward_engineering/ddlProvider/templates.js index ec01f0a..f4ab282 100644 --- a/forward_engineering/ddlProvider/templates.js +++ b/forward_engineering/ddlProvider/templates.js @@ -3,7 +3,7 @@ module.exports = { dropSchema: 'DROP SCHEMA ${schemaName} RESTRICT', - alterSchema: 'ALTER SCHEMA ${schemaName} DATA CAPTURE ${dataCapture};', + alterSchema: 'ALTER SCHEMA ${schemaName}${dataCapture};', createTable: 'CREATE${tableType} TABLE${ifNotExists} ${name}${tableProps}${tableOptions};', diff --git a/forward_engineering/utils/general.js b/forward_engineering/utils/general.js index dab44a8..76a365a 100644 --- a/forward_engineering/utils/general.js +++ b/forward_engineering/utils/general.js @@ -1,4 +1,4 @@ -const { toLower, omit } = require('lodash'); +const { toLower, omit, isEqual } = require('lodash'); const { INLINE_COMMENT } = require('../../constants/constants'); /** @@ -146,6 +146,33 @@ const isParentContainerActivated = collection => { ); }; +/** + * + * @template {object} T + * @param {{ new: T, old: T }} + * @returns {boolean} + */ +const compareProperties = ({ new: newProperty, old: oldProperty }) => { + if (!newProperty && !oldProperty) { + return; + } + return !isEqual(newProperty, oldProperty); +}; + +/** + * @param {object} compMod + * @param {string[]} properties + * @returns {object} Only changed properties with their new values + */ +const getUpdatedProperties = (compMod, properties) => + properties.reduce((acc, property) => { + const propCompMod = compMod[property] || {}; + if (compareProperties(propCompMod) && propCompMod.new !== undefined) { + acc[property] = propCompMod.new; + } + return acc; + }, {}); + module.exports = { setTab, hasType, @@ -165,4 +192,5 @@ module.exports = { isObjectInDeltaModelActivated, isParentContainerActivated, getSchemaNameFromCollection, + getUpdatedProperties, }; From ddd2e2a220f58c76f45a1c0b5af0bd20063b273f Mon Sep 17 00:00:00 2001 From: yevhenii-moroziuk Date: Tue, 13 Jan 2026 13:05:28 +0200 Subject: [PATCH 5/6] HCK-14284: Clean up the code --- .../alterScript/alterScriptFromDeltaHelper.js | 1 - .../alterContainerHelper.js | 19 +++++--- .../containerHelpers/commentsHelper.js | 7 ++- .../ddlHelpers/comment/commentHelper.js | 45 +------------------ 4 files changed, 16 insertions(+), 56 deletions(-) diff --git a/forward_engineering/alterScript/alterScriptFromDeltaHelper.js b/forward_engineering/alterScript/alterScriptFromDeltaHelper.js index 496cc5c..16e4794 100644 --- a/forward_engineering/alterScript/alterScriptFromDeltaHelper.js +++ b/forward_engineering/alterScript/alterScriptFromDeltaHelper.js @@ -1,4 +1,3 @@ -const { isObjectInDeltaModelActivated } = require('../utils/general'); const { getContainersScripts } = require('./alterScriptHelpers/alterContainerHelper'); const { getModifyCollectionScriptDtos, diff --git a/forward_engineering/alterScript/alterScriptHelpers/alterContainerHelper.js b/forward_engineering/alterScript/alterScriptHelpers/alterContainerHelper.js index 3e708dc..4ae357b 100644 --- a/forward_engineering/alterScript/alterScriptHelpers/alterContainerHelper.js +++ b/forward_engineering/alterScript/alterScriptHelpers/alterContainerHelper.js @@ -8,12 +8,12 @@ const { const { wrapInQuotes, getIsChangeProperties, getUpdatedProperties } = require('../../utils/general'); const { getModifiedCommentOnSchemaScriptDtos } = require('./containerHelpers/commentsHelper'); -const getSchemaName = containerData => containerData.role.name; +const extractSchemaName = containerData => containerData.role.name; const getAddContainerScriptDto = ddlProvider => containerData => { const schemaData = { ...containerData.role, - schemaName: getSchemaName(containerData), + schemaName: extractSchemaName(containerData), }; const script = ddlProvider.createSchema(schemaData); @@ -21,7 +21,7 @@ const getAddContainerScriptDto = ddlProvider => containerData => { }; const getDeleteContainerScriptDto = ddlProvider => containerData => { - const script = ddlProvider.dropSchema({ name: getSchemaName(containerData) }); + const script = ddlProvider.dropSchema({ name: extractSchemaName(containerData) }); return AlterScriptDto.getInstance([script], true, true); }; @@ -29,7 +29,8 @@ const getDeleteContainerScriptDto = ddlProvider => containerData => { const getModifyContainerScriptDto = ddlProvider => containerData => { const scripts = []; const compMod = containerData.role?.compMod || {}; - const schemaName = getSchemaName(containerData); + const schemaName = extractSchemaName(containerData); + const wrappedSchemaName = wrapInQuotes(schemaName); const isActivated = containerData.isActivated !== false; const updatedProperties = getUpdatedProperties(compMod, ['dataCapture']); @@ -38,13 +39,17 @@ const getModifyContainerScriptDto = ddlProvider => containerData => { scripts.push(AlterScriptDto.getInstance([alterDataCaptureScript], isActivated, false)); } - const commentScripts = getModifiedCommentOnSchemaScriptDtos({ - schemaName, + const commentScript = getModifiedCommentOnSchemaScriptDtos({ + schemaName: wrappedSchemaName, compMod, isActivated, }); - return [...scripts, ...commentScripts].filter(Boolean); + if (commentScript) { + scripts.push(commentScript); + } + + return scripts; }; const getContainersScripts = app => { diff --git a/forward_engineering/alterScript/alterScriptHelpers/containerHelpers/commentsHelper.js b/forward_engineering/alterScript/alterScriptHelpers/containerHelpers/commentsHelper.js index ffbae62..479beab 100644 --- a/forward_engineering/alterScript/alterScriptHelpers/containerHelpers/commentsHelper.js +++ b/forward_engineering/alterScript/alterScriptHelpers/containerHelpers/commentsHelper.js @@ -6,20 +6,19 @@ const { const { wrapInQuotes } = require('../../../utils/general'); const getModifiedCommentOnSchemaScriptDtos = ({ schemaName, compMod, isActivated }) => { - const scripts = []; const description = compMod.description || {}; if (description.new && description.new !== description.old) { const script = getSchemaCommentStatement({ schemaName, description: description.new }); - scripts.push(AlterScriptDto.getInstance([script], isActivated, false)); + return AlterScriptDto.getInstance([script], isActivated, false); } if (description.old && !description.new) { const script = dropSchemaCommentStatement({ schemaName }); - scripts.push(AlterScriptDto.getInstance([script], isActivated, true)); + return AlterScriptDto.getInstance([script], isActivated, true); } - return scripts; + return undefined; }; module.exports = { diff --git a/forward_engineering/ddlProvider/ddlHelpers/comment/commentHelper.js b/forward_engineering/ddlProvider/ddlHelpers/comment/commentHelper.js index b299525..3ca70c6 100644 --- a/forward_engineering/ddlProvider/ddlHelpers/comment/commentHelper.js +++ b/forward_engineering/ddlProvider/ddlHelpers/comment/commentHelper.js @@ -36,15 +36,12 @@ const getCommentStatement = ({ objectName, objectType, description, mode = COMME return ''; } - const commentValue = - mode === COMMENT_MODE.remove ? 'NULL' : wrapInSingleQuotes({ name: escapeSpecialCharacters(description) }); - return assignTemplates({ template: templates.comment, templateData: { objectType, objectName: trim(objectName), - comment: commentValue, + comment: wrapInSingleQuotes({ name: escapeSpecialCharacters(description || '') }), }, }); }; @@ -121,43 +118,6 @@ const getColumnComments = ({ tableName, columnDefinitions = [] }) => { .join('\n'); }; -/** - * @param {{ tableName: string, columnName: string }} - * @returns {string} - */ -const dropColumnCommentStatement = ({ tableName, columnName }) => { - const objectName = tableName + '.' + wrapInQuotes(columnName); - return getCommentStatement({ - objectName, - objectType: OBJECT_TYPE.column, - mode: COMMENT_MODE.remove, - }); -}; - -/** - * @param {{ tableName: string }} - * @returns {string} - */ -const dropTableCommentStatement = ({ tableName }) => { - return getCommentStatement({ - objectName: tableName, - objectType: OBJECT_TYPE.table, - mode: COMMENT_MODE.remove, - }); -}; - -/** - * @param {{ indexName: string }} - * @returns {string} - */ -const dropIndexCommentStatement = ({ indexName }) => { - return getCommentStatement({ - objectName: indexName, - objectType: OBJECT_TYPE.index, - mode: COMMENT_MODE.remove, - }); -}; - /** * @param {{ schemaName: string }} * @returns {string} @@ -178,7 +138,4 @@ module.exports = { getIndexCommentStatement, dropSchemaCommentStatement, - dropColumnCommentStatement, - dropTableCommentStatement, - dropIndexCommentStatement, }; From 9ed74a99919ddffc70940f235e027c891945fcd3 Mon Sep 17 00:00:00 2001 From: yevhenii-moroziuk Date: Tue, 13 Jan 2026 14:57:11 +0200 Subject: [PATCH 6/6] Fix remark --- .../alterScript/alterScriptFromDeltaHelper.js | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/forward_engineering/alterScript/alterScriptFromDeltaHelper.js b/forward_engineering/alterScript/alterScriptFromDeltaHelper.js index 16e4794..8207516 100644 --- a/forward_engineering/alterScript/alterScriptFromDeltaHelper.js +++ b/forward_engineering/alterScript/alterScriptFromDeltaHelper.js @@ -21,9 +21,10 @@ const getItems = data => [data?.items].flat().filter(Boolean); * @return {AlterScriptDto[]} * */ const getAlterContainersScriptDtos = ({ collection, app }) => { - const addedContainers = getItems(collection.properties?.containers?.properties?.added); - const deletedContainers = getItems(collection.properties?.containers?.properties?.deleted); - const modifiedContainers = getItems(collection.properties?.containers?.properties?.modified); + const { added, deleted, modified } = collection.properties?.containers?.properties || {}; + const addedContainers = getItems(added); + const deletedContainers = getItems(deleted); + const modifiedContainers = getItems(modified); const { getAddContainerScriptDto, getDeleteContainerScriptDto, getModifyContainerScriptDto } = getContainersScripts(app);