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
83 changes: 46 additions & 37 deletions forward_engineering/alterScript/alterScriptBuilder.js
Original file line number Diff line number Diff line change
Expand Up @@ -2,37 +2,50 @@ const { getAlterScriptDtos } = require('./alterScriptFromDeltaHelper');
const { AlterScriptDto } = require('./types/AlterScriptDto');
const { commentIfDeactivated } = require('../utils/general');

/**
* @param {AlterScriptDto} dtos
* @param {boolean} shouldApplyDropStatements
* @return {AlterScriptDto}
* */
const commentDto = (dto, shouldApplyDropStatements) => {
let script = dto.script;
const shouldDeactivate = dto.isActivated === false || (!shouldApplyDropStatements && dto.isDropScript);
if (shouldDeactivate) {
script = commentIfDeactivated(script, {
isActivated: false,
isPartOfLine: false,
});
}
return { ...dto, script };
};

/**
* @param {AlterScriptDto[]} dtos
* @param {boolean} shouldApplyDropStatements
* @return {AlterScriptDto[]}
* */
const commentDtosIfRequired = (dtos, shouldApplyDropStatements) => {
return dtos.reduce((finalDtos, dto) => {
if (!dto) {
return finalDtos;
}
return [...finalDtos, commentDto(dto, shouldApplyDropStatements)];
}, []);
};

/**
* @param {AlterScriptDto[]} dtos
* @param {boolean} shouldApplyDropStatements
* @return {string}
* */
const joinAlterScriptDtosIntoScript = (dtos, shouldApplyDropStatements) => {
return dtos
.map(dto => {
if (dto.isActivated === false) {
return dto.scripts.map(scriptDto =>
commentIfDeactivated(scriptDto.script, {
isActivated: false,
isPartOfLine: false,
}),
);
}
if (!shouldApplyDropStatements) {
return dto.scripts.map(scriptDto =>
commentIfDeactivated(scriptDto.script, {
isActivated: !scriptDto.isDropScript,
isPartOfLine: false,
}),
);
}
return dto.scripts.map(scriptDto => scriptDto.script);
})
.flat()
.filter(Boolean)
.map(scriptLine => scriptLine.trim())
.filter(Boolean)
.join('\n\n');
return dtos.reduce((finalScript, dto) => {
if (!dto) {
return finalScript;
}
const { script } = commentDto(dto, shouldApplyDropStatements);
return `${finalScript}\n\n${script}`;
}, '');
};

/**
Expand All @@ -46,7 +59,9 @@ const buildEntityLevelAlterScript = (data, app) => {
option => option.id === 'applyDropStatements' && option.value,
);

return joinAlterScriptDtosIntoScript(alterScriptDtos, shouldApplyDropStatements);
return data.options?.keepDtos
? commentDtosIfRequired(alterScriptDtos, shouldApplyDropStatements)
: joinAlterScriptDtosIntoScript(alterScriptDtos, shouldApplyDropStatements);
};

/**
Expand All @@ -56,11 +71,7 @@ const buildEntityLevelAlterScript = (data, app) => {
* */
const doesEntityLevelAlterScriptContainDropStatements = (data, app) => {
const alterScriptDtos = getAlterScriptDtos(data, app);
return alterScriptDtos.some(
alterScriptDto =>
alterScriptDto.isActivated &&
alterScriptDto.scripts.some(scriptModificationDto => scriptModificationDto.isDropScript),
);
return alterScriptDtos.some(alterScriptDto => alterScriptDto?.isActivated && alterScriptDto.isDropScript);
};

const mapCoreDataForContainerLevelScripts = data => {
Expand All @@ -83,7 +94,9 @@ const buildContainerLevelAlterScript = (data, app) => {
option => option.id === 'applyDropStatements' && option.value,
);

return joinAlterScriptDtosIntoScript(alterScriptDtos, shouldApplyDropStatements);
return preparedData.options?.keepDtos
? commentDtosIfRequired(alterScriptDtos, shouldApplyDropStatements)
: joinAlterScriptDtosIntoScript(alterScriptDtos, shouldApplyDropStatements);
};

