11const _ = require ( 'lodash' ) ;
22const { clearEmptyPropertiesInObject, getColumnNameByPosition } = require ( './common' ) ;
3+ const { mapIndexKey } = require ( '../../../forward_engineering/ddlProvider/ddlHelpers/indexHelper' ) ;
34
45const prepareStorageParameters = ( reloptions , tableToastOptions ) => {
56 if ( ! reloptions && ! tableToastOptions ) {
@@ -208,7 +209,7 @@ const getCheckConstraint = constraint => {
208209
209210const 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+
239264const 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+
263299const getNullsOrder = nulls_first => {
264300 if ( _ . isNil ( nulls_first ) ) {
265301 return '' ;
0 commit comments