Skip to content

Commit eb138fb

Browse files
HCK-14860: ALTER script with custom hooks (#192)
1 parent f109d80 commit eb138fb

23 files changed

Lines changed: 393 additions & 305 deletions

forward_engineering/alterScript/alterScriptBuilder.js

Lines changed: 46 additions & 37 deletions
Original file line numberDiff line numberDiff line change
@@ -2,37 +2,50 @@ const { getAlterScriptDtos } = require('./alterScriptFromDeltaHelper');
22
const { AlterScriptDto } = require('./types/AlterScriptDto');
33
const { commentIfDeactivated } = require('../utils/general');
44

5+
/**
6+
* @param {AlterScriptDto} dtos
7+
* @param {boolean} shouldApplyDropStatements
8+
* @return {AlterScriptDto}
9+
* */
10+
const commentDto = (dto, shouldApplyDropStatements) => {
11+
let script = dto.script;
12+
const shouldDeactivate = dto.isActivated === false || (!shouldApplyDropStatements && dto.isDropScript);
13+
if (shouldDeactivate) {
14+
script = commentIfDeactivated(script, {
15+
isActivated: false,
16+
isPartOfLine: false,
17+
});
18+
}
19+
return { ...dto, script };
20+
};
21+
22+
/**
23+
* @param {AlterScriptDto[]} dtos
24+
* @param {boolean} shouldApplyDropStatements
25+
* @return {AlterScriptDto[]}
26+
* */
27+
const commentDtosIfRequired = (dtos, shouldApplyDropStatements) => {
28+
return dtos.reduce((finalDtos, dto) => {
29+
if (!dto) {
30+
return finalDtos;
31+
}
32+
return [...finalDtos, commentDto(dto, shouldApplyDropStatements)];
33+
}, []);
34+
};
35+
536
/**
637
* @param {AlterScriptDto[]} dtos
738
* @param {boolean} shouldApplyDropStatements
839
* @return {string}
940
* */
1041
const joinAlterScriptDtosIntoScript = (dtos, shouldApplyDropStatements) => {
11-
return dtos
12-
.map(dto => {
13-
if (dto.isActivated === false) {
14-
return dto.scripts.map(scriptDto =>
15-
commentIfDeactivated(scriptDto.script, {
16-
isActivated: false,
17-
isPartOfLine: false,
18-
}),
19-
);
20-
}
21-
if (!shouldApplyDropStatements) {
22-
return dto.scripts.map(scriptDto =>
23-
commentIfDeactivated(scriptDto.script, {
24-
isActivated: !scriptDto.isDropScript,
25-
isPartOfLine: false,
26-
}),
27-
);
28-
}
29-
return dto.scripts.map(scriptDto => scriptDto.script);
30-
})
31-
.flat()
32-
.filter(Boolean)
33-
.map(scriptLine => scriptLine.trim())
34-
.filter(Boolean)
35-
.join('\n\n');
42+
return dtos.reduce((finalScript, dto) => {
43+
if (!dto) {
44+
return finalScript;
45+
}
46+
const { script } = commentDto(dto, shouldApplyDropStatements);
47+
return `${finalScript}\n\n${script}`;
48+
}, '');
3649
};
3750

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

49-
return joinAlterScriptDtosIntoScript(alterScriptDtos, shouldApplyDropStatements);
62+
return data.options?.keepDtos
63+
? commentDtosIfRequired(alterScriptDtos, shouldApplyDropStatements)
64+
: joinAlterScriptDtosIntoScript(alterScriptDtos, shouldApplyDropStatements);
5065
};
5166

5267
/**
@@ -56,11 +71,7 @@ const buildEntityLevelAlterScript = (data, app) => {
5671
* */
5772
const doesEntityLevelAlterScriptContainDropStatements = (data, app) => {
5873
const alterScriptDtos = getAlterScriptDtos(data, app);
59-
return alterScriptDtos.some(
60-
alterScriptDto =>
61-
alterScriptDto.isActivated &&
62-
alterScriptDto.scripts.some(scriptModificationDto => scriptModificationDto.isDropScript),
63-
);
74+
return alterScriptDtos.some(alterScriptDto => alterScriptDto?.isActivated && alterScriptDto.isDropScript);
6475
};
6576

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

