Skip to content

Commit 1349a8d

Browse files
committed
[Compiler plugin] DSL for creating nested column groups in toDataFrame
1 parent aa50988 commit 1349a8d

File tree

6 files changed

+41
-0
lines changed

6 files changed

+41
-0
lines changed

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

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -83,6 +83,7 @@ public fun <T> InsertClause<T>.after(column: ColumnSelector<T, *>): DataFrame<T>
8383

8484
public fun <T> InsertClause<T>.after(column: String): DataFrame<T> = df.add(this.column).move(this.column).after(column)
8585

86+
@AccessApiOverload
8687
public fun <T> InsertClause<T>.after(column: ColumnAccessor<*>): DataFrame<T> = after(column.path())
8788

8889
@AccessApiOverload

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

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -202,6 +202,7 @@ public abstract class CreateDataFrameDsl<T> : TraversePropertiesDsl {
202202

203203
public inline fun <reified R> inferType(noinline expression: (T) -> R): InferType<T, R> = InferType(expression)
204204

205+
@Interpretable("ToDataFrameDslStringInvoke")
205206
public abstract operator fun String.invoke(builder: CreateDataFrameDsl<T>.() -> Unit)
206207
}
207208

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

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -131,6 +131,18 @@ class Properties0 : AbstractInterpreter<Unit>() {
131131
}
132132
}
133133

134+
class ToDataFrameDslStringInvoke : AbstractInterpreter<Unit>() {
135+
val Arguments.dsl: CreateDataFrameDslImplApproximation by arg()
136+
val Arguments.receiver: String by arg()
137+
val Arguments.builder by dsl()
138+
139+
override fun Arguments.interpret() {
140+
val addDsl = CreateDataFrameDslImplApproximation()
141+
builder(addDsl, emptyMap())
142+
dsl.columns.add(SimpleColumnGroup(receiver, addDsl.columns))
143+
}
144+
}
145+
134146
class CreateDataFrameConfiguration {
135147
var maxDepth = DEFAULT_MAX_DEPTH
136148
var traverseConfiguration: TraverseConfiguration = TraverseConfiguration()

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
@@ -103,6 +103,7 @@ import org.jetbrains.kotlinx.dataframe.plugin.impl.api.ToDataFrame
103103
import org.jetbrains.kotlinx.dataframe.plugin.impl.api.ToDataFrameColumn
104104
import org.jetbrains.kotlinx.dataframe.plugin.impl.api.ToDataFrameDefault
105105
import org.jetbrains.kotlinx.dataframe.plugin.impl.api.ToDataFrameDsl
106+
import org.jetbrains.kotlinx.dataframe.plugin.impl.api.ToDataFrameDslStringInvoke
106107
import org.jetbrains.kotlinx.dataframe.plugin.impl.api.ToDataFrameFrom
107108
import org.jetbrains.kotlinx.dataframe.plugin.impl.api.ToTop
108109
import org.jetbrains.kotlinx.dataframe.plugin.impl.api.TrimMargin
@@ -242,6 +243,7 @@ internal inline fun <reified T> String.load(): T {
242243
"toDataFrameDsl" -> ToDataFrameDsl()
243244
"toDataFrame" -> ToDataFrame()
244245
"toDataFrameDefault" -> ToDataFrameDefault()
246+
"ToDataFrameDslStringInvoke" -> ToDataFrameDslStringInvoke()
245247
"DataFrameOf0" -> DataFrameOf0()
246248
"DataFrameBuilderInvoke0" -> DataFrameBuilderInvoke0()
247249
"ToDataFrameColumn" -> ToDataFrameColumn()
Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
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 = listOf("a").toDataFrame {
8+
"group" {
9+
"anotherGroup" {
10+
"a" from { 1 }
11+
}
12+
"b" from { "c" }
13+
}
14+
}
15+
16+
df.group.b
17+
df.group.anotherGroup.a
18+
return "OK"
19+
}

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
@@ -508,6 +508,12 @@ public void testToDataFrame_from() {
508508
runTest("testData/box/toDataFrame_from.kt");
509509
}
510510

511+
@Test
512+
@TestMetadata("toDataFrame_nested.kt")
513+
public void testToDataFrame_nested() {
514+
runTest("testData/box/toDataFrame_nested.kt");
515+
}
516+
511517
@Test
512518
@TestMetadata("toDataFrame_nullableList.kt")
513519
public void testToDataFrame_nullableList() {

0 commit comments

Comments
 (0)