Skip to content

Commit 2dcf2d9

Browse files
committed
Add inplace rename for col(index)
We even had a user request once that goes somewhat like 1. there's CSV with columns 2. it would be nice to select columns from df by index and rename them. why not? This continues recent development of String API in compiler plugin
1 parent e93a682 commit 2dcf2d9

File tree

5 files changed

+79
-2
lines changed

5 files changed

+79
-2
lines changed

core/api/core.api

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3900,6 +3900,7 @@ public abstract interface class org/jetbrains/kotlinx/dataframe/api/RenameColumn
39003900
public fun into (Lorg/jetbrains/kotlinx/dataframe/columns/ColumnReference;Ljava/lang/String;)Lorg/jetbrains/kotlinx/dataframe/columns/ColumnReference;
39013901
public fun into (Lorg/jetbrains/kotlinx/dataframe/columns/ColumnReference;Lkotlin/reflect/KProperty;)Lorg/jetbrains/kotlinx/dataframe/columns/ColumnReference;
39023902
public fun into (Lorg/jetbrains/kotlinx/dataframe/columns/ColumnReference;Lorg/jetbrains/kotlinx/dataframe/columns/ColumnReference;)Lorg/jetbrains/kotlinx/dataframe/columns/ColumnReference;
3903+
public fun into (Lorg/jetbrains/kotlinx/dataframe/columns/SingleColumn;Ljava/lang/String;)Lorg/jetbrains/kotlinx/dataframe/columns/SingleColumn;
39033904
public fun named (Ljava/lang/String;Ljava/lang/String;)Lorg/jetbrains/kotlinx/dataframe/columns/ColumnReference;
39043905
public fun named (Ljava/lang/String;Lkotlin/reflect/KProperty;)Lorg/jetbrains/kotlinx/dataframe/columns/ColumnReference;
39053906
public fun named (Ljava/lang/String;Lorg/jetbrains/kotlinx/dataframe/columns/ColumnReference;)Lorg/jetbrains/kotlinx/dataframe/columns/ColumnReference;
@@ -3909,6 +3910,7 @@ public abstract interface class org/jetbrains/kotlinx/dataframe/api/RenameColumn
39093910
public fun named (Lorg/jetbrains/kotlinx/dataframe/columns/ColumnReference;Ljava/lang/String;)Lorg/jetbrains/kotlinx/dataframe/columns/ColumnReference;
39103911
public fun named (Lorg/jetbrains/kotlinx/dataframe/columns/ColumnReference;Lkotlin/reflect/KProperty;)Lorg/jetbrains/kotlinx/dataframe/columns/ColumnReference;
39113912
public fun named (Lorg/jetbrains/kotlinx/dataframe/columns/ColumnReference;Lorg/jetbrains/kotlinx/dataframe/columns/ColumnReference;)Lorg/jetbrains/kotlinx/dataframe/columns/ColumnReference;
3913+
public fun named (Lorg/jetbrains/kotlinx/dataframe/columns/SingleColumn;Ljava/lang/String;)Lorg/jetbrains/kotlinx/dataframe/columns/SingleColumn;
39123914
}
39133915

