From 1d8ec8839528e4c6a3c908ead39a9930ad2f831a Mon Sep 17 00:00:00 2001 From: Serhii Filonenko Date: Tue, 3 Feb 2026 19:10:27 +0200 Subject: [PATCH 1/2] HCK-14642: Add expression reversing as keys for the index --- .../ddlProvider/ddlHelpers/indexHelper.js | 1 + .../helpers/postgresHelpers/tableHelper.js | 46 +++++++++++++++++-- 2 files changed, 42 insertions(+), 5 deletions(-) diff --git a/forward_engineering/ddlProvider/ddlHelpers/indexHelper.js b/forward_engineering/ddlProvider/ddlHelpers/indexHelper.js index 05bcd54..b1cbfc1 100644 --- a/forward_engineering/ddlProvider/ddlHelpers/indexHelper.js +++ b/forward_engineering/ddlProvider/ddlHelpers/indexHelper.js @@ -157,4 +157,5 @@ module.exports = { getIndexKeys, getIndexOptions, getWithOptions, + mapIndexKey, }; diff --git a/reverse_engineering/helpers/postgresHelpers/tableHelper.js b/reverse_engineering/helpers/postgresHelpers/tableHelper.js index 41830ab..0e343ce 100644 --- a/reverse_engineering/helpers/postgresHelpers/tableHelper.js +++ b/reverse_engineering/helpers/postgresHelpers/tableHelper.js @@ -1,5 +1,6 @@ const _ = require('lodash'); const { clearEmptyPropertiesInObject, getColumnNameByPosition } = require('./common'); +const { mapIndexKey } = require('../../../forward_engineering/ddlProvider/ddlHelpers/indexHelper'); const prepareStorageParameters = (reloptions, tableToastOptions) => { if (!reloptions && !tableToastOptions) { @@ -208,7 +209,7 @@ const getCheckConstraint = constraint => { const prepareTableIndexes = tableIndexesResult => { return _.map(tableIndexesResult, indexData => { - const allColumns = mapIndexColumns(indexData); + const { columns: allColumns, indxExpression } = getIndexKeys(indexData); const columns = _.slice(allColumns, 0, indexData.number_of_keys); const include = _.chain(allColumns) .slice(indexData.number_of_keys) @@ -225,6 +226,7 @@ const prepareTableIndexes = tableIndexesResult => { index_storage_parameter: getIndexStorageParameters(indexData.storage_parameters), where: indexData.where_expression || '', include, + indxExpression, columns: indexData.index_method === 'btree' ? columns @@ -236,6 +238,29 @@ const prepareTableIndexes = tableIndexesResult => { }); }; +const getIndexKeys = indexData => { + const hasExpressions = _.some( + indexData.columns, + (columnName, columnIndex) => columnName !== indexData.expressions[columnIndex], + ); + + if (hasExpressions) { + return { columns: [], indxExpression: mapIndexExpressions(indexData) }; + } + + return { columns: mapIndexColumns(indexData), indxExpression: [] }; +}; + +const mapIndexExpressions = indexData => { + return _.map(indexData.expressions, (expression, columnIndex) => { + const { sortOrder, nullsOrder, opclass, collation } = getIndexKeyOptions(indexData, columnIndex); + const options = mapIndexKey({ name: '', sortOrder, nullsOrder, collation, opclass }); + const value = expression + options; + + return { value }; + }); +}; + const mapIndexColumns = indexData => { return _.chain(indexData.columns) .map((columnName, itemIndex) => { @@ -243,10 +268,7 @@ const mapIndexColumns = indexData => { return; } - const sortOrder = _.get(indexData, `ascendings.${itemIndex}`, false) ? 'ASC' : 'DESC'; - const nullsOrder = getNullsOrder(_.get(indexData, `nulls_first.${itemIndex}`)); - const opclass = _.get(indexData, `opclasses.${itemIndex}`, ''); - const collation = _.get(indexData, `collations.${itemIndex}`, ''); + const { sortOrder, nullsOrder, opclass, collation } = getIndexKeyOptions(indexData, itemIndex); return { name: columnName, @@ -260,6 +282,20 @@ const mapIndexColumns = indexData => { .value(); }; +const getIndexKeyOptions = (indexData, columnIndex) => { + const sortOrder = _.get(indexData, `ascendings.${columnIndex}`, false) ? 'ASC' : 'DESC'; + const nullsOrder = getNullsOrder(_.get(indexData, `nulls_first.${columnIndex}`)); + const opclass = _.get(indexData, `opclasses.${columnIndex}`, ''); + const collation = _.get(indexData, `collations.${columnIndex}`, ''); + + return { + sortOrder, + nullsOrder, + opclass, + collation, + }; +}; + const getNullsOrder = nulls_first => { if (_.isNil(nulls_first)) { return ''; From 582bc94a0cc6bbd61faab9e66352894b3af182b2 Mon Sep 17 00:00:00 2001 From: Serhii Filonenko Date: Wed, 4 Feb 2026 15:41:46 +0200 Subject: [PATCH 2/2] HCK-14642: remove empty array value from table data --- reverse_engineering/helpers/postgresHelpers/tableHelper.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/reverse_engineering/helpers/postgresHelpers/tableHelper.js b/reverse_engineering/helpers/postgresHelpers/tableHelper.js index 0e343ce..eeecc8e 100644 --- a/reverse_engineering/helpers/postgresHelpers/tableHelper.js +++ b/reverse_engineering/helpers/postgresHelpers/tableHelper.js @@ -248,7 +248,7 @@ const getIndexKeys = indexData => { return { columns: [], indxExpression: mapIndexExpressions(indexData) }; } - return { columns: mapIndexColumns(indexData), indxExpression: [] }; + return { columns: mapIndexColumns(indexData) }; }; const mapIndexExpressions = indexData => {