Skip to content

Commit 48d1725

Browse files
committed
Forward- and reverse-engineering plugin
1 parent 3a65b43 commit 48d1725

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

46 files changed

+2235
-169
lines changed

.gitignore

+4
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
node_modules
2+
.vscode/
3+
forward_engineering/script.js
4+
forward_engineering/node_modules

adapter/0.1.9.json

+169
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,169 @@
1+
/**
2+
* Copyright © 2016-2018 by IntegrIT S.A. dba Hackolade. All rights reserved.
3+
*
4+
* The copyright to the computer software herein is the property of IntegrIT S.A.
5+
* The software may be used and/or copied only with the written permission of
6+
* IntegrIT S.A. or in accordance with the terms and conditions stipulated in
7+
* the agreement/contract under which the software has been supplied.
8+
*
9+
* {
10+
* "add": {
11+
* "entity": [<names of new property>],
12+
* "container": [<names of new property>],
13+
* "model": [<names of new property>],
14+
* "view": [<names of new property>],
15+
* "field": {
16+
* "<type>": [<names of new property>]
17+
* }
18+
* },
19+
* "remove": {
20+
* "entity": [<names of new property>],
21+
* "container": [<names of new property>],
22+
* "model": [<names of new property>],
23+
* "view": [<names of new property>],
24+
* "field": {
25+
* "<type>": [<names of new property>]
26+
* }
27+
* },
28+
* "modify": {
29+
* "entity": [
30+
* {
31+
* "from": { <properties that identify record> },
32+
* "to": { <properties that need to be changed> }
33+
* }
34+
* ],
35+
* "container": [],
36+
* "model": [],
37+
* "view": [],
38+
* "field": []
39+
* },
40+
* }
41+
*/
42+
{
43+
"add": {
44+
"entity": [
45+
"tableOptions"
46+
],
47+
"field": {
48+
"map": [
49+
"keyType",
50+
"subtype"
51+
],
52+
"set": [
53+
"subtype"
54+
],
55+
"list": [
56+
"subtype"
57+
]
58+
}
59+
},
60+
"delete": {
61+
"entity": [
62+
"simpletextProp",
63+
"textareaProp",
64+
"dropdownProp",
65+
"numericProp",
66+
"checkboxProp",
67+
"grpProp",
68+
"keyList",
69+
"keyListOrder"
70+
]
71+
},
72+
"modify": {
73+
"field": [
74+
{
75+
"from": {
76+
"type": "array"
77+
},
78+
"to": {
79+
"type": "tuple"
80+
}
81+
},
82+
{
83+
"from": {
84+
"type": "object"
85+
},
86+
"to": {
87+
"type": "map",
88+
"subtype": "map<str>",
89+
"keyType": "char"
90+
}
91+
},
92+
{
93+
"from": {
94+
"type": "binary"
95+
},
96+
"to": {
97+
"type": "blob"
98+
}
99+
},
100+
{
101+
"from": {
102+
"type": "binarySet"
103+
},
104+
"to": {
105+
"type": "set",
106+
"subtype": "set<blob>"
107+
}
108+
},
109+
{
110+
"from": {
111+
"type": "numberSet"
112+
},
113+
"to": {
114+
"type": "set",
115+
"subtype": "set<num>"
116+
}
117+
},
118+
{
119+
"from": {
120+
"type": "stringSet"
121+
},
122+
"to": {
123+
"type": "set",
124+
"subtype": "set<str>"
125+
}
126+
},
127+
{
128+
"from": {
129+
"type": "string"
130+
},
131+
"to": {
132+
"type": "char"
133+
}
134+
},
135+
{
136+
"from": {
137+
"type": "number"
138+
},
139+
"to": {
140+
"type": "numeric"
141+
}
142+
},
143+
{
144+
"from": {
145+
"type": "boolean"
146+
},
147+
"to": {
148+
"type": "bool"
149+
}
150+
},
151+
{
152+
"from": {
153+
"keyType": "string"
154+
},
155+
"to": {
156+
"keyType": "char"
157+
}
158+
},
159+
{
160+
"from": {
161+
"keyType": "number"
162+
},
163+
"to": {
164+
"keyType": "numeric"
165+
}
166+
}
167+
]
168+
}
169+
}

forward_engineering/api.js

