Skip to content

Commit 5ea4845

Browse files
HCK-14642: Add expression reversing as keys for the index (#185)
* HCK-14642: Add expression reversing as keys for the index * HCK-14642: remove empty array value from table data
1 parent 9605a68 commit 5ea4845

File tree

2 files changed

+42
-5
lines changed

2 files changed

+42
-5
lines changed

forward_engineering/ddlProvider/ddlHelpers/indexHelper.js

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -171,4 +171,5 @@ module.exports = {
171171
getIndexKeys,
172172
getIndexOptions,
173173
getWithOptions,
174+
mapIndexKey,
174175
};

reverse_engineering/helpers/postgresHelpers/tableHelper.js

Lines changed: 41 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
const _ = require('lodash');
22
const { clearEmptyPropertiesInObject, getColumnNameByPosition } = require('./common');
3+
const { mapIndexKey } = require('../../../forward_engineering/ddlProvider/ddlHelpers/indexHelper');
34

45
const prepareStorageParameters = (reloptions, tableToastOptions) => {
56
if (!reloptions && !tableToastOptions) {
@@ -208,7 +209,7 @@ const getCheckConstraint = constraint => {
208209

209210
const prepareTableIndexes = tableIndexesResult => {
210211
return _.map(tableIndexesResult, indexData => {
211-
const allColumns = mapIndexColumns(indexData);
212+
const { columns: allColumns, indxExpression } = getIndexKeys(indexData);
212213
const columns = _.slice(allColumns, 0, indexData.number_of_keys);
213214
const include = _.chain(allColumns)
214215
.slice(indexData.number_of_keys)
@@ -225,6 +226,7 @@ const prepareTableIndexes = tableIndexesResult => {
225226
index_storage_parameter: getIndexStorageParameters(indexData.storage_parameters),
226227
where: indexData.where_expression || '',
227228
include,
229+
indxExpression,
228230
columns:
229231
indexData.index_method === 'btree'
230232
? columns
@@ -236,17 +238,37 @@ const prepareTableIndexes = tableIndexesResult => {
236238
});
237239
};
238240

241+
const getIndexKeys = indexData => {
242+
const hasExpressions = _.some(
243+
indexData.columns,
244+
(columnName, columnIndex) => columnName !== indexData.expressions[columnIndex],
245+
);
246+
247+
if (hasExpressions) {
248+
return { columns: [], indxExpression: mapIndexExpressions(indexData) };
249+
}
250+
251+
return { columns: mapIndexColumns(indexData) };
252+
};
253+
254+
const mapIndexExpressions = indexData => {
255+
return _.map(indexData.expressions, (expression, columnIndex) => {
256+
const { sortOrder, nullsOrder, opclass, collation } = getIndexKeyOptions(indexData, columnIndex);
257+
const options = mapIndexKey({ name: '', sortOrder, nullsOrder, collation, opclass });
258+
const value = expression + options;
259+
260+
return { value };
261+
});
262+
};
263+
239264
const mapIndexColumns = indexData => {
240265
return _.chain(indexData.columns)
241266
.map((columnName, itemIndex) => {
242267
if (!columnName) {
243268
return;
244269
}
245270

246-
const sortOrder = _.get(indexData, `ascendings.${itemIndex}`, false) ? 'ASC' : 'DESC';
247-
const nullsOrder = getNullsOrder(_.get(indexData, `nulls_first.${itemIndex}`));
248-
const opclass = _.get(indexData, `opclasses.${itemIndex}`, '');
249-
const collation = _.get(indexData, `collations.${itemIndex}`, '');
271+
const { sortOrder, nullsOrder, opclass, collation } = getIndexKeyOptions(indexData, itemIndex);
250272

251273
return {
252274
name: columnName,
@@ -260,6 +282,20 @@ const mapIndexColumns = indexData => {
260282
.value();
261283
};
262284

285+
const getIndexKeyOptions = (indexData, columnIndex) => {
286+
const sortOrder = _.get(indexData, `ascendings.${columnIndex}`, false) ? 'ASC' : 'DESC';
287+
const nullsOrder = getNullsOrder(_.get(indexData, `nulls_first.${columnIndex}`));
288+
const opclass = _.get(indexData, `opclasses.${columnIndex}`, '');
289+
const collation = _.get(indexData, `collations.${columnIndex}`, '');
290+
291+
return {
292+
sortOrder,
293+
nullsOrder,
294+
opclass,
295+
collation,
296+
};
297+
};
298+
263299
const getNullsOrder = nulls_first => {
264300
if (_.isNil(nulls_first)) {
265301
return '';

0 commit comments

Comments
 (0)