Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
23 changes: 21 additions & 2 deletions forward_engineering/alterScript/alterScriptFromDeltaHelper.js
Original file line number Diff line number Diff line change
Expand Up @@ -131,6 +131,7 @@ const sortCollectionsByRelationships = (collections, relationships) => {
* modelDefinitions: ModelDefinitions,
* internalDefinitions: InternalDefinitions,
* externalDefinitions: ExternalDefinitions,
* shouldIgnoreColumnComments?: boolean,
* }}
* @return {AlterScriptDto[]}
* */
Expand All @@ -142,6 +143,7 @@ const getAlterCollectionsScriptDtos = ({
internalDefinitions,
externalDefinitions,
inlineDeltaRelationships,
shouldIgnoreColumnComments = false,
}) => {
const entitiesData = collection.properties?.entities?.properties;
const createScriptsData = getItemProperties(entitiesData?.added);
Expand Down Expand Up @@ -172,15 +174,29 @@ const getAlterCollectionsScriptDtos = ({
const addColumnScriptDtos = createScriptsData
.filter(item => !item?.compMod?.created)
.flatMap(
getAddColumnScriptDtos({ app, dbVersion, modelDefinitions, internalDefinitions, externalDefinitions }),
getAddColumnScriptDtos({
app,
dbVersion,
modelDefinitions,
internalDefinitions,
externalDefinitions,
shouldIgnoreColumnComments,
}),
);

const deleteColumnScriptDtos = deleteScriptsData
.filter(item => !item?.compMod?.deleted)
.flatMap(getDeleteColumnScriptDtos(app));

const modifyColumnScriptDtos = modifyScriptsData.flatMap(
getModifyColumnScriptDtos({ app, dbVersion, modelDefinitions, internalDefinitions, externalDefinitions }),
getModifyColumnScriptDtos({
app,
dbVersion,
modelDefinitions,
internalDefinitions,
externalDefinitions,
shouldIgnoreColumnComments,
}),
);

return [
Expand Down Expand Up @@ -382,6 +398,8 @@ const getAlterScriptDtos = (data, app) => {
const externalDefinitions = JSON.parse(data.externalDefinitions);
const dbVersion = data.modelData[0]?.dbVersion;
const inlineDeltaRelationships = getInlineRelationships({ collection, options: data.options });
const shouldIgnoreColumnComments =
data.options?.scriptGenerationOptions?.feActiveOptions?.columnComments === 'ignore';
const containersScriptDtos = getAlterContainersScriptDtos({ collection });
const collectionsScriptDtos = getAlterCollectionsScriptDtos({
collection,
Expand All @@ -391,6 +409,7 @@ const getAlterScriptDtos = (data, app) => {
internalDefinitions,
externalDefinitions,
inlineDeltaRelationships,
shouldIgnoreColumnComments,
});
const viewScriptDtos = getAlterViewScriptDtos(collection, app);
const modelDefinitionsScriptDtos = getAlterModelDefinitionsScriptDtos({
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,10 @@ const { getModifyCheckConstraintScriptDtos } = require('./entityHelpers/checkCon
const { getModifyEntityCommentsScriptDtos } = require('./entityHelpers/commentsHelper');
const { getUpdateTypesScriptDtos } = require('./columnHelpers/alterTypeHelper');
const { getModifyNonNullColumnsScriptDtos } = require('./columnHelpers/nonNullConstraintHelper');
const { getModifiedCommentOnColumnScriptDtos } = require('./columnHelpers/commentsHelper');
const {
getModifiedCommentOnColumnScriptDtos,
getAddedCommentOnColumnScriptDto,
} = require('./columnHelpers/commentsHelper');
const { getRenameColumnScriptDtos } = require('./columnHelpers/renameColumnHelper');
const { getModifyColumnCheckConstraintScriptDtos } = require('./columnHelpers/checkConstraintHelper');
const { AlterScriptDto, SCRIPT_TYPE } = require('../types/AlterScriptDto');
Expand Down Expand Up @@ -145,7 +148,14 @@ const getModifyCollectionKeysScriptDtos =
* @return {(collection: Object, predicate: ([name: string, jsonSchema: Object]) => boolean) => AlterScriptDto[]}
* */
const getAddColumnsByConditionScriptDtos =
({ app, dbVersion, modelDefinitions, internalDefinitions, externalDefinitions }) =>
({
app,
dbVersion,
modelDefinitions,
internalDefinitions,
externalDefinitions,
shouldIgnoreColumnComments = false,
}) =>
(collection, predicate) => {
const { createColumnDefinitionBySchema } = require('./createColumnDefinition')(app);
const ddlProvider = require('../../ddlProvider/ddlProvider')(null, null, app);
Expand All @@ -162,7 +172,7 @@ const getAddColumnsByConditionScriptDtos =

const scripts = _.toPairs(collection.properties)
.filter(([name, jsonSchema]) => predicate([name, jsonSchema]))
.map(([name, jsonSchema]) => {
.flatMap(([name, jsonSchema]) => {
const definitionJsonSchema = getDefinitionByReference({
propertySchema: jsonSchema,
modelDefinitions,
Expand All @@ -181,13 +191,21 @@ const getAddColumnsByConditionScriptDtos =
const isActivated = isContainerActivated && isCollectionActivated && jsonSchema.isActivated;

const script = ddlProvider.addColumn(fullName, ddlProvider.convertColumnDefinition(columnDefinition));
return AlterScriptDto.getInstance(
const addColumnScriptDto = AlterScriptDto.getInstance(
script,
isActivated,
false,
SCRIPT_TYPE.alterEntity,
getId(collectionSchema),
);
const commentScriptDto = getAddedCommentOnColumnScriptDto({
collection,
name,
jsonSchema,
shouldIgnoreColumnComments,
});

return [addColumnScriptDto, commentScriptDto];
})
.filter(Boolean);

Expand Down Expand Up @@ -227,14 +245,22 @@ const getNewlyCreatedIndexesScripts = ({ dbVersion, collection }) => {
* @return {(collection: Object) => AlterScriptDto[]}
* */
const getAddColumnScriptDtos =
({ app, dbVersion, modelDefinitions, internalDefinitions, externalDefinitions }) =>
({
app,
dbVersion,
modelDefinitions,
internalDefinitions,
externalDefinitions,
shouldIgnoreColumnComments = false,
}) =>
collection => {
return getAddColumnsByConditionScriptDtos({
app,
dbVersion,
modelDefinitions,
internalDefinitions,
externalDefinitions,
shouldIgnoreColumnComments,
})(collection, ([name, jsonSchema]) => !jsonSchema.compMod);
};

Expand Down Expand Up @@ -279,7 +305,14 @@ const getDeleteColumnScriptDtos = app => collection => {
* @return {(collection: Object) => Array<AlterScriptDto>}
* */
const getDropAndRecreateColumnsScriptDtos =
({ app, dbVersion, modelDefinitions, internalDefinitions, externalDefinitions }) =>
({
app,
dbVersion,
modelDefinitions,
internalDefinitions,
externalDefinitions,
shouldIgnoreColumnComments = false,
}) =>
collection => {
return _.toPairs(collection.properties)
.filter(([name, jsonSchema]) => {
Expand Down Expand Up @@ -307,6 +340,7 @@ const getDropAndRecreateColumnsScriptDtos =
modelDefinitions,
internalDefinitions,
externalDefinitions,
shouldIgnoreColumnComments,
})(collectionWithJustThisProperty, () => true);

return [...deleteColumnsScriptDtos, ...addColumnsScriptDtos];
Expand All @@ -318,7 +352,14 @@ const getDropAndRecreateColumnsScriptDtos =
* @return {(collection: Object) => AlterScriptDto[]}
* */
const getModifyColumnScriptDtos =
({ app, dbVersion, modelDefinitions, internalDefinitions, externalDefinitions }) =>
({
app,
dbVersion,
modelDefinitions,
internalDefinitions,
externalDefinitions,
shouldIgnoreColumnComments = false,
}) =>
collection => {
const renameColumnScriptDtos = getRenameColumnScriptDtos(collection);

Expand All @@ -328,6 +369,7 @@ const getModifyColumnScriptDtos =
modelDefinitions,
internalDefinitions,
externalDefinitions,
shouldIgnoreColumnComments,
})(collection);
if (dropAndRecreateScriptDtos.length) {
return [...renameColumnScriptDtos, ...dropAndRecreateScriptDtos].filter(Boolean);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -91,6 +91,53 @@ const getModifiedCommentOnColumnScriptDtos = collection => {
return [...updatedCommentScripts, ...deletedCommentScripts];
};

/**
* 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, shouldIgnoreColumnComments?: boolean }} dto
* @return {AlterScriptDto | undefined}
*/
const getAddedCommentOnColumnScriptDto = ({
collection,
name,
jsonSchema,
shouldIgnoreColumnComments = false,
} = {}) => {
if (shouldIgnoreColumnComments) {
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 = getFullColumnName(collection, name);
const script = updateColumnComment(columnName, wrapComment(comment));
return AlterScriptDto.getInstance(script, isActivated, false, SCRIPT_TYPE.alterEntity, getId(collection));
};

module.exports = {
getModifiedCommentOnColumnScriptDtos,
getAddedCommentOnColumnScriptDto,
};
Loading