/**
Expand All @@ -94,11 +107,7 @@ const buildContainerLevelAlterScript = (data, app) => {
const doesContainerLevelAlterScriptContainDropStatements = (data, app) => {
const preparedData = mapCoreDataForContainerLevelScripts(data);
const alterScriptDtos = getAlterScriptDtos(preparedData, app);
return alterScriptDtos.some(
alterScriptDto =>
alterScriptDto.isActivated &&
alterScriptDto.scripts.some(scriptModificationDto => scriptModificationDto.isDropScript),
);
return alterScriptDtos.some(alterScriptDto => alterScriptDto?.isActivated && alterScriptDto.isDropScript);
};

module.exports = {
Expand Down
44 changes: 6 additions & 38 deletions forward_engineering/alterScript/alterScriptFromDeltaHelper.js
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@ const {
getModifyContainerScriptDtos,
} = require('./alterScriptHelpers/alterContainerHelper');
const {
getAddCollectionScriptDto,
getAddCollectionScriptDtos,
getDeleteCollectionScriptDto,
getAddColumnScriptDtos,
getDeleteColumnScriptDtos,
Expand Down Expand Up @@ -38,7 +38,6 @@ const {
getDeleteContainerSequencesScriptDtos,
getAddContainerSequencesScriptDtos,
} = require('./alterScriptHelpers/containerHelpers/sequencesHelper');
const { isObjectInDeltaModelActivated } = require('../utils/general');
const { getModifiedCommentOnColumnScriptDtos } = require('./alterScriptHelpers/columnHelpers/commentsHelper');

const getItems = data => [data?.items].flat().filter(Boolean);
Expand All @@ -58,14 +57,12 @@ const getAlterContainersScriptDtos = ({ collection }) => {

const addContainersScriptDtos = addedContainers.map(container => {
const [containerName, containerData] = Object.entries(container.properties)[0];
const isActivated = isObjectInDeltaModelActivated(containerData);
return getAddContainerScriptDto(containerName, isActivated);
return getAddContainerScriptDto(containerName, containerData);
});

const deleteContainersScriptDtos = deletedContainers.map(container => {
const [containerName, containerData] = Object.entries(container.properties)[0];
const isActivated = isObjectInDeltaModelActivated(containerData);
return getDeleteContainerScriptDto(containerName, isActivated);
return getDeleteContainerScriptDto(containerName, containerData);
});

const modifyContainersScriptDtos = modifiedContainers
Expand Down Expand Up @@ -154,8 +151,8 @@ const getAlterCollectionsScriptDtos = ({
const createCollectionsScriptDtos = sortCollectionsByRelationships(
createScriptsData.filter(collection => collection.compMod?.created),
inlineDeltaRelationships,
).map(
getAddCollectionScriptDto({
).flatMap(
getAddCollectionScriptDtos({
app,
dbVersion,
modelDefinitions,
Expand Down Expand Up @@ -321,32 +318,6 @@ const getAlterRelationshipsScriptDtos = ({ collection, app, ignoreRelationshipID
return [...deleteFkScriptDtos, ...addFkScriptDtos, ...modifiedFkScriptDtos].filter(Boolean);
};

/**
* @param dto {AlterScriptDto}
* @return {AlterScriptDto | undefined}
*/
const prettifyAlterScriptDto = dto => {
if (!dto) {
return undefined;
}
/**
* @type {Array<ModificationScript>}
* */
const nonEmptyScriptModificationDtos = dto.scripts
.map(scriptDto => ({
...scriptDto,
script: (scriptDto.script || '').trim(),
}))
.filter(scriptDto => Boolean(scriptDto.script));
if (!nonEmptyScriptModificationDtos.length) {
return undefined;
}
return {
...dto,
scripts: nonEmptyScriptModificationDtos,
};
};

