Skip to content

Commit 16f5d51

Browse files
committed
[Compiler plugin] Support GroupBy.add
1 parent 2143dfc commit 16f5d51

File tree

6 files changed

+67
-0
lines changed

6 files changed

+67
-0
lines changed

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

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -248,6 +248,8 @@ public fun <T> DataFrame<T>.add(body: AddDsl<T>.() -> Unit): DataFrame<T> {
248248
return dataFrameOf(this@add.columns() + dsl.columns).cast()
249249
}
250250

251+
@Refine
252+
@Interpretable("GroupByAdd")
251253
public inline fun <reified R, T, G> GroupBy<T, G>.add(
252254
name: String,
253255
infer: Infer = Infer.Nulls,

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

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,10 @@ data class PluginDataFrameSchema(
2727
}
2828
}
2929

30+
fun PluginDataFrameSchema.add(name: String, type: ConeKotlinType, context: KotlinTypeFacade): PluginDataFrameSchema {
31+
return PluginDataFrameSchema(columns() + context.simpleColumnOf(name, type))
32+
}
33+
3034
private fun List<SimpleCol>.asString(indent: String = ""): String {
3135
return joinToString("\n") {
3236
val col = when (it) {

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

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@ import org.jetbrains.kotlinx.dataframe.plugin.impl.Present
1919
import org.jetbrains.kotlinx.dataframe.plugin.impl.SimpleCol
2020
import org.jetbrains.kotlinx.dataframe.plugin.impl.SimpleColumnGroup
2121
import org.jetbrains.kotlinx.dataframe.plugin.impl.SimpleFrameColumn
22+
import org.jetbrains.kotlinx.dataframe.plugin.impl.add
2223
import org.jetbrains.kotlinx.dataframe.plugin.impl.data.ColumnWithPathApproximation
2324
import org.jetbrains.kotlinx.dataframe.plugin.impl.dataFrame
2425
import org.jetbrains.kotlinx.dataframe.plugin.impl.groupBy
@@ -156,3 +157,13 @@ class GroupByToDataFrame : AbstractSchemaModificationInterpreter() {
156157
)
157158
}
158159
}
160+
161+
class GroupByAdd : AbstractInterpreter<GroupBy>() {
162+
val Arguments.receiver: GroupBy by groupBy()
163+
val Arguments.name: String by arg()
164+
val Arguments.type: TypeApproximation by type(name("expression"))
165+
166+
override fun Arguments.interpret(): GroupBy {
167+
return GroupBy(receiver.keys, receiver.groups.add(name, type.type, context = this))
168+
}
169+
}

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.FillNulls0
8888
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
91+
import org.jetbrains.kotlinx.dataframe.plugin.impl.api.GroupByAdd
9192
import org.jetbrains.kotlinx.dataframe.plugin.impl.api.MapToFrame
9293
import org.jetbrains.kotlinx.dataframe.plugin.impl.api.Move0
9394
import org.jetbrains.kotlinx.dataframe.plugin.impl.api.MoveAfter0
@@ -275,6 +276,7 @@ internal inline fun <reified T> String.load(): T {
275276
"MoveToLeft1" -> MoveToLeft1()
276277
"MoveToRight0" -> MoveToRight0()
277278
"MoveAfter0" -> MoveAfter0()
279+
"GroupByAdd" -> GroupByAdd()
278280
else -> error("$this")
279281
} as T
280282
}
Lines changed: 42 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,42 @@
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.api.groupBy
5+
import org.jetbrains.kotlinx.dataframe.io.*
6+
7+
enum class State {
8+
Idle,
9+
Productive,
10+
Maintenance,
11+
}
12+
13+
class Event(val toolId: String, val state: State, val timestamp: Long)
14+
15+
fun box(): String {
16+
val tool1 = "tool_1"
17+
val tool2 = "tool_2"
18+
val tool3 = "tool_3"
19+
20+
val events = listOf(
21+
Event(tool1, State.Idle, 0),
22+
Event(tool1, State.Productive, 5),
23+
Event(tool2, State.Idle, 0),
24+
Event(tool2, State.Maintenance, 10),
25+
Event(tool2, State.Idle, 20),
26+
Event(tool3, State.Idle, 0),
27+
Event(tool3, State.Productive, 25),
28+
).toDataFrame()
29+
30+
val lastTimestamp = events.maxOf { timestamp }
31+
val groupBy = events
32+
.groupBy { toolId }
33+
.sortBy { timestamp }
34+
.add("stateDuration") {
35+
(next()?.timestamp ?: lastTimestamp) - timestamp
36+
}.toDataFrame()
37+
38+
groupBy.group[0].stateDuration
39+
40+
groupBy.compareSchemas(strict = true)
41+
return "OK"
42+
}

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
@@ -214,6 +214,12 @@ public void testGroupBy() {
214214
runTest("testData/box/groupBy.kt");
215215
}
216216

217+
@Test
218+
@TestMetadata("groupByAdd.kt")
219+
public void testGroupByAdd() {
220+
runTest("testData/box/groupByAdd.kt");
221+
}
222+
217223
@Test
218224
@TestMetadata("groupBy_DataRow.kt")
219225
public void testGroupBy_DataRow() {

0 commit comments

Comments
 (0)