From e17f1d13a190e820a7cc0b6e8ec2082ba22c1734 Mon Sep 17 00:00:00 2001 From: Serhii Filonenko Date: Tue, 2 Sep 2025 17:11:39 +0300 Subject: [PATCH] HCK-12564: implement alter script generation for newly added column defaults --- .../alterScriptHelpers/alterEntityHelper.js | 12 ++- .../columnHelpers/defaultValueHelper.js | 77 +++++++++++++++++++ forward_engineering/ddlProvider/templates.js | 2 + 3 files changed, 89 insertions(+), 2 deletions(-) create mode 100644 forward_engineering/alterScript/alterScriptHelpers/columnHelpers/defaultValueHelper.js diff --git a/forward_engineering/alterScript/alterScriptHelpers/alterEntityHelper.js b/forward_engineering/alterScript/alterScriptHelpers/alterEntityHelper.js index 67cafe4..e9f6fa0 100644 --- a/forward_engineering/alterScript/alterScriptHelpers/alterEntityHelper.js +++ b/forward_engineering/alterScript/alterScriptHelpers/alterEntityHelper.js @@ -1,5 +1,6 @@ const _ = require('lodash'); const { AlterScriptDto } = require('../types/AlterScriptDto'); +const { AlterCollectionDto } = require('../types/AlterCollectionDto'); const { getUpdateTypesScriptDtos } = require('./columnHelpers/alterTypeHelper'); const { getRenameColumnScriptDtos } = require('./columnHelpers/renameColumnHelper'); const { getModifyIndexesScriptDtos, getAddedIndexesScriptDtos } = require('./entityHelpers/indexesHelper'); @@ -12,6 +13,7 @@ const { getModifyCheckConstraintScriptDtos } = require('./entityHelpers/checkCon const { getModifyPkConstraintsScriptDtos } = require('./entityHelpers/primaryKeyHelper'); const { getModifyUniqueKeyConstraintsScriptDtos } = require('./entityHelpers/uniqueKeyHelper'); const { getModifyNonNullColumnsScriptDtos } = require('./columnHelpers/nonNullConstraintHelper'); +const { getModifiedDefaultColumnValueScriptDtos } = require('./columnHelpers/defaultValueHelper'); /** * @return {(collection: AlterCollectionDto) => AlterScriptDto | undefined} @@ -207,8 +209,14 @@ const getModifyColumnScriptDtos = (app, dbVersion, scriptFormat) => collection = const renameColumnScriptDtos = getRenameColumnScriptDtos(ddlProvider, scriptFormat)(collection); const updateTypeScriptDtos = getUpdateTypesScriptDtos(ddlProvider, scriptFormat)(collection); const modifyNotNullScriptDtos = getModifyNonNullColumnsScriptDtos({ scriptFormat, collection }); - - return [...renameColumnScriptDtos, ...updateTypeScriptDtos, ...modifyNotNullScriptDtos].filter(Boolean); + const modifyDefaultColumnValueScriptDtos = getModifiedDefaultColumnValueScriptDtos({ scriptFormat, collection }); + + return [ + ...renameColumnScriptDtos, + ...updateTypeScriptDtos, + ...modifyDefaultColumnValueScriptDtos, + ...modifyNotNullScriptDtos, + ].filter(Boolean); }; module.exports = { diff --git a/forward_engineering/alterScript/alterScriptHelpers/columnHelpers/defaultValueHelper.js b/forward_engineering/alterScript/alterScriptHelpers/columnHelpers/defaultValueHelper.js new file mode 100644 index 0000000..c5c8689 --- /dev/null +++ b/forward_engineering/alterScript/alterScriptHelpers/columnHelpers/defaultValueHelper.js @@ -0,0 +1,77 @@ +const { toPairs } = require('lodash'); +const { AlterScriptDto } = require('../../types/AlterScriptDto'); +const { AlterCollectionDto } = require('../../types/AlterCollectionDto'); +const { + prepareNameForScriptFormat, + getSchemaOfAlterCollection, + getFullCollectionName, +} = require('../../../utils/general'); +const { assignTemplates } = require('../../../utils/assignTemplates'); +const { getColumnDefault } = require('../../../ddlProvider/ddlHelpers/columnDefinitionHelpers/getColumnDefault'); +const templates = require('../../../ddlProvider/templates'); + +/** + * @param {object} props + * @property {string} tableName + * @property {string} columnName + * @property {string} defaultValue + * @return {string} + * */ +const updateColumnDefaultValue = ({ tableName, columnName, defaultValue }) => { + return assignTemplates(templates.updateColumnDefaultValue, { + tableName, + columnName, + defaultValue, + }); +}; + +/** + * @param {object} props + * @property {string} [scriptFormat] + * @property {AlterCollectionDto} collection + * @returns {Array} + * */ +const getUpdatedDefaultColumnValueScriptDtos = ({ scriptFormat, collection }) => { + const prepareName = prepareNameForScriptFormat(scriptFormat); + const collectionSchema = getSchemaOfAlterCollection(collection); + const fullTableName = getFullCollectionName(scriptFormat)(collectionSchema); + + return toPairs(collection.properties) + .filter(([_name, jsonSchema]) => { + const oldName = jsonSchema.compMod.oldField.name; + const newDefaultValue = getColumnDefault(jsonSchema); + const oldDefaultValue = getColumnDefault(collection.role.properties[oldName] ?? {}); + + return newDefaultValue !== oldDefaultValue; + }) + .map(([columnName, jsonSchema]) => { + const scriptGenerationConfig = { + tableName: fullTableName, + columnName: prepareName(columnName), + defaultValue: getColumnDefault(jsonSchema), + }; + + return updateColumnDefaultValue(scriptGenerationConfig); + }) + .map(script => AlterScriptDto.getInstance([script], true, false)) + .filter(Boolean); +}; + +/** + * @param {object} props + * @property {string} [scriptFormat] + * @property {AlterCollectionDto} collection + * @returns {Array} + * */ +const getModifiedDefaultColumnValueScriptDtos = ({ scriptFormat, collection }) => { + const updatedDefaultValuesScriptDtos = getUpdatedDefaultColumnValueScriptDtos({ + scriptFormat, + collection, + }); + + return [...updatedDefaultValuesScriptDtos]; +}; + +module.exports = { + getModifiedDefaultColumnValueScriptDtos, +}; diff --git a/forward_engineering/ddlProvider/templates.js b/forward_engineering/ddlProvider/templates.js index 7b2e5b6..8c28d77 100644 --- a/forward_engineering/ddlProvider/templates.js +++ b/forward_engineering/ddlProvider/templates.js @@ -81,4 +81,6 @@ module.exports = { addPkConstraint: 'ALTER TABLE ${tableName} ADD ${constraintStatement};', addNotNullConstraint: 'ALTER TABLE ${tableName} MODIFY ${columnName} NOT NULL;', + + updateColumnDefaultValue: 'ALTER TABLE ${tableName} MODIFY ${columnName}${defaultValue};', };