diff --git a/forward_engineering/api/generateScript.js b/forward_engineering/api/generateScript.js index 835ca2c0..011a60ef 100644 --- a/forward_engineering/api/generateScript.js +++ b/forward_engineering/api/generateScript.js @@ -15,7 +15,7 @@ function generateScript(data, logger, callback, app) { } const scriptFormat = _.get(data, 'options.targetScriptOptions.keyword'); - const script = getAlterScript({ scriptFormat, collection, ddlProvider, app }); + const script = getAlterScript({ scriptFormat, collection, ddlProvider, app, options: data.options }); const applyDropStatements = data.options?.additionalOptions?.some( option => option.id === 'applyDropStatements' && option.value, diff --git a/forward_engineering/helpers/alterScriptFromDeltaHelper.js b/forward_engineering/helpers/alterScriptFromDeltaHelper.js index 6c9e5b33..39f789fb 100644 --- a/forward_engineering/helpers/alterScriptFromDeltaHelper.js +++ b/forward_engineering/helpers/alterScriptFromDeltaHelper.js @@ -40,7 +40,7 @@ const getAlterContainersScripts = (collection, ddlProvider, app) => { return { addedContainerScripts, deletedContainerScripts, modifiedContainerScripts }; }; -const getAlterCollectionsScripts = ({ collection, ddlProvider, app, scriptFormat }) => { +const getAlterCollectionsScripts = ({ collection, ddlProvider, app, scriptFormat, shouldIgnoreColumnComments = false }) => { const getCollectionScripts = (items, compMode, getScript) => items.filter(item => item.compMod?.[compMode]).map(getScript); @@ -67,7 +67,7 @@ const getAlterCollectionsScripts = ({ collection, ddlProvider, app, scriptFormat const addedColumnScripts = getColumnScripts( getItems(collection, 'entities', 'added', 'values'), - getAddColumnScript({ ddlProvider, scriptFormat }), + getAddColumnScript({ ddlProvider, scriptFormat, shouldIgnoreColumnComments }), ); const deletedColumnScripts = getColumnScripts( getItems(collection, 'entities', 'deleted', 'values'), @@ -183,9 +183,17 @@ const getAlterForeignKeysScripts = ({ collection, ddlProvider }) => { return { addedFkScripts, deletedFkScripts, modifiedFkScripts }; }; -const getAlterScript = ({ scriptFormat, collection, ddlProvider, app }) => { +const getAlterScript = ({ scriptFormat, collection, ddlProvider, app, options }) => { + const shouldIgnoreColumnComments = + options?.scriptGenerationOptions?.feActiveOptions?.columnComments === 'ignore'; const script = { - ...getAlterCollectionsScripts({ collection, ddlProvider, app, scriptFormat }), + ...getAlterCollectionsScripts({ + collection, + ddlProvider, + app, + scriptFormat, + shouldIgnoreColumnComments, + }), ...getAlterContainersScripts(collection, ddlProvider, app), ...getAlterViewsScripts({ schema: collection, ddlProvider, app }), ...getAlterTagsScripts({ collection, ddlProvider, app }), diff --git a/forward_engineering/helpers/alterScriptHelpers/alterEntityHelper.js b/forward_engineering/helpers/alterScriptHelpers/alterEntityHelper.js index d4d8100c..14cd075d 100644 --- a/forward_engineering/helpers/alterScriptHelpers/alterEntityHelper.js +++ b/forward_engineering/helpers/alterScriptHelpers/alterEntityHelper.js @@ -17,6 +17,7 @@ const { escapeString } = require('../../utils/escapeString'); const { getModifyPkScripts } = require('./entityHelper/primaryKeyHelper'); const { getModifyUkScripts } = require('./entityHelper/uniqueKeyHelper'); const { getModifyNotNullColumnsScriptDtos } = require('./columnHelpers/notNullConstraintHelper'); +const { getAddedCommentOnColumnScript } = require('./columnHelpers/commentsHelper'); const getAddCollectionScript = ({ ddlProvider, scriptFormat }) => @@ -70,7 +71,7 @@ const getModifyCollectionScript = ddlProvider => collection => { }; const getAddColumnScript = - ({ ddlProvider, scriptFormat }) => + ({ ddlProvider, scriptFormat, shouldIgnoreColumnComments = false }) => collection => { const collectionSchema = { ...collection, @@ -78,23 +79,35 @@ const getAddColumnScript = }; const { schemaName, databaseName, tableName } = getNames(collectionSchema, getName, getEntityName); const fullName = getFullName(databaseName, getFullName(schemaName, tableName)); + const isContainerActivated = isParentContainerActivated(collection) !== false; + const isCollectionActivated = isObjectInDeltaModelActivated(collection) !== false; return _.toPairs(collection.properties) .filter(([_, jsonSchema]) => !jsonSchema.compMod) - .map(([name, jsonSchema]) => - createColumnDefinitionBySchema({ + .flatMap(([name, jsonSchema]) => { + const columnDefinition = createColumnDefinitionBySchema({ name, jsonSchema, parentJsonSchema: collectionSchema, ddlProvider, scriptFormat, - }), - ) - .map(ddlProvider.convertColumnDefinition) - .map( - column => - `ALTER TABLE IF EXISTS ${fullName} ADD COLUMN ${commentIfDeactivated(column.statement, column)};`, - ); + }); + const column = ddlProvider.convertColumnDefinition(columnDefinition); + const isActivated = + isContainerActivated && isCollectionActivated && jsonSchema.isActivated !== false; + const addColumnScript = `ALTER TABLE IF EXISTS ${fullName} ADD COLUMN ${commentIfDeactivated(column.statement, { isActivated })};`; + const commentScript = getAddedCommentOnColumnScript({ + collection, + name, + jsonSchema, + fullName, + scriptFormat, + isCaseSensitive: collectionSchema.isCaseSensitive, + shouldIgnoreColumnComments, + }); + + return [addColumnScript, commentScript].filter(Boolean); + }); }; const getDeleteColumnScript = collection => { diff --git a/forward_engineering/helpers/alterScriptHelpers/columnHelpers/commentsHelper.js b/forward_engineering/helpers/alterScriptHelpers/columnHelpers/commentsHelper.js new file mode 100644 index 00000000..6e529168 --- /dev/null +++ b/forward_engineering/helpers/alterScriptHelpers/columnHelpers/commentsHelper.js @@ -0,0 +1,77 @@ +const { commentIfDeactivated } = require('../../commentHelpers/commentDeactivatedHelper'); +const { + getName, + isParentContainerActivated, + isObjectInDeltaModelActivated, +} = require('../../general'); +const assignTemplates = require('../../../utils/assignTemplates'); +const templates = require('../../../configs/templates'); +const { escapeString } = require('../../../utils/escapeString'); + +/** + * Studio clears jsonSchema.description on newly added columns so comments cannot be inlined. + * The original text is kept on collection.role.properties[name]. + * + * @param {{ jsonSchema: Object, roleProperty: Object }} dto + * @return {string | undefined} + */ +const getAddedColumnComment = ({ jsonSchema, roleProperty } = {}) => { + return ( + jsonSchema?.description || + jsonSchema?.refDescription || + roleProperty?.description || + roleProperty?.refDescription + ); +}; + +/** + * @param {{ + * collection: Object, + * name: string, + * jsonSchema: Object, + * fullName: string, + * scriptFormat: string, + * isCaseSensitive?: boolean, + * shouldIgnoreColumnComments?: boolean, + * }} dto + * @return {string | undefined} + */ +const getAddedCommentOnColumnScript = ({ + collection, + name, + jsonSchema, + fullName, + scriptFormat, + isCaseSensitive, + shouldIgnoreColumnComments = false, +} = {}) => { + if (shouldIgnoreColumnComments) { + return undefined; + } + + if (jsonSchema?.description || jsonSchema?.refDescription) { + return undefined; + } + + const roleProperty = collection?.role?.properties?.[name]; + const comment = getAddedColumnComment({ jsonSchema, roleProperty }); + if (!comment) { + return undefined; + } + + const isContainerActivated = isParentContainerActivated(collection) !== false; + const isCollectionActivated = isObjectInDeltaModelActivated(collection) !== false; + const isColumnActivated = jsonSchema.isActivated !== false; + const isActivated = isContainerActivated && isCollectionActivated && isColumnActivated; + const columnName = getName(isCaseSensitive, name); + const statement = assignTemplates(templates.columnComment, { + fullName: `${fullName}.${columnName}`, + comment: escapeString(scriptFormat, comment), + }); + + return commentIfDeactivated(statement, { isActivated }); +}; + +module.exports = { + getAddedCommentOnColumnScript, +};