Skip to content

Commit 7485bbe

Browse files
committed
[Compiler plugin] Support move { }.toTop()
Only works for default lambda
1 parent 80dcb02 commit 7485bbe

File tree

5 files changed

+60
-0
lines changed

5 files changed

+60
-0
lines changed

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

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,8 @@ import org.jetbrains.kotlinx.dataframe.AnyColumnReference
55
import org.jetbrains.kotlinx.dataframe.ColumnSelector
66
import org.jetbrains.kotlinx.dataframe.ColumnsSelector
77
import org.jetbrains.kotlinx.dataframe.DataFrame
8+
import org.jetbrains.kotlinx.dataframe.annotations.Interpretable
9+
import org.jetbrains.kotlinx.dataframe.annotations.Refine
810
import org.jetbrains.kotlinx.dataframe.columns.ColumnReference
911
import org.jetbrains.kotlinx.dataframe.columns.ColumnWithPath
1012
import org.jetbrains.kotlinx.dataframe.columns.toColumnSet
@@ -18,6 +20,7 @@ import kotlin.reflect.KProperty
1820

1921
// region move
2022

23+
@Interpretable("Move0")
2124
public fun <T, C> DataFrame<T>.move(columns: ColumnsSelector<T, C>): MoveClause<T, C> = MoveClause(this, columns)
2225

2326
public fun <T> DataFrame<T>.move(vararg cols: String): MoveClause<T, Any?> = move { cols.toColumnSet() }
@@ -120,6 +123,8 @@ public fun <T, C> MoveClause<T, C>.under(
120123

121124
public fun <T, C> MoveClause<T, C>.to(columnIndex: Int): DataFrame<T> = moveTo(columnIndex)
122125

126+
@Refine
127+
@Interpretable("ToTop")
123128
public fun <T, C> MoveClause<T, C>.toTop(
124129
newColumnName: ColumnsSelectionDsl<T>.(ColumnWithPath<C>) -> String = { it.name() },
125130
): DataFrame<T> = into { newColumnName(it).toColumnAccessor() }
Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,33 @@
1+
package org.jetbrains.kotlinx.dataframe.plugin.impl.api
2+
3+
import org.jetbrains.kotlinx.dataframe.api.move
4+
import org.jetbrains.kotlinx.dataframe.api.pathOf
5+
import org.jetbrains.kotlinx.dataframe.api.toTop
6+
import org.jetbrains.kotlinx.dataframe.columns.toColumnSet
7+
import org.jetbrains.kotlinx.dataframe.plugin.impl.AbstractInterpreter
8+
import org.jetbrains.kotlinx.dataframe.plugin.impl.AbstractSchemaModificationInterpreter
9+
import org.jetbrains.kotlinx.dataframe.plugin.impl.Arguments
10+
import org.jetbrains.kotlinx.dataframe.plugin.impl.PluginDataFrameSchema
11+
import org.jetbrains.kotlinx.dataframe.plugin.impl.asDataFrame
12+
import org.jetbrains.kotlinx.dataframe.plugin.impl.dataFrame
13+
import org.jetbrains.kotlinx.dataframe.plugin.impl.toPluginDataFrameSchema
14+
15+
class Move0 : AbstractInterpreter<MoveClauseApproximation>() {
16+
val Arguments.receiver: PluginDataFrameSchema by dataFrame()
17+
val Arguments.columns: ColumnsResolver by arg()
18+
19+
override fun Arguments.interpret(): MoveClauseApproximation {
20+
return MoveClauseApproximation(receiver, columns)
21+
}
22+
}
23+
24+
class ToTop : AbstractSchemaModificationInterpreter() {
25+
val Arguments.receiver: MoveClauseApproximation by arg()
26+
27+
override fun Arguments.interpret(): PluginDataFrameSchema {
28+
val columns = receiver.columns.resolve(receiver.df).map { pathOf(*it.path.path.toTypedArray()) }
29+
return receiver.df.asDataFrame().move { columns.toColumnSet() }.toTop().toPluginDataFrameSchema()
30+
}
31+
}
32+
33+
class MoveClauseApproximation(val df: PluginDataFrameSchema, val columns: ColumnsResolver)

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

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -80,12 +80,14 @@ import org.jetbrains.kotlinx.dataframe.plugin.impl.api.Flatten0
8080
import org.jetbrains.kotlinx.dataframe.plugin.impl.api.FlattenDefault
8181
import org.jetbrains.kotlinx.dataframe.plugin.impl.api.FrameCols0
8282
import org.jetbrains.kotlinx.dataframe.plugin.impl.api.MapToFrame
83+
import org.jetbrains.kotlinx.dataframe.plugin.impl.api.Move0
8384
import org.jetbrains.kotlinx.dataframe.plugin.impl.api.ReadExcel
8485
import org.jetbrains.kotlinx.dataframe.plugin.impl.api.ToDataFrame
8586
import org.jetbrains.kotlinx.dataframe.plugin.impl.api.ToDataFrameColumn
8687
import org.jetbrains.kotlinx.dataframe.plugin.impl.api.ToDataFrameDefault
8788
import org.jetbrains.kotlinx.dataframe.plugin.impl.api.ToDataFrameDsl
8889
import org.jetbrains.kotlinx.dataframe.plugin.impl.api.ToDataFrameFrom
90+
import org.jetbrains.kotlinx.dataframe.plugin.impl.api.ToTop
8991
import org.jetbrains.kotlinx.dataframe.plugin.impl.api.UpdateWith0
9092

9193
internal fun FirFunctionCall.loadInterpreter(session: FirSession): Interpreter<*>? {
@@ -200,6 +202,8 @@ internal inline fun <reified T> String.load(): T {
200202
"AddId" -> AddId()
201203
"AddDslStringInvoke" -> AddDslStringInvoke()
202204
"MapToFrame" -> MapToFrame()
205+
"Move0" -> Move0()
206+
"ToTop" -> ToTop()
203207
else -> error("$this")
204208
} as T
205209
}
Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
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", "b")(1, 2).group { a and b }.into("c").move { c.a }.toTop()
8+
df.a
9+
df.c.b
10+
df.compareSchemas()
11+
return "OK"
12+
}

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
@@ -250,6 +250,12 @@ public void testMapToFrame() {
250250
runTest("testData/box/mapToFrame.kt");
251251
}
252252

253+
@Test
254+
@TestMetadata("moveToTop.kt")
255+
public void testMoveToTop() {
256+
runTest("testData/box/moveToTop.kt");
257+
}
258+
253259
@Test
254260
@TestMetadata("nestedDataSchemaCodegen.kt")
255261
public void testNestedDataSchemaCodegen() {

0 commit comments

Comments
 (0)