Skip to content

Commit 228cd67

Browse files
committed
FE: added support of create and drop scripts from delta model
1 parent b4c605b commit 228cd67

File tree

11 files changed

+717
-34
lines changed

11 files changed

+717
-34
lines changed

forward_engineering/api.js

Lines changed: 65 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -3,30 +3,69 @@ const { createLogger, getSystemInfo } = require('../reverse_engineering/helpers/
33
const applyToInstanceHelper = require('./applyToInstanceHelper');
44

55
module.exports = {
6-
getDatabases(connectionInfo, logger, callback, app) {
7-
logger.progress({ message: 'Find all databases' });
8-
9-
reApi.getDatabases(connectionInfo, logger, callback, app);
10-
},
11-
applyToInstance(connectionInfo, logger, callback, app) {
12-
logger.clear();
13-
logger.log('info', getSystemInfo(connectionInfo.appVersion), 'Apply to instance');
14-
logger.log(
15-
'info',
16-
app.require('lodash').omit(connectionInfo, 'script', 'containerData'),
17-
'connectionInfo',
18-
connectionInfo.hiddenKeys
19-
);
20-
21-
const postgresLogger = createLogger({
22-
title: 'Apply to instance',
23-
hiddenKeys: connectionInfo.hiddenKeys,
24-
logger,
25-
});
26-
27-
applyToInstanceHelper.applyToInstance(connectionInfo, postgresLogger, app).then(callback, callback);
28-
},
29-
testConnection(connectionInfo, logger, callback, app) {
30-
reApi.testConnection(connectionInfo, logger, callback, app).then(callback, callback);
31-
},
6+
generateScript(data, logger, callback, app) {
7+
callback(new Error('Forward-Engineering of delta model on entity level is not supported'));
8+
},
9+
generateViewScript(data, logger, callback, app) {
10+
callback(new Error('Forward-Engineering of delta model on view level is not supported'));
11+
},
12+
generateContainerScript(data, logger, callback, app) {
13+
try {
14+
const {
15+
getComparisonModelCollection,
16+
getAlterContainersScripts,
17+
getAlterCollectionsScripts,
18+
getAlterViewScripts,
19+
getAlterModelDefinitionsScripts,
20+
} = require('./helpers/alterScriptFromDeltaHelper');
21+
22+
const collection = getComparisonModelCollection(data.collections);
23+
if (!collection) {
24+
throw new Error(
25+
'"comparisonModelCollection" is not found. Alter script can be generated only from Delta model',
26+
);
27+
}
28+
29+
const dbVersion = data.modelData[0]?.dbVersion;
30+
const containersScripts = getAlterContainersScripts(collection);
31+
const collectionsScripts = getAlterCollectionsScripts(collection, app, dbVersion);
32+
const viewScripts = getAlterViewScripts(collection, app);
33+
const modelDefinitionsScripts = getAlterModelDefinitionsScripts(collection, app);
34+
35+
callback(
36+
null,
37+
[...containersScripts, ...collectionsScripts, ...viewScripts, ...modelDefinitionsScripts].join('\n\n'),
38+
);
39+
} catch (e) {
40+
logger.log('error', { message: e.message, stack: e.stack }, 'Cassandra Forward-Engineering Error');
41+
42+
callback({ message: e.message, stack: e.stack });
43+
}
44+
},
45+
getDatabases(connectionInfo, logger, callback, app) {
46+
logger.progress({ message: 'Find all databases' });
47+
48+
reApi.getDatabases(connectionInfo, logger, callback, app);
49+
},
50+
applyToInstance(connectionInfo, logger, callback, app) {
51+
logger.clear();
52+
logger.log('info', getSystemInfo(connectionInfo.appVersion), 'Apply to instance');
53+
logger.log(
54+
'info',
55+
app.require('lodash').omit(connectionInfo, 'script', 'containerData'),
56+
'connectionInfo',
57+
connectionInfo.hiddenKeys,
58+
);
59+
60+
const postgresLogger = createLogger({
61+
title: 'Apply to instance',
62+
hiddenKeys: connectionInfo.hiddenKeys,
63+
logger,
64+
});
65+
66+
applyToInstanceHelper.applyToInstance(connectionInfo, postgresLogger, app).then(callback, callback);
67+
},
68+
testConnection(connectionInfo, logger, callback, app) {
69+
reApi.testConnection(connectionInfo, logger, callback, app).then(callback, callback);
70+
},
3271
};

forward_engineering/config.json

Lines changed: 26 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,31 @@
11
{
2-
"type": "ddl",
3-
"ddlType": "plugin",
2+
"options": [
3+
{
4+
"name": "Create Script",
5+
"keyword": "create",
6+
"type": "ddl",
7+
"ddlType": "plugin",
8+
"mode": "pgsql",
9+
"fileExtensions": [
10+
{
11+
"value": "sql",
12+
"label": "SQL"
13+
}
14+
]
15+
},
16+
{
17+
"name": "Alter Script from Delta model",
18+
"keyword": "alterFromDelta",
19+
"cliOnly": true,
20+
"fileExtensions": [
21+
{
22+
"value": "sql",
23+
"label": "SQL"
24+
}
25+
]
26+
}
27+
],
428
"namePrefix": "PostgreSQL",
5-
"mode": "pgsql",
629
"level": {
730
"container": true,
831
"entity": true,

forward_engineering/ddlProvider.js

Lines changed: 3 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@ const types = require('./configs/types');
33
const templates = require('./configs/templates');
44

55
module.exports = (baseProvider, options, app) => {
6+
const _ = app.require('lodash');
67
const {
78
tab,
89
commentIfDeactivated,
@@ -11,9 +12,8 @@ module.exports = (baseProvider, options, app) => {
1112
hasType,
1213
wrap,
1314
clean,
14-
} = app.utils.general;
15-
const assignTemplates = app.utils.assignTemplates;
16-
const _ = app.require('lodash');
15+
} = require('./utils/general')(_);
16+
const assignTemplates = require('./utils/assignTemplates');
1717
const {
1818
getFunctionArguments,
1919
wrapInQuotes,
@@ -132,10 +132,8 @@ module.exports = (baseProvider, options, app) => {
132132
columns,
133133
checkConstraints,
134134
foreignKeyConstraints,
135-
dbData,
136135
schemaData,
137136
columnDefinitions,
138-
relatedSchemas,
139137
keyConstraints,
140138
inherits,
141139
description,
Lines changed: 132 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,132 @@
1+
const { getAddContainerScript, getDeleteContainerScript } = require('./alterScriptHelpers/alterContainerHelper');
2+
const {
3+
getAddCollectionScript,
4+
getDeleteCollectionScript,
5+
getAddColumnScript,
6+
getDeleteColumnScript,
7+
} = require('./alterScriptHelpers/alterEntityHelper');
8+
const {
9+
getDeleteUdtScript,
10+
getCreateUdtScript,
11+
getAddColumnToTypeScript,
12+
getDeleteColumnFromTypeScript,
13+
} = require('./alterScriptHelpers/alterUdtHelper');
14+
const { getAddViewScript, getDeleteViewScript } = require('./alterScriptHelpers/alterViewHelper');
15+
16+
const getComparisonModelCollection = collections => {
17+
return collections
18+
.map(collection => JSON.parse(collection))
19+
.find(collection => collection.collectionName === 'comparisonModelCollection');
20+
};
21+
22+
const getAlterContainersScripts = collection => {
23+
const addedContainers = collection.properties?.containers?.properties?.added?.items;
24+
const deletedContainers = collection.properties?.containers?.properties?.deleted?.items;
25+
26+
const addContainersScripts = []
27+
.concat(addedContainers)
28+
.filter(Boolean)
29+
.map(container => getAddContainerScript(Object.keys(container.properties)[0]));
30+
const deleteContainersScripts = []
31+
.concat(deletedContainers)
32+
.filter(Boolean)
33+
.map(container => getDeleteContainerScript(Object.keys(container.properties)[0]));
34+
35+
return [].concat(addContainersScripts).concat(deleteContainersScripts);
36+
};
37+
38+
const getAlterCollectionsScripts = (collection, app, dbVersion) => {
39+
const createCollectionsScripts = []
40+
.concat(collection.properties?.entities?.properties?.added?.items)
41+
.filter(Boolean)
42+
.map(item => Object.values(item.properties)[0])
43+
.filter(collection => collection.compMod?.created)
44+
.map(getAddCollectionScript(app, dbVersion));
45+
const deleteCollectionScripts = []
46+
.concat(collection.properties?.entities?.properties?.deleted?.items)
47+
.filter(Boolean)
48+
.map(item => Object.values(item.properties)[0])
49+
.filter(collection => collection.compMod?.deleted)
50+
.map(getDeleteCollectionScript(app));
51+
const addColumnScripts = []
52+
.concat(collection.properties?.entities?.properties?.added?.items)
53+
.filter(Boolean)
54+
.map(item => Object.values(item.properties)[0])
55+
.filter(collection => !collection.compMod)
56+
.flatMap(getAddColumnScript(app));
57+
const deleteColumnScripts = []
58+
.concat(collection.properties?.entities?.properties?.deleted?.items)
59+
.filter(Boolean)
60+
.map(item => Object.values(item.properties)[0])
61+
.filter(collection => !collection.compMod)
62+
.flatMap(getDeleteColumnScript(app));
63+
64+
return [...createCollectionsScripts, ...deleteCollectionScripts, ...addColumnScripts, ...deleteColumnScripts].map(
65+
script => script.trim(),
66+
);
67+
};
68+
69+
const getAlterViewScripts = (collection, app) => {
70+
const createViewsScripts = []
71+
.concat(collection.properties?.views?.properties?.added?.items)
72+
.filter(Boolean)
73+
.map(item => Object.values(item.properties)[0])
74+
.map(view => ({ ...view, ...(view.role || {}) }))
75+
.filter(view => view.compMod?.created && view.selectStatement)
76+
.map(getAddViewScript(app));
77+
78+
const deleteViewsScripts = []
79+
.concat(collection.properties?.views?.properties?.deleted?.items)
80+
.filter(Boolean)
81+
.map(item => Object.values(item.properties)[0])
82+
.map(view => ({ ...view, ...(view.role || {}) }))
83+
.filter(view => view.compMod?.deleted)
84+
.map(getDeleteViewScript(app));
85+
86+
return [...deleteViewsScripts, ...createViewsScripts].map(script => script.trim());
87+
};
88+
89+
const getAlterModelDefinitionsScripts = (collection, app, dbVersion) => {
90+
const createUdtScripts = []
91+
.concat(collection.properties?.modelDefinitions?.properties?.added?.items)
92+
.filter(Boolean)
93+
.map(item => Object.values(item.properties)[0])
94+
.map(item => ({ ...item, ...(app.require('lodash').omit(item.role, 'properties') || {}) }))
95+
.filter(item => item.compMod?.created)
96+
.map(getCreateUdtScript(app, dbVersion));
97+
const deleteUdtScripts = []
98+
.concat(collection.properties?.modelDefinitions?.properties?.deleted?.items)
99+
.filter(Boolean)
100+
.map(item => Object.values(item.properties)[0])
101+
.map(item => ({ ...item, ...(app.require('lodash').omit(item.role, 'properties') || {}) }))
102+
.filter(collection => collection.compMod?.deleted)
103+
.map(getDeleteUdtScript(app));
104+
const addColumnScripts = []
105+
.concat(collection.properties?.modelDefinitions?.properties?.added?.items)
106+
.filter(Boolean)
107+
.map(item => Object.values(item.properties)[0])
108+
.filter(item => !item.compMod)
109+
.map(item => ({ ...item, ...(app.require('lodash').omit(item.role, 'properties') || {}) }))
110+
.filter(item => item.childType === 'composite')
111+
.flatMap(getAddColumnToTypeScript(app));
112+
const deleteColumnScripts = []
113+
.concat(collection.properties?.modelDefinitions?.properties?.deleted?.items)
114+
.filter(Boolean)
115+
.map(item => Object.values(item.properties)[0])
116+
.filter(item => !item.compMod)
117+
.map(item => ({ ...item, ...(app.require('lodash').omit(item.role, 'properties') || {}) }))
118+
.filter(item => item.childType === 'composite')
119+
.flatMap(getDeleteColumnFromTypeScript(app));
120+
121+
return [...deleteUdtScripts, ...createUdtScripts, ...addColumnScripts, ...deleteColumnScripts].map(script =>
122+
script.trim(),
123+
);
124+
};
125+
126+
module.exports = {
127+
getComparisonModelCollection,
128+
getAlterContainersScripts,
129+
getAlterCollectionsScripts,
130+
getAlterViewScripts,
131+
getAlterModelDefinitionsScripts,
132+
};
Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
const getAddContainerScript = containerName => {
2+
return `CREATE SCHEMA IF NOT EXISTS "${containerName}";`;
3+
};
4+
5+
const getDeleteContainerScript = containerName => {
6+
return `DROP SCHEMA IF EXISTS "${containerName}";`;
7+
};
8+
9+
module.exports = {
10+
getAddContainerScript,
11+
getDeleteContainerScript,
12+
};

0 commit comments

Comments
 (0)