Skip to content

Commit 556865e

Browse files
committed
[Compiler plugin] Support "df.rename(Pair<String, String>)" operation
1 parent ff8b452 commit 556865e

File tree

5 files changed

+38
-0
lines changed

5 files changed

+38
-0
lines changed

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

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,8 @@ import kotlin.reflect.KProperty
2424

2525
// region DataFrame
2626

27+
@Refine
28+
@Interpretable("RenameMapping")
2729
public fun <T> DataFrame<T>.rename(vararg mappings: Pair<String, String>): DataFrame<T> =
2830
rename { mappings.map { it.first.toColumnAccessor() }.toColumnSet() }
2931
.into(*mappings.map { it.second }.toTypedArray())

plugins/kotlin-dataframe/src/org/jetbrains/kotlinx/dataframe/plugin/impl/api/rename.kt

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,14 @@
11
package org.jetbrains.kotlinx.dataframe.plugin.impl.api
22

3+
import org.jetbrains.kotlin.fir.expressions.FirLiteralExpression
34
import org.jetbrains.kotlinx.dataframe.api.rename
45
import org.jetbrains.kotlinx.dataframe.api.renameToCamelCase
56
import org.jetbrains.kotlinx.dataframe.api.toCamelCase
67
import org.jetbrains.kotlinx.dataframe.columns.toColumnSet
78
import org.jetbrains.kotlinx.dataframe.plugin.impl.AbstractInterpreter
89
import org.jetbrains.kotlinx.dataframe.plugin.impl.AbstractSchemaModificationInterpreter
910
import org.jetbrains.kotlinx.dataframe.plugin.impl.Arguments
11+
import org.jetbrains.kotlinx.dataframe.plugin.impl.Interpreter
1012
import org.jetbrains.kotlinx.dataframe.plugin.impl.PluginDataFrameSchema
1113
import org.jetbrains.kotlinx.dataframe.plugin.impl.SimpleCol
1214
import org.jetbrains.kotlinx.dataframe.plugin.impl.SimpleColumnGroup
@@ -40,6 +42,22 @@ class RenameInto : AbstractSchemaModificationInterpreter() {
4042
}
4143
}
4244

45+
class RenameMapping : AbstractSchemaModificationInterpreter() {
46+
val Arguments.receiver by dataFrame()
47+
val Arguments.mappings: List<Interpreter.Success<Pair<*, *>>> by arg()
48+
override fun Arguments.interpret(): PluginDataFrameSchema {
49+
val mappings = mappings.map {
50+
val it = it.value
51+
val name = (it.first as? FirLiteralExpression)?.value as? String
52+
val newName = (it.second as? FirLiteralExpression)?.value as? String
53+
if (name == null || newName == null) return PluginDataFrameSchema(emptyList())
54+
name to newName
55+
}
56+
57+
return receiver.asDataFrame().rename(*mappings.toTypedArray()).toPluginDataFrameSchema()
58+
}
59+
}
60+
4361
internal fun PluginDataFrameSchema.map(selected: ColumnsSet, nextName: () -> String): PluginDataFrameSchema =
4462
PluginDataFrameSchema(
4563
f(columns(), nextName, selected, emptyList()),

plugins/kotlin-dataframe/src/org/jetbrains/kotlinx/dataframe/plugin/loadInterpreter.kt

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -107,6 +107,7 @@ import org.jetbrains.kotlinx.dataframe.plugin.impl.api.PairConstructor
107107
import org.jetbrains.kotlinx.dataframe.plugin.impl.api.PairToConstructor
108108
import org.jetbrains.kotlinx.dataframe.plugin.impl.api.PerRowCol
109109
import org.jetbrains.kotlinx.dataframe.plugin.impl.api.ReadExcel
110+
import org.jetbrains.kotlinx.dataframe.plugin.impl.api.RenameMapping
110111
import org.jetbrains.kotlinx.dataframe.plugin.impl.api.StringColumnsConstructor
111112
import org.jetbrains.kotlinx.dataframe.plugin.impl.api.ToDataFrame
112113
import org.jetbrains.kotlinx.dataframe.plugin.impl.api.ToDataFrameColumn
@@ -224,6 +225,7 @@ internal inline fun <reified T> String.load(): T {
224225
"ReadJson0" -> ReadJson0()
225226
"ReadCSV0" -> ReadCSV0()
226227
"Rename" -> Rename()
228+
"RenameMapping" -> RenameMapping()
227229
"Select0" -> Select0()
228230
"Expr0" -> Expr0()
229231
"And0" -> And0()
Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
import org.jetbrains.kotlinx.dataframe.*
2+
import org.jetbrains.kotlinx.dataframe.annotations.*
3+
import org.jetbrains.kotlinx.dataframe.api.*
4+
import org.jetbrains.kotlinx.dataframe.io.*
5+
6+
fun box(): String {
7+
val df = dataFrameOf("a")(123).rename("a" to "c")
8+
val value: Int = df.c[0]
9+
return "OK"
10+
}

plugins/kotlin-dataframe/tests-gen/org/jetbrains/kotlin/fir/dataframe/DataFrameBlackBoxCodegenTestGenerated.java

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -478,6 +478,12 @@ public void testRename() {
478478
runTest("testData/box/rename.kt");
479479
}
480480

481+
@Test
482+
@TestMetadata("renameMapping.kt")
483+
public void testRenameMapping() {
484+
runTest("testData/box/renameMapping.kt");
485+
}
486+
481487
@Test
482488
@TestMetadata("renameToCamelCase.kt")
483489
public void testRenameToCamelCase() {

0 commit comments

Comments
 (0)