/**
* @param {{
* collection: Object,
Expand Down Expand Up @@ -444,10 +415,7 @@ const getAlterScriptDtos = (data, app) => {
...containersSequencesScriptDtos,
...viewScriptDtos,
...relationshipScriptDtos,
]
.filter(Boolean)
.map(dto => prettifyAlterScriptDto(dto))
.filter(Boolean);
].filter(Boolean);
};

module.exports = {
Expand Down
Original file line number Diff line number Diff line change
@@ -1,9 +1,10 @@
const _ = require('lodash');
const { getModifySchemaCommentsScriptDtos } = require('./containerHelpers/commentsHelper');
const { AlterScriptDto } = require('../types/AlterScriptDto');
const { AlterScriptDto, SCRIPT_TYPE } = require('../types/AlterScriptDto');
const assignTemplates = require('../../utils/assignTemplates');
const templates = require('../../ddlProvider/templates');
const { wrapInQuotes } = require('../../utils/general');
const { wrapInQuotes, getId } = require('../../utils/general');
const { isObjectInDeltaModelActivated } = require('../../utils/general');

/**
* @param {string} schemaName
Expand Down Expand Up @@ -32,19 +33,21 @@ const dropSchema = schemaName => {
* @param {boolean} isActivated
* @return {AlterScriptDto | undefined}
* */
const getAddContainerScriptDto = (containerName, isActivated = true) => {
const getAddContainerScriptDto = (containerName, jsonSchema) => {
const isActivated = isObjectInDeltaModelActivated(jsonSchema) ?? true;
const script = createSchemaOnly(wrapInQuotes(containerName));
return AlterScriptDto.getInstance([script], isActivated, false);
return AlterScriptDto.getInstance(script, isActivated, false, SCRIPT_TYPE.createContainer, getId(jsonSchema));
};

/**
* @param {string} containerName
* @param {boolean} isActivated
* @return {AlterScriptDto | undefined}
* */
const getDeleteContainerScriptDto = (containerName, isActivated = true) => {
const getDeleteContainerScriptDto = (containerName, jsonSchema) => {
const isActivated = isObjectInDeltaModelActivated(jsonSchema) ?? true;
const script = dropSchema(wrapInQuotes(containerName));
return AlterScriptDto.getInstance([script], isActivated, true);
return AlterScriptDto.getInstance(script, isActivated, true, SCRIPT_TYPE.dropContainer, getId(jsonSchema));
};

/**
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@ const { getModifyNonNullColumnsScriptDtos } = require('./columnHelpers/nonNullCo
const { getModifiedCommentOnColumnScriptDtos } = require('./columnHelpers/commentsHelper');
const { getRenameColumnScriptDtos } = require('./columnHelpers/renameColumnHelper');
const { getModifyColumnCheckConstraintScriptDtos } = require('./columnHelpers/checkConstraintHelper');
const { AlterScriptDto } = require('../types/AlterScriptDto');
const { AlterScriptDto, SCRIPT_TYPE } = require('../types/AlterScriptDto');
const { AlterCollectionDto } = require('../types/AlterCollectionDto');
const { getModifyPkConstraintsScriptDtos } = require('./entityHelpers/primaryKeyHelper');
const { getModifyUniqueKeyConstraintsScriptDtos } = require('./entityHelpers/uniqueKeyHelper');
Expand All @@ -23,13 +23,14 @@ const {
wrapInQuotes,
isParentContainerActivated,
isObjectInDeltaModelActivated,
getId,
} = require('../../utils/general');
const { getRelationshipName } = require('./alterRelationshipsHelper');

/**
* @return {(collection: AlterCollectionDto) => AlterScriptDto | undefined}
* */
const getAddCollectionScriptDto =
const getAddCollectionScriptDtos =
({ app, dbVersion, modelDefinitions, internalDefinitions, externalDefinitions, inlineDeltaRelationships = [] }) =>
collection => {
const ddlProvider = require('../../ddlProvider/ddlProvider')(null, null, app);
Expand Down Expand Up @@ -94,9 +95,12 @@ const getAddCollectionScriptDto =
ddlProvider,
collection,
dbVersion,
}).flatMap(({ scripts }) => scripts.map(({ script }) => script));
});
const script = ddlProvider.createTable(hydratedTable, jsonSchema.isActivated);
return AlterScriptDto.getInstance([script, ...indexesOnNewlyCreatedColumnsScripts], true, false);
return [
AlterScriptDto.getInstance(script, true, false, SCRIPT_TYPE.createEntity, getId(jsonSchema)),
...indexesOnNewlyCreatedColumnsScripts,
];
};

/**
Expand All @@ -106,7 +110,7 @@ const getDeleteCollectionScriptDto = app => collection => {
const ddlProvider = require('../../ddlProvider/ddlProvider')(null, null, app);
const fullName = getFullTableName(collection);
const script = ddlProvider.dropTable(fullName);
return AlterScriptDto.getInstance([script], true, true);
return AlterScriptDto.getInstance(script, true, true, SCRIPT_TYPE.dropEntity, getId(collection));
};

/**
Expand Down Expand Up @@ -175,15 +179,19 @@ const getAddColumnsByConditionScriptDtos =
definitionJsonSchema,
});
const isActivated = isContainerActivated && isCollectionActivated && jsonSchema.isActivated;
return { columnDefinition, isActivated };

const script = ddlProvider.addColumn(fullName, ddlProvider.convertColumnDefinition(columnDefinition));
return AlterScriptDto.getInstance(
script,
isActivated,
false,
SCRIPT_TYPE.alterEntity,
getId(collectionSchema),
);
})
.map(({ columnDefinition, isActivated }) => ({
script: ddlProvider.addColumn(fullName, ddlProvider.convertColumnDefinition(columnDefinition)),
isActivated,
}))
.map(({ script, isActivated }) => AlterScriptDto.getInstance([script], isActivated, false));
.filter(Boolean);

return scripts.filter(Boolean);
return scripts;
};

/**
Expand Down Expand Up @@ -248,9 +256,15 @@ const getDeleteColumnsByConditionScriptDtos = app => (collection, predicate) =>
.map(([name, jsonSchema]) => {
const columnNameForDDL = wrapInQuotes(name);
const isActivated = isContainerActivated && isCollectionActivated && jsonSchema.isActivated;
return { script: ddlProvider.dropColumn(fullTableName, columnNameForDDL), isActivated };
const script = ddlProvider.dropColumn(fullTableName, columnNameForDDL);
return AlterScriptDto.getInstance(
script,
isActivated,
true,
SCRIPT_TYPE.alterEntity,
getId(collectionSchema),
);
})
.map(({ script, isActivated }) => AlterScriptDto.getInstance([script], isActivated, true))
.filter(Boolean);
};

Expand Down Expand Up @@ -338,7 +352,7 @@ const getModifyColumnScriptDtos =
};

module.exports = {
getAddCollectionScriptDto,
getAddCollectionScriptDtos,
getDeleteCollectionScriptDto,
getModifyCollectionScriptDtos,
getAddColumnScriptDtos,
Expand Down
Loading