86-
return joinAlterScriptDtosIntoScript(alterScriptDtos, shouldApplyDropStatements);
97+
return preparedData.options?.keepDtos
98+
? commentDtosIfRequired(alterScriptDtos, shouldApplyDropStatements)
99+
: joinAlterScriptDtosIntoScript(alterScriptDtos, shouldApplyDropStatements);
87100
};
88101

89102
/**
@@ -94,11 +107,7 @@ const buildContainerLevelAlterScript = (data, app) => {
94107
const doesContainerLevelAlterScriptContainDropStatements = (data, app) => {
95108
const preparedData = mapCoreDataForContainerLevelScripts(data);
96109
const alterScriptDtos = getAlterScriptDtos(preparedData, app);
97-
return alterScriptDtos.some(
98-
alterScriptDto =>
99-
alterScriptDto.isActivated &&
100-
alterScriptDto.scripts.some(scriptModificationDto => scriptModificationDto.isDropScript),
101-
);
110+
return alterScriptDtos.some(alterScriptDto => alterScriptDto?.isActivated && alterScriptDto.isDropScript);
102111
};
103112

104113
module.exports = {

forward_engineering/alterScript/alterScriptFromDeltaHelper.js

Lines changed: 6 additions & 38 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@ const {
55
getModifyContainerScriptDtos,
66
} = require('./alterScriptHelpers/alterContainerHelper');
77
const {
8-
getAddCollectionScriptDto,
8+
getAddCollectionScriptDtos,
99
getDeleteCollectionScriptDto,
1010
getAddColumnScriptDtos,
1111
getDeleteColumnScriptDtos,
@@ -38,7 +38,6 @@ const {
3838
getDeleteContainerSequencesScriptDtos,
3939
getAddContainerSequencesScriptDtos,
4040
} = require('./alterScriptHelpers/containerHelpers/sequencesHelper');
41-
const { isObjectInDeltaModelActivated } = require('../utils/general');
4241
const { getModifiedCommentOnColumnScriptDtos } = require('./alterScriptHelpers/columnHelpers/commentsHelper');
4342

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

5958
const addContainersScriptDtos = addedContainers.map(container => {
6059
const [containerName, containerData] = Object.entries(container.properties)[0];
61-
const isActivated = isObjectInDeltaModelActivated(containerData);
62-
return getAddContainerScriptDto(containerName, isActivated);
60+
return getAddContainerScriptDto(containerName, containerData);
6361
});
6462

6563
const deleteContainersScriptDtos = deletedContainers.map(container => {
6664
const [containerName, containerData] = Object.entries(container.properties)[0];
67-
const isActivated = isObjectInDeltaModelActivated(containerData);
68-
return getDeleteContainerScriptDto(containerName, isActivated);
65+
return getDeleteContainerScriptDto(containerName, containerData);
6966
});
7067

7168
const modifyContainersScriptDtos = modifiedContainers
@@ -154,8 +151,8 @@ const getAlterCollectionsScriptDtos = ({
154151
const createCollectionsScriptDtos = sortCollectionsByRelationships(
155152
createScriptsData.filter(collection => collection.compMod?.created),
156153
inlineDeltaRelationships,
157-
).map(
158-
getAddCollectionScriptDto({
154+
).flatMap(
155+
getAddCollectionScriptDtos({
159156
app,
160157
dbVersion,
161158
modelDefinitions,
@@ -321,32 +318,6 @@ const getAlterRelationshipsScriptDtos = ({ collection, app, ignoreRelationshipID
321318
return [...deleteFkScriptDtos, ...addFkScriptDtos, ...modifiedFkScriptDtos].filter(Boolean);
322319
};
323320

324-
/**
325-
* @param dto {AlterScriptDto}
326-
* @return {AlterScriptDto | undefined}
327-
*/
328-
const prettifyAlterScriptDto = dto => {
329-
if (!dto) {
330-
return undefined;
331-
}
332-
/**
333-
* @type {Array<ModificationScript>}
334-
* */
335-
const nonEmptyScriptModificationDtos = dto.scripts
336-
.map(scriptDto => ({
337-
...scriptDto,
338-
script: (scriptDto.script || '').trim(),
339-
}))
340-
.filter(scriptDto => Boolean(scriptDto.script));
341-
if (!nonEmptyScriptModificationDtos.length) {
342-
return undefined;
343-
}
344-
return {
345-
...dto,
346-
scripts: nonEmptyScriptModificationDtos,
347-
};
348-
};
349-
350321
/**
351322
* @param {{
352323
* collection: Object,
@@ -444,10 +415,7 @@ const getAlterScriptDtos = (data, app) => {
444415
...containersSequencesScriptDtos,
445416
...viewScriptDtos,
446417
...relationshipScriptDtos,
447-
]
448-
.filter(Boolean)
449-
.map(dto => prettifyAlterScriptDto(dto))
450-
.filter(Boolean);
418+
].filter(Boolean);
451419
};
452420

453421
module.exports = {

forward_engineering/alterScript/alterScriptHelpers/alterContainerHelper.js

Lines changed: 9 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,10 @@
11
const _ = require('lodash');
22
const { getModifySchemaCommentsScriptDtos } = require('./containerHelpers/commentsHelper');
3-
const { AlterScriptDto } = require('../types/AlterScriptDto');
3+
const { AlterScriptDto, SCRIPT_TYPE } = require('../types/AlterScriptDto');
44
const assignTemplates = require('../../utils/assignTemplates');
55
const templates = require('../../ddlProvider/templates');
6-
const { wrapInQuotes } = require('../../utils/general');
6+
const { wrapInQuotes, getId } = require('../../utils/general');
7+
const { isObjectInDeltaModelActivated } = require('../../utils/general');
78

89
/**
910
* @param {string} schemaName
@@ -32,19 +33,21 @@ const dropSchema = schemaName => {
3233
* @param {boolean} isActivated
3334
* @return {AlterScriptDto | undefined}
3435
* */
35-
const getAddContainerScriptDto = (containerName, isActivated = true) => {
36+
const getAddContainerScriptDto = (containerName, jsonSchema) => {
37+
const isActivated = isObjectInDeltaModelActivated(jsonSchema) ?? true;
3638
const script = createSchemaOnly(wrapInQuotes(containerName));
37-
return AlterScriptDto.getInstance([script], isActivated, false);
39+
return AlterScriptDto.getInstance(script, isActivated, false, SCRIPT_TYPE.createContainer, getId(jsonSchema));
3840
};
3941

4042
/**
4143
* @param {string} containerName
4244
* @param {boolean} isActivated
4345
* @return {AlterScriptDto | undefined}
4446
* */
45-
const getDeleteContainerScriptDto = (containerName, isActivated = true) => {
47+
const getDeleteContainerScriptDto = (containerName, jsonSchema) => {
48+
const isActivated = isObjectInDeltaModelActivated(jsonSchema) ?? true;
4649
const script = dropSchema(wrapInQuotes(containerName));
47-
return AlterScriptDto.getInstance([script], isActivated, true);
50+
return AlterScriptDto.getInstance(script, isActivated, true, SCRIPT_TYPE.dropContainer, getId(jsonSchema));
4851
};
4952

5053
/**

forward_engineering/alterScript/alterScriptHelpers/alterEntityHelper.js

Lines changed: 29 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@ const { getModifyNonNullColumnsScriptDtos } = require('./columnHelpers/nonNullCo
66
const { getModifiedCommentOnColumnScriptDtos } = require('./columnHelpers/commentsHelper');
77
const { getRenameColumnScriptDtos } = require('./columnHelpers/renameColumnHelper');
88
const { getModifyColumnCheckConstraintScriptDtos } = require('./columnHelpers/checkConstraintHelper');
9-
const { AlterScriptDto } = require('../types/AlterScriptDto');
9+
const { AlterScriptDto, SCRIPT_TYPE } = require('../types/AlterScriptDto');
1010
const { AlterCollectionDto } = require('../types/AlterCollectionDto');
1111
const { getModifyPkConstraintsScriptDtos } = require('./entityHelpers/primaryKeyHelper');
1212
const { getModifyUniqueKeyConstraintsScriptDtos } = require('./entityHelpers/uniqueKeyHelper');
@@ -23,13 +23,14 @@ const {
2323
wrapInQuotes,
2424
isParentContainerActivated,
2525
isObjectInDeltaModelActivated,
26+
getId,
2627
} = require('../../utils/general');
2728
const { getRelationshipName } = require('./alterRelationshipsHelper');
2829

2930
/**
3031
* @return {(collection: AlterCollectionDto) => AlterScriptDto | undefined}
3132
* */
32-
const getAddCollectionScriptDto =
33+
const getAddCollectionScriptDtos =
3334
({ app, dbVersion, modelDefinitions, internalDefinitions, externalDefinitions, inlineDeltaRelationships = [] }) =>
3435
collection => {
3536
const ddlProvider = require('../../ddlProvider/ddlProvider')(null, null, app);
@@ -94,9 +95,12 @@ const getAddCollectionScriptDto =
9495
ddlProvider,
9596
collection,
9697
dbVersion,
97-
}).flatMap(({ scripts }) => scripts.map(({ script }) => script));
98+
});
9899
const script = ddlProvider.createTable(hydratedTable, jsonSchema.isActivated);
99-
return AlterScriptDto.getInstance([script, ...indexesOnNewlyCreatedColumnsScripts], true, false);
100+
return [
101+
AlterScriptDto.getInstance(script, true, false, SCRIPT_TYPE.createEntity, getId(jsonSchema)),
102+
...indexesOnNewlyCreatedColumnsScripts,
103+
];
100104
};
101105

