Skip to content

Commit 22da430

Browse files
authored
Merge pull request #1048 from Kotlin/implicit-receiver-fix
Implicit receiver fix
2 parents a6a11ab + 64f495a commit 22da430

File tree

11 files changed

+134
-2
lines changed

11 files changed

+134
-2
lines changed
Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,6 @@
11
package org.jetbrains.kotlinx.dataframe.aggregation
22

3+
import org.jetbrains.kotlinx.dataframe.annotations.HasSchema
4+
5+
@HasSchema(schemaArg = 0)
36
public abstract class AggregateGroupedDsl<out T> : AggregateDsl<T>()

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

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -435,6 +435,8 @@ private interface CommonDropNAFunctionDoc
435435
* @include [DropNA.WhereAllNAParam]
436436
* @include [DropDslParam]
437437
*/
438+
@Refine
439+
@Interpretable("DropNa0")
438440
public fun <T> DataFrame<T>.dropNA(whereAllNA: Boolean = false, columns: ColumnsSelector<T, *>): DataFrame<T> {
439441
val cols = this[columns]
440442
return if (whereAllNA) {
Lines changed: 12 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,10 +9,10 @@ import org.jetbrains.kotlinx.dataframe.plugin.extensions.Marker
99
import org.jetbrains.kotlinx.dataframe.plugin.impl.AbstractSchemaModificationInterpreter
1010
import org.jetbrains.kotlinx.dataframe.plugin.impl.Arguments
1111
import org.jetbrains.kotlinx.dataframe.plugin.impl.PluginDataFrameSchema
12+
import org.jetbrains.kotlinx.dataframe.plugin.impl.Present
1213
import org.jetbrains.kotlinx.dataframe.plugin.impl.SimpleCol
1314
import org.jetbrains.kotlinx.dataframe.plugin.impl.SimpleColumnGroup
1415
import org.jetbrains.kotlinx.dataframe.plugin.impl.SimpleDataColumn
15-
import org.jetbrains.kotlinx.dataframe.plugin.impl.data.ColumnWithPathApproximation
1616
import org.jetbrains.kotlinx.dataframe.plugin.impl.dataFrame
1717

1818
class DropNulls0 : AbstractSchemaModificationInterpreter() {
@@ -24,6 +24,17 @@ class DropNulls0 : AbstractSchemaModificationInterpreter() {
2424
}
2525
}
2626

27+
class DropNa0 : AbstractSchemaModificationInterpreter() {
28+
val Arguments.receiver: PluginDataFrameSchema by dataFrame()
29+
val Arguments.whereAllNA: Boolean by arg(defaultValue = Present(false))
30+
val Arguments.columns: ColumnsResolver by arg()
31+
32+
override fun Arguments.interpret(): PluginDataFrameSchema {
33+
if (whereAllNA) return receiver
34+
return PluginDataFrameSchema(fillNullsImpl(receiver.columns(), columns.resolve(receiver).mapTo(mutableSetOf()) { it.path.path }, emptyList()))
35+
}
36+
}
37+
2738
fun KotlinTypeFacade.fillNullsImpl(
2839
columns: List<SimpleCol>,
2940
paths: Set<List<String>>,

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

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@ import org.jetbrains.kotlinx.dataframe.plugin.impl.data.ColumnPathApproximation
1313
import org.jetbrains.kotlinx.dataframe.plugin.impl.data.ColumnWithPathApproximation
1414
import org.jetbrains.kotlinx.dataframe.plugin.impl.dataFrame
1515
import org.jetbrains.kotlinx.dataframe.plugin.impl.enum
16+
import org.jetbrains.kotlinx.dataframe.plugin.impl.ignore
1617
import org.jetbrains.kotlinx.dataframe.plugin.impl.type
1718

1819
internal class Select0 : AbstractInterpreter<PluginDataFrameSchema>() {
@@ -25,6 +26,7 @@ internal class Select0 : AbstractInterpreter<PluginDataFrameSchema>() {
2526
}
2627

2728
internal class Expr0 : AbstractInterpreter<ColumnsResolver>() {
29+
val Arguments.receiver by ignore()
2830
val Arguments.name: String by arg(defaultValue = Present("untitled"))
2931
val Arguments.infer: Infer by enum(defaultValue = Present(Infer.Nulls))
3032
val Arguments.expression: TypeApproximation by type()
@@ -53,6 +55,7 @@ internal class And0 : AbstractInterpreter<ColumnsResolver>() {
5355
}
5456

5557
internal class All0 : AbstractInterpreter<ColumnsResolver>() {
58+
val Arguments.receiver by ignore()
5659
override fun Arguments.interpret(): ColumnsResolver {
5760
return object : ColumnsResolver {
5861
override fun resolve(df: PluginDataFrameSchema): List<ColumnWithPathApproximation> {
@@ -66,6 +69,7 @@ internal class All0 : AbstractInterpreter<ColumnsResolver>() {
6669
}
6770

6871
internal class ColsOf0 : AbstractInterpreter<ColumnsResolver>() {
72+
val Arguments.receiver by ignore()
6973
val Arguments.typeArg0: TypeApproximation by arg()
7074

7175
override fun Arguments.interpret(): ColumnsResolver {
@@ -90,6 +94,7 @@ private fun Arguments.colsOf(cols: List<ColumnWithPathApproximation>, type: Cone
9094
}
9195

9296
internal class ColsAtAnyDepth0 : AbstractInterpreter<ColumnsResolver>() {
97+
val Arguments.receiver by ignore()
9398
override fun Arguments.interpret(): ColumnsResolver {
9499
return object : ColumnsResolver {
95100
override fun resolve(df: PluginDataFrameSchema): List<ColumnWithPathApproximation> {

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -505,7 +505,7 @@ internal fun FirFunctionCall.collectArgumentExpressions(): RefinedArguments {
505505
val refinedArgument = mutableListOf<RefinedArgument>()
506506

507507
val parameterName = Name.identifier("receiver")
508-
explicitReceiver?.let {
508+
(explicitReceiver ?: extensionReceiver)?.let {
509509
if (it is FirResolvedQualifier && it.resolvedToCompanionObject) {
510510
return@let
511511
}

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
@@ -83,6 +83,7 @@ import org.jetbrains.kotlinx.dataframe.plugin.impl.api.DataFrameBuilderInvoke0
8383
import org.jetbrains.kotlinx.dataframe.plugin.impl.api.DataFrameOf0
8484
import org.jetbrains.kotlinx.dataframe.plugin.impl.api.DataFrameOf3
8585
import org.jetbrains.kotlinx.dataframe.plugin.impl.api.DataRowReadJsonStr
86+
import org.jetbrains.kotlinx.dataframe.plugin.impl.api.DropNa0
8687
import org.jetbrains.kotlinx.dataframe.plugin.impl.api.FillNulls0
8788
import org.jetbrains.kotlinx.dataframe.plugin.impl.api.Flatten0
8889
import org.jetbrains.kotlinx.dataframe.plugin.impl.api.FlattenDefault
@@ -223,6 +224,7 @@ internal inline fun <reified T> String.load(): T {
223224
"Into0" -> Into0()
224225
"Ungroup0" -> Ungroup0()
225226
"DropNulls0" -> DropNulls0()
227+
"DropNa0" -> DropNa0()
226228
"Properties0" -> Properties0()
227229
"Preserve0" -> Preserve0()
228230
"Preserve1" -> Preserve1()
Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
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(
8+
"a" to listOf(1, null, 3),
9+
"b" to listOf(null, 5, 6)
10+
)
11+
val df1 = df.dropNA { a and b }
12+
df1.compareSchemas(strict = true)
13+
14+
val df2 = df.dropNA(whereAllNA = true) { a and b }
15+
df2.compareSchemas(strict = true)
16+
return "OK"
17+
}
Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
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.toDataFrame
5+
import org.jetbrains.kotlinx.dataframe.io.*
6+
7+
data class Name(val firstName: String, val lastName: String)
8+
9+
data class Score(val subject: String, val value: Int)
10+
11+
data class Student(val name: Name, val age: Int, val scores: List<Score>)
12+
13+
fun box(): String {
14+
val students = listOf(
15+
Student(Name("Alice", "Cooper"), 15, listOf(Score("math", 4), Score("biology", 3))),
16+
Student(Name("Bob", "Marley"), 20, listOf(Score("music", 5))),
17+
)
18+
19+
val df = students.toDataFrame().groupBy { expr { name.firstName} }
20+
.aggregate {
21+
remove { age } into "a"
22+
}
23+
24+
df.compareSchemas(strict = true)
25+
return "OK"
26+
}
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+
data class Nested(val d: Double)
7+
8+
data class Record(val a: String, val b: Int, val nested: Nested)
9+
10+
fun box(): String {
11+
val df = dataFrameOf("a", "b", "c")(1, 2, 3)
12+
13+
df.groupBy { a }
14+
.updateGroups { remove { a } }
15+
.aggregate { c into "c" }
16+
return "OK"
17+
}
18+
19+
Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
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+
@DataSchema
7+
interface JoinLeaf {
8+
val something: Int
9+
val somethingElse: String
10+
}
11+
12+
@DataSchema
13+
interface Join2 {
14+
val c: DataRow<JoinLeaf>
15+
}
16+
17+
fun selectionDsl(df: DataFrame<Join2>) {
18+
df.ungroup { c }.select { colsOf<String>() }.somethingElse
19+
}
20+
21+
fun box(): String {
22+
return "OK"
23+
}

0 commit comments

Comments
 (0)