diff --git a/forward_engineering/alterScript/alterScriptFromDeltaHelper.js b/forward_engineering/alterScript/alterScriptFromDeltaHelper.js index ad1cd34..863fb1f 100644 --- a/forward_engineering/alterScript/alterScriptFromDeltaHelper.js +++ b/forward_engineering/alterScript/alterScriptFromDeltaHelper.js @@ -15,7 +15,11 @@ const { getDeleteColumnFromTypeScriptDtos, getModifyColumnOfTypeScriptDtos, } = require('./alterScriptHelpers/alterUdtHelper'); -const { getAddViewScriptDto, getDeleteViewScriptDto } = require('./alterScriptHelpers/alterViewHelper'); +const { + getAddViewScriptDto, + getDeleteViewScriptDto, + getModifyViewScriptDtos, +} = require('./alterScriptHelpers/alterViewHelper'); const { getModifyForeignKeyScriptDtos, getDeleteForeignKeyScriptDtos, @@ -156,7 +160,14 @@ const getAlterViewScriptDtos = (collection, app, dbVersion, scriptFormat) => { .map(view => ({ ...view, ...(view.role || {}) })) .map(getDeleteViewScriptDto(app, scriptFormat)); - return [...deleteViewsScriptDtos, ...createViewsScriptDtos].filter(Boolean); + const modifyViewsScriptDtos = [] + .concat(collection.properties?.views?.properties?.modified?.items) + .filter(Boolean) + .map(viewWrapper => Object.values(viewWrapper.properties)[0]) + .map(view => ({ ...view, ...(view.role || {}) })) + .flatMap(getModifyViewScriptDtos({ scriptFormat })); + + return [...deleteViewsScriptDtos, ...createViewsScriptDtos, ...modifyViewsScriptDtos].filter(Boolean); }; /** diff --git a/forward_engineering/alterScript/alterScriptHelpers/alterEntityHelper.js b/forward_engineering/alterScript/alterScriptHelpers/alterEntityHelper.js index e9f6fa0..75c0084 100644 --- a/forward_engineering/alterScript/alterScriptHelpers/alterEntityHelper.js +++ b/forward_engineering/alterScript/alterScriptHelpers/alterEntityHelper.js @@ -14,6 +14,8 @@ const { getModifyPkConstraintsScriptDtos } = require('./entityHelpers/primaryKey const { getModifyUniqueKeyConstraintsScriptDtos } = require('./entityHelpers/uniqueKeyHelper'); const { getModifyNonNullColumnsScriptDtos } = require('./columnHelpers/nonNullConstraintHelper'); const { getModifiedDefaultColumnValueScriptDtos } = require('./columnHelpers/defaultValueHelper'); +const { getModifyEntityCommentsScriptDtos } = require('./entityHelpers/commentsHelper'); +const { getModifiedCommentOnColumnScriptDtos } = require('./columnHelpers/commentsHelper'); /** * @return {(collection: AlterCollectionDto) => AlterScriptDto | undefined} @@ -97,12 +99,14 @@ const getModifyCollectionScriptDtos = ); const modifyPKConstraintDtos = getModifyPkConstraintsScriptDtos({ scriptFormat, collection }); + const modifyCommentScriptDtos = getModifyEntityCommentsScriptDtos({ scriptFormat, collection }); const modifyUniqueKeyConstraintDtos = getModifyUniqueKeyConstraintsScriptDtos({ scriptFormat, collection }); const modifyCheckConstraintScriptDtos = getModifyCheckConstraintScriptDtos({ scriptFormat })(collection); const modifyIndexesScriptDtos = getModifyIndexesScriptDtos({ ddlProvider, scriptFormat })({ collection }); return [ ...modifyPKConstraintDtos, + ...modifyCommentScriptDtos, ...modifyUniqueKeyConstraintDtos, ...modifyIndexesScriptDtos, ...modifyCheckConstraintScriptDtos, @@ -209,11 +213,13 @@ const getModifyColumnScriptDtos = (app, dbVersion, scriptFormat) => collection = const renameColumnScriptDtos = getRenameColumnScriptDtos(ddlProvider, scriptFormat)(collection); const updateTypeScriptDtos = getUpdateTypesScriptDtos(ddlProvider, scriptFormat)(collection); const modifyNotNullScriptDtos = getModifyNonNullColumnsScriptDtos({ scriptFormat, collection }); + const modifyCommentScriptDtos = getModifiedCommentOnColumnScriptDtos({ scriptFormat, collection }); const modifyDefaultColumnValueScriptDtos = getModifiedDefaultColumnValueScriptDtos({ scriptFormat, collection }); return [ ...renameColumnScriptDtos, ...updateTypeScriptDtos, + ...modifyCommentScriptDtos, ...modifyDefaultColumnValueScriptDtos, ...modifyNotNullScriptDtos, ].filter(Boolean); diff --git a/forward_engineering/alterScript/alterScriptHelpers/alterViewHelper.js b/forward_engineering/alterScript/alterScriptHelpers/alterViewHelper.js index e7fe7f6..3e0a9bc 100644 --- a/forward_engineering/alterScript/alterScriptHelpers/alterViewHelper.js +++ b/forward_engineering/alterScript/alterScriptHelpers/alterViewHelper.js @@ -2,6 +2,7 @@ const _ = require('lodash'); const { AlterScriptDto } = require('../types/AlterScriptDto'); const { mapDeltaDualityViewToFeDualityView } = require('./dualityViewHelpers/deltaDualityViewToFeDualityViewMapper'); const { prepareNameForScriptFormat } = require('../../utils/general'); +const { getModifyViewCommentsScriptDtos } = require('./viewHelpers/commentsHelper'); /** * @return {(view: Object) => AlterScriptDto | undefined} @@ -62,6 +63,19 @@ const getDeleteViewScriptDto = (app, scriptFormat) => view => { return AlterScriptDto.getInstance([dropViewScript], true, true); }; +/** + * @param {object} params + * @property {string} [scriptFormat] + * @return {(view: AlterCollectionDto) => AlterScriptDto[]} + * */ +const getModifyViewScriptDtos = + ({ scriptFormat }) => + view => { + const modifyCommentsScriptDtos = getModifyViewCommentsScriptDtos({ scriptFormat, view }); + + return [...modifyCommentsScriptDtos].filter(Boolean); + }; + const getKeys = ({ view, collectionRefsDefinitionsMap, ddlProvider, app }) => { const { mapProperties } = app.require('@hackolade/ddl-fe-utils'); @@ -104,4 +118,5 @@ const getKeys = ({ view, collectionRefsDefinitionsMap, ddlProvider, app }) => { module.exports = { getAddViewScriptDto, getDeleteViewScriptDto, + getModifyViewScriptDtos, }; diff --git a/forward_engineering/alterScript/alterScriptHelpers/columnHelpers/commentsHelper.js b/forward_engineering/alterScript/alterScriptHelpers/columnHelpers/commentsHelper.js new file mode 100644 index 0000000..62dd1af --- /dev/null +++ b/forward_engineering/alterScript/alterScriptHelpers/columnHelpers/commentsHelper.js @@ -0,0 +1,70 @@ +const { toPairs } = require('lodash'); +const { AlterScriptDto } = require('../../types/AlterScriptDto'); +const { + getFullColumnName, + wrapComment, + getSchemaOfAlterCollection, + getFullCollectionName, + prepareNameForScriptFormat, +} = require('../../../utils/general'); +const { assignTemplates } = require('../../../utils/assignTemplates'); +const templates = require('../../../ddlProvider/templates'); + +/** + * @param {string} objectName + * @param {string} comment + * @return {string} + * */ +const updateColumnComment = (objectName, comment) => { + const templateConfig = { + object: 'COLUMN', + objectName, + comment, + }; + + return assignTemplates(templates.comment, templateConfig); +}; + +/** + * @param {object} params + * @property {string} [scriptFormat] + * @property {AlterCollectionDto} collection + * @return {AlterScriptDto[]} + * */ +const getUpdatedCommentOnColumnScriptDtos = ({ scriptFormat, collection }) => { + const collectionSchema = getSchemaOfAlterCollection(collection); + const fullTableName = getFullCollectionName(scriptFormat)(collectionSchema); + + return toPairs(collection.properties) + .filter(([name, jsonSchema]) => { + const newComment = jsonSchema.description; + const oldName = jsonSchema.compMod.oldField.name; + const oldComment = collection.role.properties[oldName]?.description; + + return newComment && (!oldComment || newComment !== oldComment); + }) + .map(([name, jsonSchema]) => { + const wrappedComment = wrapComment(jsonSchema.description); + const columnName = prepareNameForScriptFormat(scriptFormat)(name); + const fullColumnName = `${fullTableName}.${columnName}`; + + return updateColumnComment(fullColumnName, wrappedComment); + }) + .map(script => AlterScriptDto.getInstance([script], true, false)); +}; + +/** + * @param {object} params + * @property {string} [scriptFormat] + * @property {AlterCollectionDto} collection + * @return {AlterScriptDto[]} + * */ +const getModifiedCommentOnColumnScriptDtos = ({ scriptFormat, collection }) => { + const updatedCommentScripts = getUpdatedCommentOnColumnScriptDtos({ scriptFormat, collection }); + + return [...updatedCommentScripts]; +}; + +module.exports = { + getModifiedCommentOnColumnScriptDtos, +}; diff --git a/forward_engineering/alterScript/alterScriptHelpers/entityHelpers/commentsHelper.js b/forward_engineering/alterScript/alterScriptHelpers/entityHelpers/commentsHelper.js new file mode 100644 index 0000000..e30055d --- /dev/null +++ b/forward_engineering/alterScript/alterScriptHelpers/entityHelpers/commentsHelper.js @@ -0,0 +1,60 @@ +const { AlterScriptDto } = require('../../types/AlterScriptDto'); +const { AlterCollectionDto } = require('../../types/AlterCollectionDto'); +const { assignTemplates } = require('../../../utils/assignTemplates'); +const { wrapComment, getSchemaOfAlterCollection, getFullCollectionName } = require('../../../utils/general'); +const templates = require('../../../ddlProvider/templates'); + +/** + * @param {string} objectName + * @param {string} comment + * @return {string} + * */ +const updateTableComment = (objectName, comment) => { + const templateConfig = { + object: 'TABLE', + objectName, + comment, + }; + return assignTemplates(templates.comment, templateConfig); +}; + +/** + * @param {object} params + * @property {string} [scriptFormat] + * @property {AlterCollectionDto} collection + * @return {AlterScriptDto} + */ +const getUpdatedCommentOnCollectionScriptDto = ({ scriptFormat, collection }) => { + const descriptionInfo = collection?.role.compMod?.description; + if (!descriptionInfo) { + return undefined; + } + + const { old: oldComment, new: newComment } = descriptionInfo; + if (!newComment || newComment === oldComment) { + return undefined; + } + + const collectionSchema = getSchemaOfAlterCollection(collection); + const fullTableName = getFullCollectionName(scriptFormat)(collectionSchema); + const comment = wrapComment(newComment); + const script = updateTableComment(fullTableName, comment); + + return AlterScriptDto.getInstance([script], true, false); +}; + +/** + * @param {object} params + * @property {string} [scriptFormat] + * @property {AlterCollectionDto} collection + * @return {Array} + * */ +const getModifyEntityCommentsScriptDtos = ({ scriptFormat, collection }) => { + const updatedCommentScript = getUpdatedCommentOnCollectionScriptDto({ scriptFormat, collection }); + + return [updatedCommentScript].filter(Boolean); +}; + +module.exports = { + getModifyEntityCommentsScriptDtos, +}; diff --git a/forward_engineering/alterScript/alterScriptHelpers/viewHelpers/commentsHelper.js b/forward_engineering/alterScript/alterScriptHelpers/viewHelpers/commentsHelper.js new file mode 100644 index 0000000..65b00a2 --- /dev/null +++ b/forward_engineering/alterScript/alterScriptHelpers/viewHelpers/commentsHelper.js @@ -0,0 +1,54 @@ +const { AlterScriptDto } = require('../../types/AlterScriptDto'); +const { wrapComment, getNamePrefixedWithSchemaNameForScriptFormat } = require('../../../utils/general'); +const { assignTemplates } = require('../../../utils/assignTemplates'); +const templates = require('../../../ddlProvider/templates'); + +/** + * @param {string} objectName + * @param {string} comment + * @param {boolean} isMaterializedView + * @return {string} + * */ +const updateViewComment = (objectName, comment, isMaterializedView) => { + const object = isMaterializedView ? 'MATERIALIZED VIEW' : 'TABLE'; + const templateConfig = { object, objectName, comment }; + + return assignTemplates(templates.comment, templateConfig); +}; + +/** + * @param {object} params + * @property {string} [scriptFormat] + * @property {AlterCollectionDto} view + * @return {AlterScriptDto | undefined} + * */ +const getUpdatedCommentScriptDto = ({ scriptFormat, view }) => { + const description = view?.role?.compMod?.description || {}; + + if (!description.new || description.new === description.old) { + return; + } + + const schemaName = view.compMod?.keyspaceName; + const fullViewName = getNamePrefixedWithSchemaNameForScriptFormat(scriptFormat)(view.code || view.name, schemaName); + const wrappedComment = wrapComment(description.new); + const script = updateViewComment(fullViewName, wrappedComment, view.materialized); + + return AlterScriptDto.getInstance([script], true, false); +}; + +/** + * @param {object} params + * @property {string} [scriptFormat] + * @property {AlterCollectionDto} view + * @return {AlterScriptDto[]} + * */ +const getModifyViewCommentsScriptDtos = ({ scriptFormat, view }) => { + const updatedCommentScript = getUpdatedCommentScriptDto({ scriptFormat, view }); + + return [updatedCommentScript].filter(Boolean); +}; + +module.exports = { + getModifyViewCommentsScriptDtos, +}; diff --git a/forward_engineering/ddlProvider/ddlHelpers/tableHelper.js b/forward_engineering/ddlProvider/ddlHelpers/tableHelper.js index b9d6be5..6070dc5 100644 --- a/forward_engineering/ddlProvider/ddlHelpers/tableHelper.js +++ b/forward_engineering/ddlProvider/ddlHelpers/tableHelper.js @@ -1,8 +1,6 @@ const _ = require('lodash'); module.exports = ({ getColumnsList, checkAllKeysDeactivated, commentIfDeactivated, prepareName, assignTemplates }) => { - const { getOptionsString } = require('./constraintHelper')({ prepareName }); - const getTableType = ({ duplicated, external,