39143916
public abstract interface class org/jetbrains/kotlinx/dataframe/api/RenameColumnsSelectionDsl$Grammar {

core/src/main/kotlin/org/jetbrains/kotlinx/dataframe/aggregation/ColumnsForAggregateSelectionDsl.kt

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -20,8 +20,8 @@ public interface ColumnsForAggregateSelectionDsl<out T> : ColumnsSelectionDsl<T>
2020
public infix fun <C> ColumnSet<C>.into(name: String): ColumnSet<C> =
2121
ConfiguredAggregateColumn.withPath(this, pathOf(name))
2222

23-
public infix fun <C> SingleColumn<C>.into(name: String): SingleColumn<C> =
24-
ConfiguredAggregateColumn.withPath(this, pathOf(name))
23+
override infix fun <C> SingleColumn<C>.into(newName: String): SingleColumn<C> =
24+
ConfiguredAggregateColumn.withPath(this, pathOf(newName))
2525

2626
public infix fun <C> ColumnSet<C>.into(path: ColumnPath): ColumnSet<C> =
2727
ConfiguredAggregateColumn.withPath(this, path)

core/src/main/kotlin/org/jetbrains/kotlinx/dataframe/api/rename.kt

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@ import org.jetbrains.kotlinx.dataframe.columns.ColumnAccessor
1111
import org.jetbrains.kotlinx.dataframe.columns.ColumnReference
1212
import org.jetbrains.kotlinx.dataframe.columns.ColumnWithPath
1313
import org.jetbrains.kotlinx.dataframe.columns.FrameColumn
14+
import org.jetbrains.kotlinx.dataframe.columns.SingleColumn
1415
import org.jetbrains.kotlinx.dataframe.columns.renamedReference
1516
import org.jetbrains.kotlinx.dataframe.columns.toColumnSet
1617
import org.jetbrains.kotlinx.dataframe.documentation.AccessApiLink
@@ -23,6 +24,7 @@ import org.jetbrains.kotlinx.dataframe.documentation.LineBreak
2324
import org.jetbrains.kotlinx.dataframe.documentation.SelectingColumns
2425
import org.jetbrains.kotlinx.dataframe.impl.api.renameImpl
2526
import org.jetbrains.kotlinx.dataframe.impl.columnName
27+
import org.jetbrains.kotlinx.dataframe.impl.columns.renamedColumn
2628
import org.jetbrains.kotlinx.dataframe.impl.toCamelCaseByDelimiters
2729
import org.jetbrains.kotlinx.dataframe.util.DEPRECATED_ACCESS_API
2830
import kotlin.reflect.KProperty
@@ -498,6 +500,12 @@ public interface RenameColumnsSelectionDsl {
498500
*/
499501
interface KPropertyReceiver
500502

503+
/**
504+
* @set [RECEIVER] col(0)
505+
* @set [RECEIVER_TYPE] SingleColumn
506+
*/
507+
interface SingleColumnReceiver
508+
501509
/**
502510
* @set [PARAM] columnB
503511
* @set [PARAM_NAME] nameOf
@@ -619,6 +627,15 @@ public interface RenameColumnsSelectionDsl {
619627
public infix fun <C> KProperty<C>.named(nameOf: KProperty<*>): ColumnReference<C> =
620628
toColumnAccessor().named(nameOf.columnName)
621629

630+
/**
631+
* @include [CommonRenameDocs]
632+
* @include [CommonRenameDocs.NamedFunctionName]
633+
* @include [CommonRenameDocs.SingleColumnReceiver]
634+
* @include [CommonRenameDocs.StringParam]
635+
*/
636+
@Interpretable("Named1")
637+
public infix fun <C> SingleColumn<C>.named(newName: String): SingleColumn<C> = renamedColumn(newName)
638+
622639
// endregion
623640

624641
// region into
@@ -710,6 +727,15 @@ public interface RenameColumnsSelectionDsl {
710727
@AccessApiOverload
711728
public infix fun <C> KProperty<C>.into(nameOf: KProperty<*>): ColumnReference<C> = named(nameOf)
712729

730+
/**
731+
* @include [CommonRenameDocs]
732+
* @include [CommonRenameDocs.IntoFunctionName]
733+
* @include [CommonRenameDocs.SingleColumnReceiver]
734+
* @include [CommonRenameDocs.StringParam]
735+
*/
736+
@Interpretable("Named1")
737+
public infix fun <C> SingleColumn<C>.into(newName: String): SingleColumn<C> = named(newName)
738+
713739
// endregion
714740
}
715741

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
package org.jetbrains.kotlinx.dataframe.impl.columns
2+
3+
import org.jetbrains.kotlinx.dataframe.columns.ColumnResolutionContext
4+
import org.jetbrains.kotlinx.dataframe.columns.ColumnWithPath
5+
import org.jetbrains.kotlinx.dataframe.columns.SingleColumn
6+
7+
internal class RenamedSingleColumn<C>(val source: SingleColumn<C>, val name: String) : SingleColumn<C> {
8+
9+
override fun resolveSingle(context: ColumnResolutionContext): ColumnWithPath<C>? =
10+
source.resolveSingle(context)?.let {
11+
it.data.rename(name).addPath(it.path)
12+
}
13+
}
14+
15+
internal fun <C> SingleColumn<C>.renamedColumn(newName: String): SingleColumn<C> = RenamedSingleColumn(this, newName)

core/src/test/kotlin/org/jetbrains/kotlinx/dataframe/api/rename.kt

Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -156,6 +156,40 @@ class RenameTests : ColumnsSelectionDslTests() {
156156
df.select { col("age") into col("age2") },
157157
).shouldAllBeEqual()
158158
}
159+
160+
@Test
161+
fun `col by index named`() {
162+
val df = dataFrameOf(
163+
"col0" to columnOf(1, 4),
164+
"col1" to columnOf(2, 5),
165+
"col2" to columnOf(3, 6),
166+
)
167+
168+
listOf(
169+
df.select { col(0) and (col(1) named "renamed") and col(2) },
170+
df.select { col(0) and (col(1) into "renamed") and col(2) },
171+
df.select { col(0) and (col<Int>(1) named "renamed") and col(2) },
172+
df.select { col(0) and (col<Int>(1) into "renamed") and col(2) },
173+
).shouldAllBeEqual()
174+
175+
val result = df.select { col(0) and (col(1) named "renamed") and col(2) }
176+
result.columnNames() shouldBe listOf("col0", "renamed", "col2")
177+
result["renamed"].toList() shouldBe listOf(2, 5)
178+
}
179+
180+
@Test
181+
fun `col by index named with convert`() {
182+
val df = dataFrameOf(
183+
"a" to columnOf(1, 4),
184+
"b" to columnOf(2, 5),
185+
"c" to columnOf(3, 6),
186+
)
187+
188+
val result = df.convert { col<Int>(0) named "newA" }.with { it * 10 }
189+
190+
result.columnNames() shouldBe listOf("newA", "b", "c")
191+
result["newA"].toList() shouldBe listOf(10, 40)
192+
}
159193
}
160194

161195
class RenameToCamelCaseTests {

0 commit comments

Comments
 (0)