@@ -15,9 +15,11 @@ import org.jetbrains.kotlinx.dataframe.api.getColumnGroup
1515import org.jetbrains.kotlinx.dataframe.api.getColumnWithPath
1616import org.jetbrains.kotlinx.dataframe.api.getColumns
1717import org.jetbrains.kotlinx.dataframe.api.move
18+ import org.jetbrains.kotlinx.dataframe.api.replace
1819import org.jetbrains.kotlinx.dataframe.api.to
1920import org.jetbrains.kotlinx.dataframe.api.toDataFrame
2021import org.jetbrains.kotlinx.dataframe.api.toPath
22+ import org.jetbrains.kotlinx.dataframe.api.with
2123import org.jetbrains.kotlinx.dataframe.columns.ColumnPath
2224import org.jetbrains.kotlinx.dataframe.columns.ColumnWithPath
2325import org.jetbrains.kotlinx.dataframe.columns.UnresolvedColumnsPolicy
@@ -143,7 +145,7 @@ internal fun <T, C> MoveClause<T, C>.moveToImpl(columnIndex: Int, insideGroup: B
143145 val parentOfFirst = columnsToMoveParents.first()
144146 if (columnsToMoveParents.any { it != parentOfFirst }) {
145147 throw IllegalArgumentException (
146- " Cannot move columns with different parent to an index" ,
148+ " Cannot move columns to an index remaining inside group if they have different parent " ,
147149 )
148150 }
149151
@@ -152,22 +154,11 @@ internal fun <T, C> MoveClause<T, C>.moveToImpl(columnIndex: Int, insideGroup: B
152154 return moveTo(columnIndex)
153155 }
154156
155- // logic: remove columns to move and their siblings (from this point, sons), apply them moveTo, reinsert them
156- val parentPath = df[parentOfFirst].path
157- val sons = df[parentOfFirst].asColumnGroup()
158- // remove sons
159- val sonsWithFullPaths = sons.columns().map { parentPath + it.path }
160- val intermediateDf = df.removeImpl { sonsWithFullPaths.toColumnSet() }
161- // move sons and reinsert them
162- val columnsToMoveWithReducedPath = columnsToMove.map { it.path.last(it.path.size - parentPath.size).toPath() }
163- val sonsHaveBeenMoved = sons.asDataFrame().move {
164- columnsToMoveWithReducedPath.toColumnSet()
165- }.to(columnIndex).columns()
166- val sonsToInsert = sonsHaveBeenMoved.map { ColumnToInsert (parentPath + it.path, it) }
167- val secondIntermediateDf = intermediateDf.df.insertImpl(sonsToInsert)
168- // nested level is good but order of top level is changed -> need to fix it
169- val rootOfColumnsToMove = df[listOf (parentPath.first()).toPath()]
170- val indexOfRootOfColumnsToMove = df.columns().indexOf(rootOfColumnsToMove)
171- val finalDf = secondIntermediateDf.move { listOf (parentPath.first()).toPath() }.to(indexOfRootOfColumnsToMove)
172- return finalDf
157+ // replace the level where columns to move are with a new one where columns are moved
158+ val columnsToMoveNames = columnsToMove.map { it.name() }
159+ return df.replace { parentOfFirst.asColumnGroup() }.with {
160+ it.asDataFrame()
161+ .move { columnsToMoveNames.toColumnSet() }.to(columnIndex)
162+ .asColumnGroup(it.name())
163+ }
173164}
0 commit comments