@@ -158,27 +158,37 @@ internal fun <T, C> MoveClause<T, C>.moveTo(columnIndex: Int, insideGroup: Boole
158158 }
159159
160160 // two cases : columns are before, or after, the reference
161- val columnsBeforeReference = columnsToMove.subList(0 , columnIndex)
162- if (columnIndex >= referenceAndSiblingsPaths.size){
163- val effectiveColsBeforeRef = columnsBeforeReference.filter { it.path.last() != reference.path.last() }
164- return df.move { effectiveColsBeforeRef.toColumnSet() }.after { reference }
161+ val columnsBeforeReferenceToMove = mutableListOf<ColumnPath >()
162+ val columnsAfterReferenceToMove = mutableListOf<ColumnPath >()
163+ val columnsToMovePath = columnsToMove.map { it.path }
164+ var referenceWasIterated = false
165+ referenceAndSiblingsPaths.forEach {
166+ if (it.path.last() == reference.path.last())
167+ referenceWasIterated = true
168+ else {
169+ if (columnsToMovePath.contains(it)){
170+ if (referenceWasIterated)
171+ columnsAfterReferenceToMove.add(it)
172+ else
173+ columnsBeforeReferenceToMove.add(it)
174+ }
175+ }
165176 }
166- val columnsAfterReference = columnsToMove.subList(columnIndex + 1 , columnsToMove.size)
167177
168178 // don't move reference
169- val effectiveColsBeforeRef = columnsBeforeReference.filter { it.path.last() != reference.path.last() }
170- val effectiveColsAfterRef = columnsAfterReference.filter { it.path.last() != reference.path.last() }
179+ // val effectiveColsBeforeRef = columnsBeforeReference.filter { it.path.last() != reference.path.last() }
180+ // val effectiveColsAfterRef = columnsAfterReference.filter { it.path.last() != reference.path.last() }
171181
172- // move cols before reference after reference ; move cols after reference before reference
173- if (effectiveColsBeforeRef .isNotEmpty() && effectiveColsAfterRef .isNotEmpty()) {
174- val intermediateDf = df.move { effectiveColsBeforeRef .toColumnSet() }.after { reference }
175- val finalDf = intermediateDf.move { effectiveColsAfterRef .toColumnSet() }.before { reference }
182+ // move cols before reference after reference itself ; move cols after reference before reference itself
183+ if (columnsBeforeReferenceToMove .isNotEmpty() && columnsAfterReferenceToMove .isNotEmpty()) {
184+ val intermediateDf = df.move { columnsBeforeReferenceToMove .toColumnSet() }.after { reference }
185+ val finalDf = intermediateDf.move { columnsAfterReferenceToMove .toColumnSet() }.before { reference }
176186 return finalDf
177187 }
178- if (effectiveColsBeforeRef .isNotEmpty())
179- return df.move { effectiveColsBeforeRef .toColumnSet() }.after { reference }
180- if (columnsAfterReference .isNotEmpty())
181- return df.move { effectiveColsAfterRef .toColumnSet() }.before { reference }
188+ if (columnsBeforeReferenceToMove .isNotEmpty())
189+ return df.move { columnsBeforeReferenceToMove .toColumnSet() }.after { reference }
190+ if (columnsAfterReferenceToMove .isNotEmpty())
191+ return df.move { columnsAfterReferenceToMove .toColumnSet() }.before { reference }
182192
183193 // if it is not needed to move any of the nested columns
184194 return df
0 commit comments