Skip to content

Commit 7251e67

Browse files
authored
HCK-14286: Implement CREATE/DROP logic for views (#80)
<!--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-14286" title="HCK-14286" target="_blank"><img alt="Sub-task" src="https://hackolade.atlassian.net/rest/api/2/universal_avatar/view/type/issuetype/avatar/10316?size=medium" />HCK-14286</a> [DB2] Implement CREATE/DROP logic for views </td></table> <br /> <!--jira-description-action-hidden-marker-end-->
1 parent c81032a commit 7251e67

File tree

13 files changed

+361
-18
lines changed

13 files changed

+361
-18
lines changed

forward_engineering/alterScript/alterScriptFromDeltaHelper.js

Lines changed: 25 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@ const {
99
getAddForeignKeyScriptDtos,
1010
getModifyForeignKeyScriptDtos,
1111
} = require('./alterScriptHelpers/alterForeignKeyHelper');
12-
const { getModifyViewScriptDtos } = require('./alterScriptHelpers/alterViewHelper');
12+
const { getViewsScripts } = require('./alterScriptHelpers/alterViewHelper');
1313

1414
/**
1515
* @param {T} data
@@ -100,8 +100,8 @@ const getAlterCollectionScriptDtos = ({
100100
return [
101101
...deletedCollectionScriptDtos,
102102
...addedCollectionScriptDtos,
103-
...modifyCollectionScriptDtos,
104103
...deletedColumnScriptDtos,
104+
...modifyCollectionScriptDtos,
105105
...addedColumnScriptDtos,
106106
...modifyColumnScriptDtos,
107107
...modifyCollectionKeysScriptDtos,
@@ -110,15 +110,32 @@ const getAlterCollectionScriptDtos = ({
110110

111111
/**
112112
* @param {Object} collection
113+
* @param {App} app
113114
* @return {Array<AlterScriptDto>}
114115
*/
115-
const getAlterViewScriptDtos = collection => {
116-
const modifyViewScriptDtos = getItems(collection.properties?.views?.properties?.modified)
117-
.map(viewWrapper => Object.values(viewWrapper.properties)[0])
116+
const getAlterViewScriptDtos = (collection, app) => {
117+
const { added, deleted, modified } = collection.properties?.views?.properties || {};
118+
const { getAddViewScriptDto, getDeleteViewScriptDto, getModifyViewScriptDtos } = getViewsScripts(app);
119+
120+
const addedViews = getItems(added)
121+
.map(item => Object.values(item.properties)[0])
118122
.map(view => ({ ...view, ...view.role }))
119-
.flatMap(getModifyViewScriptDtos);
123+
.filter(view => view.compMod?.created);
124+
125+
const deletedViews = getItems(deleted)
126+
.map(item => Object.values(item.properties)[0])
127+
.map(view => ({ ...view, ...view.role }))
128+
.filter(view => view.compMod?.deleted);
129+
130+
const modifiedViews = getItems(modified)
131+
.map(item => Object.values(item.properties)[0])
132+
.map(view => ({ ...view, ...view.role }));
133+
134+
const addedViewScriptDtos = addedViews.map(getAddViewScriptDto);
135+
const deletedViewScriptDtos = deletedViews.map(getDeleteViewScriptDto);
136+
const modifyViewScriptDtos = modifiedViews.flatMap(getModifyViewScriptDtos);
120137

121-
return [...modifyViewScriptDtos].filter(Boolean);
138+
return [...deletedViewScriptDtos, ...addedViewScriptDtos, ...modifyViewScriptDtos].filter(Boolean);
122139
};
123140

124141
/**
@@ -238,7 +255,7 @@ const getAlterScriptDtos = (data, app) => {
238255
inlineDeltaRelationships,
239256
});
240257

241-
const viewScriptDtos = getAlterViewScriptDtos(collection);
258+
const viewScriptDtos = getAlterViewScriptDtos(collection, app);
242259

243260
const relationshipScriptDtos = getAlterRelationshipsScriptDtos({
244261
collection,

forward_engineering/alterScript/alterScriptHelpers/alterEntityHelper.js

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@ const {
2121
} = require('../../utils/general');
2222
const { getRelationshipName } = require('./alterForeignKeyHelper');
2323
const { createColumnDefinitionBySchema } = require('./createColumnDefinition');
24+
const { getRenameTableScriptDtos } = require('./entityHelpers/alterTableNameHelper');
2425

2526
/**
2627
* @param {Object} ddlProvider
@@ -99,9 +100,12 @@ const getDeleteCollectionScriptDto = ddlProvider => collection => {
99100
* @returns {Array<AlterScriptDto>}
100101
*/
101102
const getModifyCollectionScriptDtos = collection => {
103+
const modifyCollectionNameScriptDtos = getRenameTableScriptDtos(collection);
102104
const modifyCheckConstraintScriptDtos = getModifyCheckConstraintScriptDtos(collection);
103105
const modifyCommentScriptDtos = getModifyEntityCommentsScriptDtos(collection);
104-
return [...modifyCheckConstraintScriptDtos, ...modifyCommentScriptDtos].filter(Boolean);
106+
return [...modifyCollectionNameScriptDtos, ...modifyCheckConstraintScriptDtos, ...modifyCommentScriptDtos].filter(
107+
Boolean,
108+
);
105109
};
106110

107111
/**
Lines changed: 56 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,64 @@
1+
/**
2+
* @typedef {import('../../../shared/types').App} App
3+
*/
14
const { getModifyViewCommentsScriptDtos } = require('./viewHelpers/commentsHelper');
5+
const { getRenameViewScriptDtos } = require('./viewHelpers/alterNameHelper');
6+
const { AlterScriptDto } = require('../types/AlterScriptDto');
7+
const { getSchemaOfAlterCollection } = require('../../utils/general');
8+
const { createView, dropView } = require('./viewHelpers/createDropViewHelper');
9+
const { getModifySelectStatementScriptDtos } = require('./viewHelpers/alterViewStatementHelper');
210

3-
const getModifyViewScriptDtos = view => {
11+
/**
12+
* @param {Object} ddlProvider
13+
* @param {Function} mapProperties
14+
* @returns {(view: Object) => AlterScriptDto}
15+
*/
16+
const getAddViewScriptDto = (ddlProvider, mapProperties) => view => {
17+
const script = createView({ ddlProvider, mapProperties, view });
18+
19+
return AlterScriptDto.getInstance([script], true, false);
20+
};
21+
22+
/**
23+
* @param {Object} ddlProvider
24+
* @returns {(view: Object) => AlterScriptDto}
25+
*/
26+
const getDeleteViewScriptDto = ddlProvider => view => {
27+
const viewSchema = getSchemaOfAlterCollection(view);
28+
const script = dropView({ ddlProvider, viewSchema });
29+
30+
return AlterScriptDto.getInstance([script], true, true);
31+
};
32+
33+
/**
34+
* @param {Object} ddlProvider
35+
* @param {Function} mapProperties
36+
* @returns {(view: Object) => Array<AlterScriptDto>}
37+
*/
38+
const getModifyViewScriptDtos = (ddlProvider, mapProperties) => view => {
39+
const renameViewNameScriptDtos = getRenameViewScriptDtos(view, ddlProvider, mapProperties);
40+
const modifySelectStatementScriptDtos = getModifySelectStatementScriptDtos(view, ddlProvider, mapProperties);
441
const modifyCommentsScriptDtos = getModifyViewCommentsScriptDtos(view);
542

6-
return [...modifyCommentsScriptDtos].filter(Boolean);
43+
return [...renameViewNameScriptDtos, ...modifySelectStatementScriptDtos, ...modifyCommentsScriptDtos].filter(
44+
Boolean,
45+
);
46+
};
47+
48+
/**
49+
* @param {App} app
50+
*/
51+
const getViewsScripts = app => {
52+
const ddlProvider = require('../../ddlProvider/ddlProvider')(null, null, app);
53+
const { mapProperties } = app.require('@hackolade/ddl-fe-utils');
54+
55+
return {
56+
getAddViewScriptDto: getAddViewScriptDto(ddlProvider, mapProperties),
57+
getDeleteViewScriptDto: getDeleteViewScriptDto(ddlProvider),
58+
getModifyViewScriptDtos: getModifyViewScriptDtos(ddlProvider, mapProperties),
59+
};
760
};
861

962
module.exports = {
10-
getModifyViewScriptDtos,
63+
getViewsScripts,
1164
};

forward_engineering/alterScript/alterScriptHelpers/columnHelpers/commentsHelper.js

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,10 @@ const {
66
getSchemaOfAlterCollection,
77
getFullCollectionName,
88
} = require('../../../utils/general');
9-
const { getColumnCommentStatement } = require('../../../ddlProvider/ddlHelpers/comment/commentHelper');
9+
const {
10+
getColumnCommentStatement,
11+
dropTableColumnCommentStatement,
12+
} = require('../../../ddlProvider/ddlHelpers/comment/commentHelper');
1013

1114
const getUpdatedCommentOnColumnScriptDtos = collection => {
1215
const isContainerActivated = isParentContainerActivated(collection);
@@ -46,7 +49,7 @@ const getDeletedCommentOnColumnScriptDtos = collection => {
4649
})
4750
.map(([columnName, jsonSchema]) => {
4851
const isActivated = isContainerActivated && isCollectionActivated && jsonSchema.isActivated;
49-
const script = getColumnCommentStatement({ tableName, columnName, description: '' });
52+
const script = dropTableColumnCommentStatement({ tableName, columnName });
5053

5154
return { script, isActivated };
5255
})
Lines changed: 53 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,53 @@
1+
const { AlterScriptDto } = require('../../types/AlterScriptDto');
2+
const {
3+
isParentContainerActivated,
4+
isObjectInDeltaModelActivated,
5+
getSchemaOfAlterCollection,
6+
getSchemaNameFromCollection,
7+
getNamePrefixedWithSchemaName,
8+
} = require('../../../utils/general');
9+
const { assignTemplates } = require('../../../utils/assignTemplates');
10+
const templates = require('../../../ddlProvider/templates');
11+
12+
/**
13+
* @param {string} oldTableName
14+
* @param {string} newTableName
15+
* @return string
16+
*/
17+
const alterTableName = (oldTableName, newTableName) => {
18+
return assignTemplates({ template: templates.renameTable, templateData: { oldTableName, newTableName } });
19+
};
20+
21+
/**
22+
* @param {Object} collection
23+
* @returns {Array<AlterScriptDto>}
24+
*/
25+
const getRenameTableScriptDtos = collection => {
26+
const collectionSchema = getSchemaOfAlterCollection(collection);
27+
const tableName = collectionSchema?.compMod?.collectionName;
28+
29+
if (!tableName) {
30+
return [];
31+
}
32+
33+
const { old: oldName, new: newName } = tableName;
34+
35+
if (!newName || newName === oldName) {
36+
return [];
37+
}
38+
39+
const schemaName = getSchemaNameFromCollection({ collection: collectionSchema });
40+
const isContainerActivated = isParentContainerActivated(collection);
41+
const isCollectionActivated = isContainerActivated && isObjectInDeltaModelActivated(collection);
42+
43+
const script = alterTableName(
44+
getNamePrefixedWithSchemaName({ name: oldName, schemaName }),
45+
getNamePrefixedWithSchemaName({ name: newName, schemaName }),
46+
);
47+
48+
return [AlterScriptDto.getInstance([script], isCollectionActivated, false)];
49+
};
50+
51+
module.exports = {
52+
getRenameTableScriptDtos,
53+
};

forward_engineering/alterScript/alterScriptHelpers/entityHelpers/commentsHelper.js

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,10 @@ const {
66
getSchemaOfAlterCollection,
77
getFullCollectionName,
88
} = require('../../../utils/general');
9-
const { getTableCommentStatement } = require('../../../ddlProvider/ddlHelpers/comment/commentHelper');
9+
const {
10+
getTableCommentStatement,
11+
dropTableCommentStatement,
12+
} = require('../../../ddlProvider/ddlHelpers/comment/commentHelper');
1013

1114
const getUpdatedCommentOnCollectionScriptDto = collection => {
1215
const descriptionInfo = collection?.role.compMod?.description;
@@ -46,7 +49,7 @@ const getDeletedCommentOnCollectionScriptDto = collection => {
4649
const isContainerActivated = isParentContainerActivated(collection);
4750
const isCollectionActivated = isContainerActivated && isObjectInDeltaModelActivated(collection);
4851

49-
const script = getTableCommentStatement({ tableName, description: '' });
52+
const script = dropTableCommentStatement({ tableName });
5053
return AlterScriptDto.getInstance([script], isCollectionActivated, true);
5154
};
5255

Lines changed: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,39 @@
1+
const { AlterScriptDto } = require('../../types/AlterScriptDto');
2+
const { getSchemaOfAlterCollection } = require('../../../utils/general');
3+
const { createView, dropView } = require('./createDropViewHelper');
4+
5+
/**
6+
* @param {Object} view
7+
* @param {Object} ddlProvider
8+
* @param {Function} mapProperties
9+
* @return {AlterScriptDto | undefined}
10+
*/
11+
const getRenameViewScriptDtos = (view, ddlProvider, mapProperties) => {
12+
const viewSchema = getSchemaOfAlterCollection(view);
13+
const viewName = viewSchema?.compMod?.name;
14+
15+
if (!viewName) {
16+
return [undefined];
17+
}
18+
19+
const { old: oldName, new: newName } = viewName;
20+
21+
if (!newName || newName === oldName) {
22+
return [undefined];
23+
}
24+
25+
const dropScript = dropView({
26+
ddlProvider,
27+
viewSchema: { ...viewSchema, code: oldName, name: oldName },
28+
});
29+
const createScript = createView({ ddlProvider, mapProperties, view });
30+
31+
return [
32+
AlterScriptDto.getInstance([dropScript], true, true),
33+
AlterScriptDto.getInstance([createScript], true, false),
34+
];
35+
};
36+
37+
module.exports = {
38+
getRenameViewScriptDtos,
39+
};
Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,30 @@
1+
const { getSchemaOfAlterCollection } = require('../../../utils/general');
2+
const { AlterScriptDto } = require('../../types/AlterScriptDto');
3+
const { createView, dropView } = require('./createDropViewHelper');
4+
5+
/**
6+
* @param {Object} view
7+
* @param {Object} ddlProvider
8+
* @param {Function} mapProperties
9+
* @returns {AlterScriptDto | undefined}
10+
*/
11+
const getModifySelectStatementScriptDtos = (view, ddlProvider, mapProperties) => {
12+
const viewSchema = getSchemaOfAlterCollection(view);
13+
const selectStatement = viewSchema?.compMod?.selectStatement || {};
14+
15+
if ((!selectStatement.new && !selectStatement.old) || selectStatement.new === selectStatement.old) {
16+
return [undefined];
17+
}
18+
19+
const dropScript = dropView({ viewSchema, ddlProvider });
20+
const createScript = createView({ ddlProvider, mapProperties, view });
21+
22+
return [
23+
AlterScriptDto.getInstance([dropScript], true, true),
24+
AlterScriptDto.getInstance([createScript], true, false),
25+
];
26+
};
27+
28+
module.exports = {
29+
getModifySelectStatementScriptDtos,
30+
};

forward_engineering/alterScript/alterScriptHelpers/viewHelpers/commentsHelper.js

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,10 @@ const {
55
getFullCollectionName,
66
getSchemaOfAlterCollection,
77
} = require('../../../utils/general');
8-
const { getTableCommentStatement } = require('../../../ddlProvider/ddlHelpers/comment/commentHelper');
8+
const {
9+
getTableCommentStatement,
10+
dropTableCommentStatement,
11+
} = require('../../../ddlProvider/ddlHelpers/comment/commentHelper');
912

1013
const extractDescription = view => {
1114
return view?.role?.compMod?.description || {};
@@ -39,7 +42,7 @@ const getDropCommentsScriptDto = view => {
3942
const isContainerActivated = isParentContainerActivated(view);
4043
const isViewActivated = isContainerActivated && isObjectInDeltaModelActivated(view);
4144

42-
const script = getTableCommentStatement({ tableName: viewName, description: '' });
45+
const script = dropTableCommentStatement({ tableName: viewName });
4346
return AlterScriptDto.getInstance([script], isViewActivated, true);
4447
}
4548
return undefined;

0 commit comments

Comments
 (0)