+135
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,135 @@
1+
'use strict'
2+
3+
const { retrieveContainerName, retrieveEntityName, retrieveUDA, retrieveUDF, retrieveIndexes } = require('./helpers/generalHelper');
4+
const { getTableStatement } = require('./helpers/tableHelper');
5+
const { getUserDefinedTypes, getUdtMap, getUdtScripts } = require('./helpers/udtHelper');
6+
const { getIndexes } = require('./helpers/indexHelper');
7+
const { getKeyspaceStatement } = require('./helpers/keyspaceHelper');
8+
9+
module.exports = {
10+
generateScript(data, logger, callback) {
11+
try {
12+
data.jsonSchema = JSON.parse(data.jsonSchema);
13+
data.modelDefinitions = JSON.parse(data.modelDefinitions);
14+
data.internalDefinitions = JSON.parse(data.internalDefinitions);
15+
data.externalDefinitions = JSON.parse(data.externalDefinitions);
16+
17+
const containerName = retrieveContainerName(data.containerData);
18+
const entityName = retrieveEntityName(data.entityData);
19+
const dataSources = [
20+
data.jsonSchema,
21+
data.modelDefinitions,
22+
data.internalDefinitions,
23+
data.externalDefinitions
24+
];
25+
26+
const keyspace = getKeyspaceStatement(data.containerData);
27+
28+
let udtTypeMap = getUdtMap(dataSources);
29+
30+
let UDT = getUdtScripts(containerName, dataSources, udtTypeMap)
31+
32+
const table = getTableStatement({
33+
tableData: data.jsonSchema,
34+
tableMetaData: data.entityData,
35+
keyspaceMetaData: data.containerData,
36+
dataSources,
37+
udtTypeMap
38+
});
39+
const indexes = getIndexes(retrieveIndexes(data.entityData), dataSources, entityName, containerName);
40+
const UDF = getUserDefinedFunctions(retrieveUDF(data.containerData));
41+
const UDA = getUserDefinedAggregations(retrieveUDA(data.containerData));
42+
43+
const cqlScript = getScript([
44+
keyspace,
45+
UDF,
46+
UDA,
47+
...UDT,
48+
table,
49+
indexes
50+
]);
51+
52+
callback(null, cqlScript);
53+
} catch (e) {
54+
logger.log('error', { message: e.message, stack: e.stack }, 'Cassandra Forward-Engineering Error');
55+
56+
setTimeout(() => {
57+
callback({ message: e.message, stack: e.stack });
58+
}, 150);
59+
}
60+
},
61+
62+
generateContainerScript(data, logger, callback) {
63+
try {
64+
const modelDefinitions = JSON.parse(data.modelDefinitions);
65+
const externalDefinitions = JSON.parse(data.externalDefinitions);
66+
const containerData = data.containerData;
67+
let cqlScriptData = [];
68+
69+
const containerName = retrieveContainerName(containerData);
70+
const keyspace = getKeyspaceStatement(containerData);
71+
72+
const generalUdtTypeMap = getUdtMap([modelDefinitions, externalDefinitions]);
73+
let generalUDT = getUdtScripts(containerName, [
74+
modelDefinitions,
75+
externalDefinitions
76+
], generalUdtTypeMap);
77+
78+
const UDF = getUserDefinedFunctions(retrieveUDF(containerData));
79+
const UDA = getUserDefinedAggregations(retrieveUDA(containerData));
80+
81+
cqlScriptData.push(
82+
keyspace,
83+
...generalUDT
84+
);
85+
86+
data.entities.forEach(entityId => {
87+
const internalDefinitions = JSON.parse(data.internalDefinitions[entityId]);
88+
const jsonSchema = JSON.parse(data.jsonSchema[entityId]);
89+
const entityData = data.entityData[entityId];
90+
const udtTypeMap = Object.assign({}, generalUdtTypeMap, getUdtMap([internalDefinitions, jsonSchema]));
91+
92+
const entityName = retrieveEntityName(entityData);
93+
const dataSources = [
94+
jsonSchema,
95+
modelDefinitions,
96+
internalDefinitions,
97+
externalDefinitions
98+
];
99+
const internalUdt = getUdtScripts(containerName, [ jsonSchema, internalDefinitions ], udtTypeMap);
100+
const table = getTableStatement({
101+
tableData: jsonSchema,
102+
tableMetaData: entityData,
103+
keyspaceMetaData: containerData,
104+
dataSources,
105+
udtTypeMap
106+
});
107+
const indexes = getIndexes(retrieveIndexes(entityData), dataSources, entityName, containerName);
108+
109+
cqlScriptData.push(...internalUdt, table, indexes);
110+
});
111+
112+
cqlScriptData.push(UDF, UDA);
113+
114+
callback(null, getScript(cqlScriptData));
115+
} catch (e) {
116+
logger.log('error', { message: e.message, stack: e.stack }, 'Cassandra Forward-Engineering Error');
117+
118+
setTimeout(() => {
119+
callback({ message: e.message, stack: e.stack });
120+
}, 150);
121+
}
122+
}
123+
};
124+
125+
const getScript = (structure) => {
126+
return structure.filter(item => item).join('\n\n');
127+
};
128+
129+
const getUserDefinedFunctions = (udfItems) => {
130+
return udfItems.map(item => item.storedProcFunction).filter(item => item).join('\n');
131+
};
132+
133+
const getUserDefinedAggregations = (udaItems) => {
134+
return udaItems.map(item => item.storedProcFunction).filter(item => item).join('\n');
135+
};

forward_engineering/config.json

+10
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
{
2+
"extension": "cql",
3+
"filterName": "Cassandra Query Language",
4+
"namePrefix": "Cassandra",
5+
"hasUpdateScript": false,
6+
"level": {
7+
"entity": true,
8+
"container": true
9+
}
10+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
'use strict'
2+
3+
const { getTypeByData } = require('./typeHelper');
4+
5+
module.exports = {
6+
getColumnDefinition(properties, udtTypeMap = {}) {
7+
return Object.keys(properties).map(name => {
8+
const data = properties[name];
9+
const typeDefinition = getTypeDefinition(data, udtTypeMap, name);
10+
11+
if (typeDefinition === undefined) {
12+
return '';
13+
} else {
14+
return getColumn(data.code || name, typeDefinition, isStatic(data));
15+
}
16+
}).filter(column => column).join(',\n');
17+
}
18+
};
19+
20+
const isStatic = (data) => Boolean((data || {}).static);
21+
22+
const getColumn = (name, typeDefinition, isStatic) => {
23+
return `"${name}" ${typeDefinition}${isStatic ? ' STATIC' : ''}`;
24+
};
25+
26+
const getTypeDefinition = (data, udtTypeMap, name) => {
27+
return getTypeByData(data, udtTypeMap, name);
28+
};

0 commit comments

Comments
 (0)