Skip to content

Commit 83296fd

Browse files
committed
[Compiler plugin] Partially support Update operation
Something like update { }.where { }.with { } still would return an empty schema, and supporting it requires a more thorough approach with fallback schemas
1 parent 7485bbe commit 83296fd

File tree

6 files changed

+45
-3
lines changed

6 files changed

+45
-3
lines changed

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

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -155,6 +155,7 @@ private interface UpdateWithNote
155155
* @include [SelectingColumns.Dsl.WithExample] {@include [SetSelectingColumnsOperationArg]}
156156
* @include [Update.DslParam]
157157
*/
158+
@Interpretable("Update0")
158159
public fun <T, C> DataFrame<T>.update(columns: ColumnsSelector<T, C>): Update<T, C> = Update(this, null, columns)
159160

160161
/**

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

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -16,13 +16,16 @@ class FillNulls0 : AbstractInterpreter<FillNullsApproximation>() {
1616
}
1717
}
1818

19-
class FillNullsApproximation(val schema: PluginDataFrameSchema, val columns: ColumnsResolver)
19+
class FillNullsApproximation(val schema: PluginDataFrameSchema, val columns: ColumnsResolver) : UpdateApproximation
2020

2121
class UpdateWith0 : AbstractSchemaModificationInterpreter() {
22-
val Arguments.receiver: FillNullsApproximation by arg()
22+
val Arguments.receiver: UpdateApproximation by arg()
2323
val Arguments.expression: TypeApproximation by type()
2424

2525
override fun Arguments.interpret(): PluginDataFrameSchema {
26-
return convertImpl(receiver.schema, receiver.columns.resolve(receiver.schema).map { it.path.path }, expression)
26+
return when (val receiver = receiver) {
27+
is FillNullsApproximation -> convertImpl(receiver.schema, receiver.columns.resolve(receiver.schema).map { it.path.path }, expression)
28+
is UpdateApproximationImpl -> convertImpl(receiver.schema, receiver.columns.resolve(receiver.schema).map { it.path.path }, expression)
29+
}
2730
}
2831
}
Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
package org.jetbrains.kotlinx.dataframe.plugin.impl.api
2+
3+
import org.jetbrains.kotlinx.dataframe.plugin.impl.AbstractInterpreter
4+
import org.jetbrains.kotlinx.dataframe.plugin.impl.Arguments
5+
import org.jetbrains.kotlinx.dataframe.plugin.impl.PluginDataFrameSchema
6+
import org.jetbrains.kotlinx.dataframe.plugin.impl.dataFrame
7+
8+
class Update0 : AbstractInterpreter<UpdateApproximationImpl>() {
9+
val Arguments.receiver: PluginDataFrameSchema by dataFrame()
10+
val Arguments.columns: ColumnsResolver by arg()
11+
12+
override fun Arguments.interpret(): UpdateApproximationImpl {
13+
return UpdateApproximationImpl(receiver, columns)
14+
}
15+
}
16+
17+
sealed interface UpdateApproximation
18+
19+
class UpdateApproximationImpl(val schema: PluginDataFrameSchema, val columns: ColumnsResolver) : UpdateApproximation

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
@@ -88,6 +88,7 @@ import org.jetbrains.kotlinx.dataframe.plugin.impl.api.ToDataFrameDefault
8888
import org.jetbrains.kotlinx.dataframe.plugin.impl.api.ToDataFrameDsl
8989
import org.jetbrains.kotlinx.dataframe.plugin.impl.api.ToDataFrameFrom
9090
import org.jetbrains.kotlinx.dataframe.plugin.impl.api.ToTop
91+
import org.jetbrains.kotlinx.dataframe.plugin.impl.api.Update0
9192
import org.jetbrains.kotlinx.dataframe.plugin.impl.api.UpdateWith0
9293

9394
internal fun FirFunctionCall.loadInterpreter(session: FirSession): Interpreter<*>? {
@@ -204,6 +205,7 @@ internal inline fun <reified T> String.load(): T {
204205
"MapToFrame" -> MapToFrame()
205206
"Move0" -> Move0()
206207
"ToTop" -> ToTop()
208+
"Update0" -> Update0()
207209
else -> error("$this")
208210
} as T
209211
}
Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
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, null, null, "")
8+
val df1 = df.update { b }.with { "empty" }
9+
val b: DataColumn<String> = df1.b
10+
return "OK"
11+
}

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
@@ -418,6 +418,12 @@ public void testUngroup() {
418418
runTest("testData/box/ungroup.kt");
419419
}
420420

421+
@Test
422+
@TestMetadata("update.kt")
423+
public void testUpdate() {
424+
runTest("testData/box/update.kt");
425+
}
426+
421427
@Nested
422428
@TestMetadata("testData/box/colKinds")
423429
@TestDataPath("$PROJECT_ROOT")

0 commit comments

Comments
 (0)