Skip to content

Commit 63edccd

Browse files
committed
[Compiler plugin] GroupBy.into(column)
1 parent 556865e commit 63edccd

File tree

5 files changed

+26
-4
lines changed

5 files changed

+26
-4
lines changed

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@ public abstract class AggregateDsl<out T> :
1717
DataFrame<T>,
1818
ColumnSelectionDsl<T> {
1919

20-
@Interpretable("GroupByInto")
20+
@Interpretable("AggregateDslInto")
2121
public inline infix fun <reified R> R.into(name: String): NamedValue =
2222
internal().yield(pathOf(name), this, typeOf<R>())
2323

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

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,8 @@ import org.jetbrains.kotlinx.dataframe.AnyRow
55
import org.jetbrains.kotlinx.dataframe.DataFrame
66
import org.jetbrains.kotlinx.dataframe.RowExpression
77
import org.jetbrains.kotlinx.dataframe.annotations.AccessApiOverload
8+
import org.jetbrains.kotlinx.dataframe.annotations.Interpretable
9+
import org.jetbrains.kotlinx.dataframe.annotations.Refine
810
import org.jetbrains.kotlinx.dataframe.columns.ColumnAccessor
911
import org.jetbrains.kotlinx.dataframe.impl.aggregation.internal
1012
import org.jetbrains.kotlinx.dataframe.impl.aggregation.withExpr
@@ -14,6 +16,8 @@ import kotlin.reflect.typeOf
1416

1517
// region GroupBy
1618

19+
@Refine
20+
@Interpretable("GroupByInto")
1721
public fun <T, G> GroupBy<T, G>.into(column: String): DataFrame<T> = toDataFrame(column)
1822

1923
@AccessApiOverload

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

Lines changed: 13 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -44,7 +44,7 @@ class GroupByDsl {
4444
val columns = mutableListOf<NamedValue>()
4545
}
4646

47-
class GroupByInto : AbstractInterpreter<Unit>() {
47+
class AggregateDslInto : AbstractInterpreter<Unit>() {
4848
val Arguments.dsl: GroupByDsl by arg()
4949
val Arguments.receiver: FirExpression by arg(lens = Interpreter.Id)
5050
val Arguments.name: String by arg()
@@ -146,6 +146,18 @@ fun KotlinTypeFacade.createPluginDataFrameSchema(keys: List<ColumnWithPathApprox
146146
return PluginDataFrameSchema(rootColumns)
147147
}
148148

149+
class GroupByInto : AbstractSchemaModificationInterpreter() {
150+
val Arguments.receiver: GroupBy by groupBy()
151+
val Arguments.column: String by arg()
152+
153+
override fun Arguments.interpret(): PluginDataFrameSchema {
154+
val grouped = listOf(SimpleFrameColumn(column, receiver.groups.columns()))
155+
return PluginDataFrameSchema(
156+
receiver.keys.columns() + grouped
157+
)
158+
}
159+
}
160+
149161
class GroupByToDataFrame : AbstractSchemaModificationInterpreter() {
150162
val Arguments.receiver: GroupBy by groupBy()
151163
val Arguments.groupedColumnName: String? by arg(defaultValue = Present(null))

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

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,7 @@ import org.jetbrains.kotlinx.dataframe.plugin.impl.api.Explode0
2424
import org.jetbrains.kotlinx.dataframe.plugin.impl.api.Expr0
2525
import org.jetbrains.kotlinx.dataframe.plugin.impl.api.From
2626
import org.jetbrains.kotlinx.dataframe.plugin.impl.api.Group0
27-
import org.jetbrains.kotlinx.dataframe.plugin.impl.api.GroupByInto
27+
import org.jetbrains.kotlinx.dataframe.plugin.impl.api.AggregateDslInto
2828
import org.jetbrains.kotlinx.dataframe.plugin.impl.api.GroupByToDataFrame
2929
import org.jetbrains.kotlinx.dataframe.plugin.impl.api.Insert0
3030
import org.jetbrains.kotlinx.dataframe.plugin.impl.api.Insert1
@@ -89,6 +89,7 @@ import org.jetbrains.kotlinx.dataframe.plugin.impl.api.Flatten0
8989
import org.jetbrains.kotlinx.dataframe.plugin.impl.api.FlattenDefault
9090
import org.jetbrains.kotlinx.dataframe.plugin.impl.api.FrameCols0
9191
import org.jetbrains.kotlinx.dataframe.plugin.impl.api.GroupByAdd
92+
import org.jetbrains.kotlinx.dataframe.plugin.impl.api.GroupByInto
9293
import org.jetbrains.kotlinx.dataframe.plugin.impl.api.MapToFrame
9394
import org.jetbrains.kotlinx.dataframe.plugin.impl.api.Merge0
9495
import org.jetbrains.kotlinx.dataframe.plugin.impl.api.MergeId
@@ -242,11 +243,12 @@ internal inline fun <reified T> String.load(): T {
242243
"Exclude1" -> Exclude1()
243244
"RenameInto" -> RenameInto()
244245
"DataFrameGroupBy" -> DataFrameGroupBy()
245-
"GroupByInto" -> GroupByInto()
246+
"AggregateDslInto" -> AggregateDslInto()
246247
"ReadJsonStr" -> ReadJsonStr()
247248
"DataRowReadJsonStr" -> DataRowReadJsonStr()
248249
"ReadDelimStr" -> ReadDelimStr()
249250
"GroupByToDataFrame" -> GroupByToDataFrame()
251+
"GroupByInto" -> GroupByInto()
250252
"ToDataFrameFrom0" -> ToDataFrameFrom()
251253
"All0" -> All0()
252254
"ColsOf0" -> ColsOf0()

plugins/kotlin-dataframe/testData/box/groupBy_toDataFrame.kt

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,5 +11,9 @@ fun box(): String {
1111
val df1 = df.groupBy { b }.toDataFrame()
1212
df1.group[0].a
1313
df1.group[0].b
14+
15+
val df2 = df.groupBy { b }.into("gr")
16+
df2.gr[0].a
17+
df2.gr[0].b
1418
return "OK"
1519
}

0 commit comments

Comments
 (0)