102106
/**
@@ -106,7 +110,7 @@ const getDeleteCollectionScriptDto = app => collection => {
106110
const ddlProvider = require('../../ddlProvider/ddlProvider')(null, null, app);
107111
const fullName = getFullTableName(collection);
108112
const script = ddlProvider.dropTable(fullName);
109-
return AlterScriptDto.getInstance([script], true, true);
113+
return AlterScriptDto.getInstance(script, true, true, SCRIPT_TYPE.dropEntity, getId(collection));
110114
};
111115

112116
/**
@@ -175,15 +179,19 @@ const getAddColumnsByConditionScriptDtos =
175179
definitionJsonSchema,
176180
});
177181
const isActivated = isContainerActivated && isCollectionActivated && jsonSchema.isActivated;
178-
return { columnDefinition, isActivated };
182+
183+
const script = ddlProvider.addColumn(fullName, ddlProvider.convertColumnDefinition(columnDefinition));
184+
return AlterScriptDto.getInstance(
185+
script,
186+
isActivated,
187+
false,
188+
SCRIPT_TYPE.alterEntity,
189+
getId(collectionSchema),
190+
);
179191
})
180-
.map(({ columnDefinition, isActivated }) => ({
181-
script: ddlProvider.addColumn(fullName, ddlProvider.convertColumnDefinition(columnDefinition)),
182-
isActivated,
183-
}))
184-
.map(({ script, isActivated }) => AlterScriptDto.getInstance([script], isActivated, false));
192+
.filter(Boolean);
185193

186-
return scripts.filter(Boolean);
194+
return scripts;
187195
};
188196

189197
/**
@@ -248,9 +256,15 @@ const getDeleteColumnsByConditionScriptDtos = app => (collection, predicate) =>
248256
.map(([name, jsonSchema]) => {
249257
const columnNameForDDL = wrapInQuotes(name);
250258
const isActivated = isContainerActivated && isCollectionActivated && jsonSchema.isActivated;
251-
return { script: ddlProvider.dropColumn(fullTableName, columnNameForDDL), isActivated };
259+
const script = ddlProvider.dropColumn(fullTableName, columnNameForDDL);
260+
return AlterScriptDto.getInstance(
261+
script,
262+
isActivated,
263+
true,
264+
SCRIPT_TYPE.alterEntity,
265+
getId(collectionSchema),
266+
);
252267
})
253-
.map(({ script, isActivated }) => AlterScriptDto.getInstance([script], isActivated, true))
254268
.filter(Boolean);
255269
};
256270

@@ -338,7 +352,7 @@ const getModifyColumnScriptDtos =
338352
};
339353

340354
module.exports = {
341-
getAddCollectionScriptDto,
355+
getAddCollectionScriptDtos,
342356
getDeleteCollectionScriptDto,
343357
getModifyCollectionScriptDtos,
344358
getAddColumnScriptDtos,

0 commit comments

Comments
 (0)