Skip to content

Commit cd49fec

Browse files
authored
Hck 2569 hackolade compare and forward processing change of primary key (#95)
* HCK-2569: added check change PK for generate alter script * HCK-2569: fixed variable * HCK-2569: fixed hydrate column * HCK-2569: fixed name variable
1 parent a075f87 commit cd49fec

File tree

2 files changed

+87
-31
lines changed

2 files changed

+87
-31
lines changed

forward_engineering/helpers/updateHelper.js

+22-30
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@ const { mergeArrays, checkIsOldModel, fieldTypeCompatible } = require('./updateH
99
const { getViewScript } = require('./updateHelpers/viewHelper');
1010
const { getIndexTable, getDataColumnIndex } = require('./updateHelpers/indexHelper');
1111
const { getUdtScript, sortAddedUdt } = require('./updateHelpers/udtHelper');
12-
const { alterTablePrefix, getDelete, hydrateColumn } = require('./updateHelpers/tableHelper');
12+
const { alterTablePrefix, getDelete, hydrateColumn, isTableChange, getTableParameter } = require('./updateHelpers/tableHelper');
1313

1414
let _;
1515

@@ -144,12 +144,7 @@ const getIsColumnInIndex = (item, columnName, data) => {
144144
return [...searchIndexes, ...secIndexes].includes(columnName);
145145
};
146146

147-
const getIsChangeTable = compMod => {
148-
const tableProperties = ['name', 'isActivated'];
149-
return tableProperties.some(property => !_.isEqual(compMod[property]?.new, compMod[property]?.old));
150-
}
151-
152-
const getPropertiesForUpdateTable = properties => {
147+
const getPropertiesForUpdateTable = (properties = [])=> {
153148
const newProperties = Object.entries(properties).map(([name, value]) => {
154149
if (!value.compMod) {
155150
return [name, value];
@@ -174,10 +169,17 @@ const getUpdateTable = updateData => {
174169
const { oldName, newName } = getCollectionName(item.role?.compMod);
175170

176171
const indexTableScript = getIndexTable(item, updateData.data);
172+
const compModeWithName = { ...item.role?.compMod || {}, name: { new: newName, old: oldName } }
177173

178-
const isChangeTable = getIsChangeTable({ ...item.role?.compMod, name: { new: newName, old: oldName } } || {});
174+
const tableIsChange = isTableChange({
175+
item: {
176+
...item,
177+
role: { ...item.role, compMod: compModeWithName },
178+
},
179+
data: updateData.data,
180+
});
179181

180-
if (!isChangeTable) {
182+
if (!tableIsChange) {
181183
const tableName = updateData.tableName || oldName || newName;
182184
const optionScript = getOptionsScript(item.role?.compMod || {}, tableName, updateData.isOptionScript);
183185
return [
@@ -203,7 +205,12 @@ const getUpdateTable = updateData => {
203205
item: {
204206
...item,
205207
properties: getPropertiesForUpdateTable(item.role?.properties || item.properties),
208+
role: {
209+
...(item?.role || {}),
210+
tableOptions: getTableParameter(item, 'tableOptions') || {},
211+
}
206212
},
213+
modifiedProperties: item.properties,
207214
isKeyspaceActivated: true,
208215
};
209216
const deleteScript = getDeleteTable({ ...data, tableName: oldName });
@@ -324,29 +331,13 @@ const handleItem = (item, udtMap, generator, data) => {
324331
const getAddTable = (addTableData) => {
325332
const table = addTableData.item;
326333
const data = addTableData.data;
327-
const tableProperties = table.properties || {};
328-
let partitionKeys = [];
329-
let clusteringKeys = [];
330-
if (tableProperties) {
331-
partitionKeys = Object.keys(tableProperties).map(key => {
332-
if (tableProperties[key].compositePartitionKey) {
333-
return { keyId: tableProperties[key].GUID };
334-
}
335-
return;
336-
}).filter(item => item);
337-
338-
clusteringKeys = Object.keys(tableProperties).map(key => {
339-
if (tableProperties[key].compositeClusteringKey) {
340-
return { keyId: tableProperties[key].GUID };
341-
}
342-
return;
343-
}).filter(item => item);
344-
}
334+
const compositePartitionKey = getTableParameter(table, 'compositePartitionKey') || [];
335+
const compositeClusteringKey = getTableParameter(table, 'compositeClusteringKey') || [];
345336

346337
const entityData = [{
338+
compositePartitionKey,
339+
compositeClusteringKey,
347340
collectionName: addTableData.tableName,
348-
compositePartitionKey: [...partitionKeys],
349-
compositeClusteringKey: [...clusteringKeys],
350341
tableOptions: table.role.tableOptions || '',
351342
comments: table.role.comments || '',
352343
isActivated: table.role.isActivated,
@@ -356,7 +347,8 @@ const getAddTable = (addTableData) => {
356347
data.externalDefinitions,
357348
data.modelDefinitions,
358349
data.internalDefinitions,
359-
table
350+
table,
351+
{ properties: addTableData.modifiedProperties || [] }
360352
];
361353

362354
const script = getTableStatement({

forward_engineering/helpers/updateHelpers/tableHelper.js

+65-1
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,10 @@
11
const { getTypeByData } = require("../typeHelper");
2+
const { getNamesByIds } = require("../schemaHelper");
3+
const { dependencies } = require('../appDependencies');
4+
5+
let _;
6+
7+
const setDependencies = ({ lodash }) => _ = lodash;
28

39
const removeColumnStatement = columnName => `DROP "${columnName}";`;
410

@@ -40,8 +46,66 @@ const hydrateColumn = ({ tableName, keyspaceName, isOldModel, property, udtMap }
4046
}
4147
};
4248

49+
const getTableParameter = (item, key) => {
50+
const parameter = item?.role?.compMod?.[key];
51+
52+
return parameter?.new || item?.role?.[key];
53+
};
54+
55+
const addToKeysHashType = (keysHash, keys) => {
56+
return Object.entries(keysHash).reduce((keysHash, [id, key]) => {
57+
const type = (keys.find(key => key.keyId === id) || {}).type;
58+
return {
59+
...keysHash,
60+
[id]: {
61+
...key,
62+
...(type ? { type } : {})
63+
}
64+
};
65+
}, {});
66+
};
67+
68+
const tableKeysIsEqual = ({ newKeys = [], oldKeys =[], dataSources }) => {
69+
const newKeysHash = addToKeysHashType(getNamesByIds(newKeys.map(key => key.keyId), dataSources), newKeys);
70+
const oldKeysHash = addToKeysHashType(getNamesByIds(oldKeys.map(key => key.keyId), dataSources), oldKeys);
71+
const difference = _.differenceWith(_.values(newKeysHash), _.values(oldKeysHash), _.isEqual);
72+
73+
return _.isEmpty(difference);
74+
};
75+
76+
const isTableChange = ({ item, data }) => {
77+
setDependencies(dependencies);
78+
79+
const compMod = item?.role?.compMod || {};
80+
const dataSources = [
81+
item,
82+
{ properties: item.role.properties },
83+
data.externalDefinitions,
84+
data.modelDefinitions,
85+
data.internalDefinitions,
86+
];
87+
const tableProperties = ['name', 'isActivated'];
88+
const { compositeClusteringKey = {}, compositePartitionKey = {} } = compMod || {};
89+
const compositeClusteringKeyIsEqual = tableKeysIsEqual({
90+
newKeys: compositeClusteringKey.new,
91+
oldKeys: compositeClusteringKey.old,
92+
dataSources,
93+
});
94+
95+
const compositePartitionKeyIsEqual = tableKeysIsEqual({
96+
newKeys: compositePartitionKey.new,
97+
oldKeys: compositePartitionKey.old,
98+
dataSources,
99+
});
100+
101+
return !compositeClusteringKeyIsEqual || !compositePartitionKeyIsEqual ||
102+
tableProperties.some(property => !_.isEqual(compMod[property]?.new, compMod[property]?.old));
103+
}
104+
43105
module.exports = {
44106
getDelete,
45107
alterTablePrefix,
46-
hydrateColumn
108+
hydrateColumn,
109+
isTableChange,
110+
getTableParameter,
47111
}

0 commit comments

Comments
 (0)