Skip to content

Commit 1ee9b26

Browse files
authored
HCK-14285: Implement CREATE/DROP logic for tables and table columns (#79)
<!--do not remove this marker, its needed to replace info when ticket title is updated --> <!--jira-description-action-hidden-marker-start--> <table> <td> <a href="https://hackolade.atlassian.net/browse/HCK-14285" title="HCK-14285" target="_blank"><img alt="Sub-task" src="https://hackolade.atlassian.net/rest/api/2/universal_avatar/view/type/issuetype/avatar/10316?size=medium" />HCK-14285</a> [DB2] Implement CREATE/DROP logic for tables and table columns </td></table> <br /> <!--jira-description-action-hidden-marker-end--> ## Content Added logic to generate scripts for - CREATE/DROP table, - CREATE/DROP/RENAME/CHANGE TYPE table column - Fix deletion of FK
1 parent 38e4b71 commit 1ee9b26

16 files changed

Lines changed: 615 additions & 74 deletions

forward_engineering/alterScript/alterScriptFromDeltaHelper.js

Lines changed: 97 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -1,25 +1,28 @@
1+
/**
2+
* @typedef {import('../../shared/types').App} App
3+
* @typedef {import('./types/AlterScriptDto').AlterScriptDto} AlterScriptDto
4+
*/
15
const { getContainersScripts } = require('./alterScriptHelpers/alterContainerHelper');
2-
const {
3-
getModifyCollectionScriptDtos,
4-
getModifyCollectionKeysScriptDtos,
5-
getModifyColumnScriptDtos,
6-
} = require('./alterScriptHelpers/alterEntityHelper');
6+
const { getEntitiesScripts } = require('./alterScriptHelpers/alterEntityHelper');
77
const {
88
getDeleteForeignKeyScriptDtos,
99
getAddForeignKeyScriptDtos,
1010
getModifyForeignKeyScriptDtos,
1111
} = require('./alterScriptHelpers/alterForeignKeyHelper');
1212
const { getModifyViewScriptDtos } = require('./alterScriptHelpers/alterViewHelper');
1313

14+
/**
15+
* @param {T} data
16+
* @return {Array<T>}
17+
*/
1418
const getItems = data => [data?.items].flat().filter(Boolean);
1519

1620
/**
17-
* @param dto {{
21+
* @param {{
1822
* collection: Object,
1923
* app: App
20-
* }}
21-
* @return {AlterScriptDto[]}
22-
* */
24+
* }} param
25+
*/
2326
const getAlterContainersScriptDtos = ({ collection, app }) => {
2427
const { added, deleted, modified } = collection.properties?.containers?.properties || {};
2528
const addedContainers = getItems(added);
@@ -29,41 +32,86 @@ const getAlterContainersScriptDtos = ({ collection, app }) => {
2932
const { getAddContainerScriptDto, getDeleteContainerScriptDto, getModifyContainerScriptDto } =
3033
getContainersScripts(app);
3134

32-
const addContainersScriptDtos = addedContainers
35+
const addedContainersScriptDtos = addedContainers
3336
.map(container => Object.values(container.properties)[0])
3437
.flatMap(getAddContainerScriptDto);
3538

36-
const deleteContainersScriptDtos = deletedContainers
39+
const deletedContainersScriptDtos = deletedContainers
3740
.map(container => Object.values(container.properties)[0])
3841
.flatMap(getDeleteContainerScriptDto);
3942

40-
const modifyContainersScriptDtos = modifiedContainers
43+
const modifiedContainersScriptDtos = modifiedContainers
4144
.map(containerWrapper => Object.values(containerWrapper.properties)[0])
4245
.flatMap(getModifyContainerScriptDto);
4346

44-
return [...addContainersScriptDtos, ...deleteContainersScriptDtos, ...modifyContainersScriptDtos].filter(Boolean);
47+
// Schemas can only be dropped after all contained tables are removed,
48+
// so container cleanup must happen last.
49+
return {
50+
deletedContainersScriptDtos,
51+
upsertedContainersScriptDtos: [...addedContainersScriptDtos, ...modifiedContainersScriptDtos],
52+
};
4553
};
4654

55+
/**
56+
* @param {{collection: Object, app: App, modelDefinitions: Object, internalDefinitions: Object, externalDefinitions: Object, inlineDeltaRelationships?: any[]}} param
57+
* @return {Array<AlterScriptDto>}
58+
*/
4759
const getAlterCollectionScriptDtos = ({
4860
collection,
4961
app,
5062
modelDefinitions,
5163
internalDefinitions,
5264
externalDefinitions,
65+
inlineDeltaRelationships = [],
5366
}) => {
54-
const modifyScriptsData = getItems(collection.properties?.entities?.properties?.modified).map(
55-
item => Object.values(item.properties)[0],
56-
);
67+
const { added, deleted, modified } = collection.properties?.entities?.properties || {};
68+
const addedCollections = getItems(added).map(item => Object.values(item.properties)[0]);
69+
const deletedCollections = getItems(deleted).map(item => Object.values(item.properties)[0]);
70+
const modifyScriptsData = getItems(modified).map(item => Object.values(item.properties)[0]);
71+
72+
const {
73+
getAddCollectionScriptDto,
74+
getDeleteCollectionScriptDto,
75+
getModifyCollectionScriptDtos,
76+
getModifyCollectionKeysScriptDtos,
77+
getModifyColumnScriptDtos,
78+
getAddColumnScriptDtos,
79+
getDeleteColumnScriptDtos,
80+
} = getEntitiesScripts(app, inlineDeltaRelationships);
81+
82+
const addedCollectionScriptDtos = addedCollections
83+
.filter(collection => collection.role.compMod.created)
84+
.map(getAddCollectionScriptDto);
85+
86+
const addedColumnScriptDtos = addedCollections.flatMap(getAddColumnScriptDtos);
87+
88+
const deletedCollectionScriptDtos = deletedCollections
89+
.filter(collection => collection.role.compMod.deleted)
90+
.map(getDeleteCollectionScriptDto);
91+
92+
const deletedColumnScriptDtos = deletedCollections
93+
.filter(collection => !collection.role.compMod.deleted)
94+
.flatMap(getDeleteColumnScriptDtos);
5795

5896
const modifyCollectionScriptDtos = modifyScriptsData.flatMap(getModifyCollectionScriptDtos);
5997
const modifyCollectionKeysScriptDtos = modifyScriptsData.flatMap(getModifyCollectionKeysScriptDtos);
6098
const modifyColumnScriptDtos = modifyScriptsData.flatMap(getModifyColumnScriptDtos);
6199

62-
return [...modifyCollectionScriptDtos, ...modifyColumnScriptDtos, ...modifyCollectionKeysScriptDtos].filter(
63-
Boolean,
64-
);
100+
return [
101+
...deletedCollectionScriptDtos,
102+
...addedCollectionScriptDtos,
103+
...modifyCollectionScriptDtos,
104+
...deletedColumnScriptDtos,
105+
...addedColumnScriptDtos,
106+
...modifyColumnScriptDtos,
107+
...modifyCollectionKeysScriptDtos,
108+
].filter(Boolean);
65109
};
66110

111+
/**
112+
* @param {Object} collection
113+
* @return {Array<AlterScriptDto>}
114+
*/
67115
const getAlterViewScriptDtos = collection => {
68116
const modifyViewScriptDtos = getItems(collection.properties?.views?.properties?.modified)
69117
.map(viewWrapper => Object.values(viewWrapper.properties)[0])
@@ -73,6 +121,10 @@ const getAlterViewScriptDtos = collection => {
73121
return [...modifyViewScriptDtos].filter(Boolean);
74122
};
75123

124+
/**
125+
* @param {{collection: Object, app: App, ignoreRelationshipIDs?: string[]}} param
126+
* @return {Array<AlterScriptDto>}
127+
*/
76128
const getAlterRelationshipsScriptDtos = ({ collection, app, ignoreRelationshipIDs = [] }) => {
77129
const addedRelationships = getItems(collection.properties?.relationships?.properties?.added)
78130
.filter(Boolean)
@@ -105,6 +157,10 @@ const getAlterRelationshipsScriptDtos = ({ collection, app, ignoreRelationshipID
105157
return [...deleteFkScriptDtos, ...addFkScriptDtos, ...modifiedFkScriptDtos].filter(Boolean);
106158
};
107159

160+
/**
161+
* @param {{collection: Object, options: Object}} param
162+
* @return {Array<Object>}
163+
*/
108164
const getInlineRelationships = ({ collection, options }) => {
109165
if (options?.scriptGenerationOptions?.feActiveOptions?.foreignKeys !== 'inline') {
110166
return [];
@@ -121,13 +177,17 @@ const getInlineRelationships = ({ collection, options }) => {
121177
return addedRelationships;
122178
};
123179

180+
/**
181+
* @param {AlterScriptDto} dto
182+
* @return {AlterScriptDto | undefined}
183+
*/
124184
const prettifyAlterScriptDto = dto => {
125185
if (!dto) {
126186
return undefined;
127187
}
128188
/**
129189
* @type {Array<ModificationScript>}
130-
* */
190+
*/
131191
const nonEmptyScriptModificationDtos = dto.scripts
132192
.map(scriptDto => ({
133193
...scriptDto,
@@ -143,6 +203,11 @@ const prettifyAlterScriptDto = dto => {
143203
};
144204
};
145205

206+
/**
207+
* @param {Object} data
208+
* @param {App} app
209+
* @return {Array<AlterScriptDto>}
210+
*/
146211
const getAlterScriptDtos = (data, app) => {
147212
const collection = JSON.parse(data.jsonSchema);
148213

@@ -159,14 +224,18 @@ const getAlterScriptDtos = (data, app) => {
159224
const inlineDeltaRelationships = getInlineRelationships({ collection, options: data.options });
160225
const ignoreRelationshipIDs = inlineDeltaRelationships.map(relationship => relationship.role.id);
161226

162-
const containersScriptDtos = getAlterContainersScriptDtos({ collection, app });
227+
const { deletedContainersScriptDtos, upsertedContainersScriptDtos } = getAlterContainersScriptDtos({
228+
collection,
229+
app,
230+
});
163231

164232
const collectionsScriptDtos = getAlterCollectionScriptDtos({
165233
collection,
166234
app,
167235
modelDefinitions,
168236
internalDefinitions,
169237
externalDefinitions,
238+
inlineDeltaRelationships,
170239
});
171240

172241
const viewScriptDtos = getAlterViewScriptDtos(collection);
@@ -177,7 +246,13 @@ const getAlterScriptDtos = (data, app) => {
177246
ignoreRelationshipIDs,
178247
});
179248

180-
return [...containersScriptDtos, ...collectionsScriptDtos, ...viewScriptDtos, ...relationshipScriptDtos]
249+
return [
250+
...upsertedContainersScriptDtos,
251+
...collectionsScriptDtos,
252+
...viewScriptDtos,
253+
...relationshipScriptDtos,
254+
...deletedContainersScriptDtos,
255+
]
181256
.filter(Boolean)
182257
.map(dto => dto && prettifyAlterScriptDto(dto))
183258
.filter(Boolean);

0 commit comments

Comments
 (0)