Skip to content

Commit 2b5fe8b

Browse files
committed
[Compiler plugin] Make interpreters access columns through ColumnsResolver to further support CS DSL
1 parent 146f5bb commit 2b5fe8b

File tree

13 files changed

+69
-43
lines changed

13 files changed

+69
-43
lines changed

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

Lines changed: 21 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -2,13 +2,29 @@ package org.jetbrains.kotlinx.dataframe.plugin.impl.api
22

33
import org.jetbrains.kotlinx.dataframe.plugin.impl.AbstractInterpreter
44
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.SimpleCol
57
import org.jetbrains.kotlinx.dataframe.plugin.impl.data.ColumnWithPathApproximation
68

7-
internal class And10 : AbstractInterpreter<List<ColumnWithPathApproximation>>() {
8-
val Arguments.other: List<ColumnWithPathApproximation> by arg()
9-
val Arguments.receiver: List<ColumnWithPathApproximation> by arg()
9+
internal class And10 : AbstractInterpreter<ColumnsResolver>() {
10+
val Arguments.other: ColumnsResolver by arg()
11+
val Arguments.receiver: ColumnsResolver by arg()
1012

11-
override fun Arguments.interpret(): List<ColumnWithPathApproximation> {
12-
return receiver + other
13+
override fun Arguments.interpret(): ColumnsResolver {
14+
return object : ColumnsResolver {
15+
override fun resolve(df: PluginDataFrameSchema): List<ColumnWithPathApproximation> {
16+
return receiver.resolve(df) + other.resolve(df)
17+
}
18+
}
1319
}
1420
}
21+
22+
class SingleColumnApproximation(val col: ColumnWithPathApproximation) : ColumnsResolver {
23+
override fun resolve(df: PluginDataFrameSchema): List<ColumnWithPathApproximation> {
24+
return listOf(col)
25+
}
26+
}
27+
28+
interface ColumnsResolver {
29+
fun resolve(df: PluginDataFrameSchema): List<ColumnWithPathApproximation>
30+
}

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

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -20,12 +20,12 @@ import org.jetbrains.kotlinx.dataframe.plugin.impl.type
2020
import org.jetbrains.kotlinx.dataframe.plugin.impl.varargString
2121

2222
internal class Convert0 : AbstractInterpreter<ConvertApproximation>() {
23-
val Arguments.columns: List<ColumnWithPathApproximation> by arg()
23+
val Arguments.columns: ColumnsResolver by arg()
2424
val Arguments.receiver: PluginDataFrameSchema by dataFrame()
2525
override val Arguments.startingSchema get() = receiver
2626

2727
override fun Arguments.interpret(): ConvertApproximation {
28-
return ConvertApproximation(receiver, columns.map { it.path.path })
28+
return ConvertApproximation(receiver, columns.resolve(receiver).map { it.path.path })
2929
}
3030
}
3131

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

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -17,10 +17,10 @@ import org.jetbrains.kotlinx.dataframe.plugin.impl.dataFrame
1717

1818
class DropNulls0 : AbstractSchemaModificationInterpreter() {
1919
val Arguments.receiver: PluginDataFrameSchema by dataFrame()
20-
val Arguments.columns: List<ColumnWithPathApproximation> by arg()
20+
val Arguments.columns: ColumnsResolver by arg()
2121

2222
override fun Arguments.interpret(): PluginDataFrameSchema {
23-
return PluginDataFrameSchema(fillNullsImpl(receiver.columns(), columns.mapTo(mutableSetOf()) { it.path.path }, emptyList()))
23+
return PluginDataFrameSchema(fillNullsImpl(receiver.columns(), columns.resolve(receiver).mapTo(mutableSetOf()) { it.path.path }, emptyList()))
2424
}
2525
}
2626

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

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -16,12 +16,12 @@ import org.jetbrains.kotlinx.dataframe.plugin.impl.dataFrame
1616
internal class Explode0 : AbstractInterpreter<PluginDataFrameSchema>() {
1717
val Arguments.dropEmpty: Boolean by arg(defaultValue = Present(true))
1818
val Arguments.receiver: PluginDataFrameSchema by dataFrame()
19-
val Arguments.selector: List<ColumnWithPathApproximation>? by arg(defaultValue = Present(null))
19+
val Arguments.selector: ColumnsResolver? by arg(defaultValue = Present(null))
2020
override val Arguments.startingSchema get() = receiver
2121

2222
override fun Arguments.interpret(): PluginDataFrameSchema {
2323
val columns = selector ?: TODO()
24-
return receiver.explodeImpl(dropEmpty, columns.map { ColumnPathApproximation(it.path.path) })
24+
return receiver.explodeImpl(dropEmpty, columns.resolve(receiver).map { ColumnPathApproximation(it.path.path) })
2525
}
2626
}
2727

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

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -12,21 +12,21 @@ import org.jetbrains.kotlinx.dataframe.plugin.impl.dataFrame
1212

1313
class Group0 : AbstractInterpreter<GroupClauseApproximation>() {
1414
val Arguments.receiver: PluginDataFrameSchema by dataFrame()
15-
val Arguments.columns: List<ColumnWithPathApproximation> by arg()
15+
val Arguments.columns: ColumnsResolver by arg()
1616

1717
override fun Arguments.interpret(): GroupClauseApproximation {
1818
return GroupClauseApproximation(receiver, columns)
1919
}
2020
}
2121

22-
class GroupClauseApproximation(val df: PluginDataFrameSchema, val columns: List<ColumnWithPathApproximation>)
22+
class GroupClauseApproximation(val df: PluginDataFrameSchema, val columns: ColumnsResolver)
2323

2424
class Into0 : AbstractSchemaModificationInterpreter() {
2525
val Arguments.receiver: GroupClauseApproximation by arg()
2626
val Arguments.column: String by arg()
2727

2828
override fun Arguments.interpret(): PluginDataFrameSchema {
29-
val grouped = groupImpl(receiver.df.columns(), receiver.columns.mapTo(mutableSetOf()) { it.path.path }, column)
29+
val grouped = groupImpl(receiver.df.columns(), receiver.columns.resolve(receiver.df).mapTo(mutableSetOf()) { it.path.path }, column)
3030
return grouped
3131
}
3232
}

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

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -32,10 +32,10 @@ class GroupBy(val df: PluginDataFrameSchema, val keys: List<ColumnWithPathApprox
3232
class DataFrameGroupBy : AbstractInterpreter<GroupBy>() {
3333
val Arguments.receiver: PluginDataFrameSchema by dataFrame()
3434
val Arguments.moveToTop: Boolean by arg(defaultValue = Present(true))
35-
val Arguments.cols: List<ColumnWithPathApproximation> by arg()
35+
val Arguments.cols: ColumnsResolver by arg()
3636

3737
override fun Arguments.interpret(): GroupBy {
38-
return GroupBy(receiver, cols, moveToTop)
38+
return GroupBy(receiver, cols.resolve(receiver), moveToTop)
3939
}
4040
}
4141

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@ internal class Join0 : AbstractInterpreter<PluginDataFrameSchema>() {
1818
override fun Arguments.interpret(): PluginDataFrameSchema {
1919
val nameGenerator = ColumnNameGenerator()
2020
val left = receiver.columns()
21-
val right = removeImpl(other.columns(), setOf(selector.right.path.path)).updatedColumns
21+
val right = removeImpl(other.columns(), setOf(selector.right.resolve(receiver).single().path.path)).updatedColumns
2222

2323
val rightColumnGroups = right.filterIsInstance<SimpleColumnGroup>().associateBy { it.name }
2424

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

Lines changed: 4 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -2,15 +2,14 @@ package org.jetbrains.kotlinx.dataframe.plugin.impl.api
22

33
import org.jetbrains.kotlinx.dataframe.plugin.impl.AbstractInterpreter
44
import org.jetbrains.kotlinx.dataframe.plugin.impl.Arguments
5-
import org.jetbrains.kotlinx.dataframe.plugin.impl.data.ColumnWithPathApproximation
65

7-
internal data class ColumnMatchApproximation(val left: ColumnWithPathApproximation, val right: ColumnWithPathApproximation)
6+
internal data class ColumnMatchApproximation(val left: ColumnsResolver, val right: ColumnsResolver)
87

98
internal class Match0 : AbstractInterpreter<ColumnMatchApproximation>() {
10-
val Arguments.receiver: List<ColumnWithPathApproximation> by arg()
11-
val Arguments.other: List<ColumnWithPathApproximation> by arg()
9+
val Arguments.receiver: ColumnsResolver by arg()
10+
val Arguments.other: ColumnsResolver by arg()
1211

1312
override fun Arguments.interpret(): ColumnMatchApproximation {
14-
return ColumnMatchApproximation(receiver.single(), other.single())
13+
return ColumnMatchApproximation(receiver, other)
1514
}
1615
}

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

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -11,10 +11,10 @@ import org.jetbrains.kotlinx.dataframe.plugin.impl.dataFrame
1111

1212
class Remove0 : AbstractSchemaModificationInterpreter() {
1313
val Arguments.receiver: PluginDataFrameSchema by dataFrame()
14-
val Arguments.columns: List<ColumnWithPathApproximation> by arg()
14+
val Arguments.columns: ColumnsResolver by arg()
1515

1616
override fun Arguments.interpret(): PluginDataFrameSchema {
17-
val removeResult = removeImpl(receiver.columns(), columns.mapTo(mutableSetOf()) { it.path.path })
17+
val removeResult = removeImpl(receiver.columns(), columns.resolve(receiver).mapTo(mutableSetOf()) { it.path.path })
1818
return PluginDataFrameSchema(removeResult.updatedColumns)
1919
}
2020
}

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

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -14,22 +14,23 @@ import org.jetbrains.kotlinx.dataframe.plugin.impl.varargString
1414

1515
class Rename : AbstractInterpreter<RenameClauseApproximation>() {
1616
private val Arguments.receiver by dataFrame()
17-
private val Arguments.columns: List<ColumnWithPathApproximation> by arg()
17+
private val Arguments.columns: ColumnsResolver by arg()
1818
override fun Arguments.interpret(): RenameClauseApproximation {
1919
return RenameClauseApproximation(receiver, columns)
2020
}
2121
}
2222

23-
class RenameClauseApproximation(val schema: PluginDataFrameSchema, val columns: List<ColumnWithPathApproximation>)
23+
class RenameClauseApproximation(val schema: PluginDataFrameSchema, val columns: ColumnsResolver)
2424

2525
class RenameInto : AbstractSchemaModificationInterpreter() {
2626
val Arguments.receiver: RenameClauseApproximation by arg()
2727
val Arguments.newNames: List<String> by varargString()
2828

2929
override fun Arguments.interpret(): PluginDataFrameSchema {
30-
require(receiver.columns.size == newNames.size)
30+
val columns = receiver.columns.resolve(receiver.schema)
31+
require(columns.size == newNames.size)
3132
var i = 0
32-
return receiver.schema.map(receiver.columns.mapTo(mutableSetOf()) { it.path.path }, nextName = { newNames[i].also { i += 1 } })
33+
return receiver.schema.map(columns.mapTo(mutableSetOf()) { it.path.path }, nextName = { newNames[i].also { i += 1 } })
3334
}
3435
}
3536

0 commit comments

Comments
 (0)