Skip to content

Commit 13ff0c5

Browse files
authored
Merge pull request #1263 from Kotlin/groupBy-codegen2
GroupBy Jupyter codegen
2 parents b7eeb1a + 8968c7e commit 13ff0c5

30 files changed

+330
-157
lines changed

core/api/core.api

Lines changed: 45 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -673,6 +673,7 @@ public final class org/jetbrains/kotlinx/dataframe/api/CastKt {
673673
public static final fun cast (Lorg/jetbrains/kotlinx/dataframe/DataColumn;)Lorg/jetbrains/kotlinx/dataframe/DataColumn;
674674
public static final fun cast (Lorg/jetbrains/kotlinx/dataframe/DataFrame;)Lorg/jetbrains/kotlinx/dataframe/DataFrame;
675675
public static final fun cast (Lorg/jetbrains/kotlinx/dataframe/DataRow;)Lorg/jetbrains/kotlinx/dataframe/DataRow;
676+
public static final fun cast (Lorg/jetbrains/kotlinx/dataframe/api/GroupBy;)Lorg/jetbrains/kotlinx/dataframe/api/GroupBy;
676677
public static final fun cast (Lorg/jetbrains/kotlinx/dataframe/columns/ColumnAccessor;)Lorg/jetbrains/kotlinx/dataframe/columns/ColumnAccessor;
677678
public static final fun cast (Lorg/jetbrains/kotlinx/dataframe/columns/ColumnGroup;)Lorg/jetbrains/kotlinx/dataframe/columns/ColumnGroup;
678679
public static final fun cast (Lorg/jetbrains/kotlinx/dataframe/columns/ColumnReference;)Lorg/jetbrains/kotlinx/dataframe/columns/ColumnReference;
@@ -4770,23 +4771,23 @@ public abstract interface class org/jetbrains/kotlinx/dataframe/codeGen/BaseFiel
47704771
}
47714772

47724773
public final class org/jetbrains/kotlinx/dataframe/codeGen/CodeGenResult {
4773-
public fun <init> (Lorg/jetbrains/kotlinx/dataframe/codeGen/CodeWithConverter;Ljava/util/List;)V
4774-
public final fun component1 ()Lorg/jetbrains/kotlinx/dataframe/codeGen/CodeWithConverter;
4774+
public fun <init> (Lorg/jetbrains/kotlinx/dataframe/codeGen/CodeWithTypeCastGenerator;Ljava/util/List;)V
4775+
public final fun component1 ()Lorg/jetbrains/kotlinx/dataframe/codeGen/CodeWithTypeCastGenerator;
47754776
public final fun component2 ()Ljava/util/List;
4776-
public final fun copy (Lorg/jetbrains/kotlinx/dataframe/codeGen/CodeWithConverter;Ljava/util/List;)Lorg/jetbrains/kotlinx/dataframe/codeGen/CodeGenResult;
4777-
public static synthetic fun copy$default (Lorg/jetbrains/kotlinx/dataframe/codeGen/CodeGenResult;Lorg/jetbrains/kotlinx/dataframe/codeGen/CodeWithConverter;Ljava/util/List;ILjava/lang/Object;)Lorg/jetbrains/kotlinx/dataframe/codeGen/CodeGenResult;
4777+
public final fun copy (Lorg/jetbrains/kotlinx/dataframe/codeGen/CodeWithTypeCastGenerator;Ljava/util/List;)Lorg/jetbrains/kotlinx/dataframe/codeGen/CodeGenResult;
4778+
public static synthetic fun copy$default (Lorg/jetbrains/kotlinx/dataframe/codeGen/CodeGenResult;Lorg/jetbrains/kotlinx/dataframe/codeGen/CodeWithTypeCastGenerator;Ljava/util/List;ILjava/lang/Object;)Lorg/jetbrains/kotlinx/dataframe/codeGen/CodeGenResult;
47784779
public fun equals (Ljava/lang/Object;)Z
4779-
public final fun getCode ()Lorg/jetbrains/kotlinx/dataframe/codeGen/CodeWithConverter;
4780+
public final fun getCode ()Lorg/jetbrains/kotlinx/dataframe/codeGen/CodeWithTypeCastGenerator;
47804781
public final fun getNewMarkers ()Ljava/util/List;
47814782
public fun hashCode ()I
47824783
public fun toString ()Ljava/lang/String;
47834784
}
47844785

47854786
public abstract interface class org/jetbrains/kotlinx/dataframe/codeGen/CodeGenerator : org/jetbrains/kotlinx/dataframe/codeGen/ExtensionsCodeGenerator {
47864787
public static final field Companion Lorg/jetbrains/kotlinx/dataframe/codeGen/CodeGenerator$Companion;
4787-
public abstract fun generate (Lorg/jetbrains/kotlinx/dataframe/codeGen/Marker;Lorg/jetbrains/kotlinx/dataframe/codeGen/InterfaceGenerationMode;ZLorg/jetbrains/kotlinx/dataframe/codeGen/DefaultReadDfMethod;)Lorg/jetbrains/kotlinx/dataframe/codeGen/CodeWithConverter;
4788+
public abstract fun generate (Lorg/jetbrains/kotlinx/dataframe/codeGen/Marker;Lorg/jetbrains/kotlinx/dataframe/codeGen/InterfaceGenerationMode;ZLorg/jetbrains/kotlinx/dataframe/codeGen/DefaultReadDfMethod;)Lorg/jetbrains/kotlinx/dataframe/codeGen/CodeWithTypeCastGenerator;
47884789
public abstract fun generate (Lorg/jetbrains/kotlinx/dataframe/schema/DataFrameSchema;Ljava/lang/String;ZZZLorg/jetbrains/kotlinx/dataframe/codeGen/MarkerVisibility;Ljava/lang/Iterable;Lorg/jetbrains/kotlinx/dataframe/codeGen/DefaultReadDfMethod;Lorg/jetbrains/kotlinx/dataframe/codeGen/NameNormalizer;Z)Lorg/jetbrains/kotlinx/dataframe/codeGen/CodeGenResult;
4789-
public static synthetic fun generate$default (Lorg/jetbrains/kotlinx/dataframe/codeGen/CodeGenerator;Lorg/jetbrains/kotlinx/dataframe/codeGen/Marker;Lorg/jetbrains/kotlinx/dataframe/codeGen/InterfaceGenerationMode;ZLorg/jetbrains/kotlinx/dataframe/codeGen/DefaultReadDfMethod;ILjava/lang/Object;)Lorg/jetbrains/kotlinx/dataframe/codeGen/CodeWithConverter;
4790+
public static synthetic fun generate$default (Lorg/jetbrains/kotlinx/dataframe/codeGen/CodeGenerator;Lorg/jetbrains/kotlinx/dataframe/codeGen/Marker;Lorg/jetbrains/kotlinx/dataframe/codeGen/InterfaceGenerationMode;ZLorg/jetbrains/kotlinx/dataframe/codeGen/DefaultReadDfMethod;ILjava/lang/Object;)Lorg/jetbrains/kotlinx/dataframe/codeGen/CodeWithTypeCastGenerator;
47904791
public static synthetic fun generate$default (Lorg/jetbrains/kotlinx/dataframe/codeGen/CodeGenerator;Lorg/jetbrains/kotlinx/dataframe/schema/DataFrameSchema;Ljava/lang/String;ZZZLorg/jetbrains/kotlinx/dataframe/codeGen/MarkerVisibility;Ljava/lang/Iterable;Lorg/jetbrains/kotlinx/dataframe/codeGen/DefaultReadDfMethod;Lorg/jetbrains/kotlinx/dataframe/codeGen/NameNormalizer;ZILjava/lang/Object;)Lorg/jetbrains/kotlinx/dataframe/codeGen/CodeGenResult;
47914792
}
47924793

@@ -4796,30 +4797,30 @@ public final class org/jetbrains/kotlinx/dataframe/codeGen/CodeGenerator$Compani
47964797
}
47974798

47984799
public final class org/jetbrains/kotlinx/dataframe/codeGen/CodeGeneratorKt {
4799-
public static final fun generate (Lorg/jetbrains/kotlinx/dataframe/codeGen/CodeGenerator;Lkotlin/reflect/KClass;Lorg/jetbrains/kotlinx/dataframe/codeGen/InterfaceGenerationMode;Z)Lorg/jetbrains/kotlinx/dataframe/codeGen/CodeWithConverter;
4800+
public static final fun generate (Lorg/jetbrains/kotlinx/dataframe/codeGen/CodeGenerator;Lkotlin/reflect/KClass;Lorg/jetbrains/kotlinx/dataframe/codeGen/InterfaceGenerationMode;Z)Lorg/jetbrains/kotlinx/dataframe/codeGen/CodeWithTypeCastGenerator;
48004801
}
48014802

4802-
public final class org/jetbrains/kotlinx/dataframe/codeGen/CodeWithConverter {
4803-
public static final field Companion Lorg/jetbrains/kotlinx/dataframe/codeGen/CodeWithConverter$Companion;
4803+
public final class org/jetbrains/kotlinx/dataframe/codeGen/CodeWithTypeCastGenerator {
4804+
public static final field Companion Lorg/jetbrains/kotlinx/dataframe/codeGen/CodeWithTypeCastGenerator$Companion;
48044805
public static final field EMPTY_DECLARATIONS Ljava/lang/String;
4805-
public fun <init> (Ljava/lang/String;Lkotlin/jvm/functions/Function1;)V
4806-
public synthetic fun <init> (Ljava/lang/String;Lkotlin/jvm/functions/Function1;ILkotlin/jvm/internal/DefaultConstructorMarker;)V
4806+
public fun <init> (Ljava/lang/String;Lorg/jetbrains/kotlinx/dataframe/codeGen/TypeCastGenerator;)V
4807+
public synthetic fun <init> (Ljava/lang/String;Lorg/jetbrains/kotlinx/dataframe/codeGen/TypeCastGenerator;ILkotlin/jvm/internal/DefaultConstructorMarker;)V
48074808
public final fun component1 ()Ljava/lang/String;
4808-
public final fun component2 ()Lkotlin/jvm/functions/Function1;
4809-
public final fun copy (Ljava/lang/String;Lkotlin/jvm/functions/Function1;)Lorg/jetbrains/kotlinx/dataframe/codeGen/CodeWithConverter;
4810-
public static synthetic fun copy$default (Lorg/jetbrains/kotlinx/dataframe/codeGen/CodeWithConverter;Ljava/lang/String;Lkotlin/jvm/functions/Function1;ILjava/lang/Object;)Lorg/jetbrains/kotlinx/dataframe/codeGen/CodeWithConverter;
4809+
public final fun component2 ()Lorg/jetbrains/kotlinx/dataframe/codeGen/TypeCastGenerator;
4810+
public final fun copy (Ljava/lang/String;Lorg/jetbrains/kotlinx/dataframe/codeGen/TypeCastGenerator;)Lorg/jetbrains/kotlinx/dataframe/codeGen/CodeWithTypeCastGenerator;
4811+
public static synthetic fun copy$default (Lorg/jetbrains/kotlinx/dataframe/codeGen/CodeWithTypeCastGenerator;Ljava/lang/String;Lorg/jetbrains/kotlinx/dataframe/codeGen/TypeCastGenerator;ILjava/lang/Object;)Lorg/jetbrains/kotlinx/dataframe/codeGen/CodeWithTypeCastGenerator;
4812+
public final fun declarationsWithCastExpression (Ljava/lang/String;)Ljava/lang/String;
48114813
public fun equals (Ljava/lang/Object;)Z
4812-
public final fun getConverter ()Lkotlin/jvm/functions/Function1;
48134814
public final fun getDeclarations ()Ljava/lang/String;
4814-
public final fun getHasConverter ()Z
4815+
public final fun getHasCaster ()Z
48154816
public final fun getHasDeclarations ()Z
4817+
public final fun getTypeCastGenerator ()Lorg/jetbrains/kotlinx/dataframe/codeGen/TypeCastGenerator;
48164818
public fun hashCode ()I
48174819
public fun toString ()Ljava/lang/String;
4818-
public final fun with (Ljava/lang/String;)Ljava/lang/String;
48194820
}
48204821

4821-
public final class org/jetbrains/kotlinx/dataframe/codeGen/CodeWithConverter$Companion {
4822-
public final fun getEMPTY ()Lorg/jetbrains/kotlinx/dataframe/codeGen/CodeWithConverter;
4822+
public final class org/jetbrains/kotlinx/dataframe/codeGen/CodeWithTypeCastGenerator$Companion {
4823+
public final fun getEMPTY ()Lorg/jetbrains/kotlinx/dataframe/codeGen/CodeWithTypeCastGenerator;
48234824
public final fun getEMPTY_CONVERTER ()Lkotlin/jvm/functions/Function1;
48244825
}
48254826

@@ -4830,7 +4831,7 @@ public abstract interface class org/jetbrains/kotlinx/dataframe/codeGen/DefaultR
48304831

48314832
public abstract interface class org/jetbrains/kotlinx/dataframe/codeGen/ExtensionsCodeGenerator {
48324833
public static final field Companion Lorg/jetbrains/kotlinx/dataframe/codeGen/ExtensionsCodeGenerator$Companion;
4833-
public abstract fun generate (Lorg/jetbrains/kotlinx/dataframe/codeGen/IsolatedMarker;)Lorg/jetbrains/kotlinx/dataframe/codeGen/CodeWithConverter;
4834+
public abstract fun generate (Lorg/jetbrains/kotlinx/dataframe/codeGen/IsolatedMarker;)Lorg/jetbrains/kotlinx/dataframe/codeGen/CodeWithTypeCastGenerator;
48344835
}
48354836

48364837
public final class org/jetbrains/kotlinx/dataframe/codeGen/ExtensionsCodeGenerator$Companion {
@@ -4976,6 +4977,28 @@ public final class org/jetbrains/kotlinx/dataframe/codeGen/NameNormalizer : kotl
49764977
public final class org/jetbrains/kotlinx/dataframe/codeGen/NameNormalizer$Companion {
49774978
}
49784979

4980+
public abstract interface class org/jetbrains/kotlinx/dataframe/codeGen/TypeCastGenerator {
4981+
public abstract fun addCastTo (Ljava/lang/String;)Ljava/lang/String;
4982+
public fun invoke (Ljava/lang/String;)Ljava/lang/String;
4983+
}
4984+
4985+
public final class org/jetbrains/kotlinx/dataframe/codeGen/TypeCastGenerator$DataFrameApi : org/jetbrains/kotlinx/dataframe/codeGen/TypeCastGenerator {
4986+
public static final field Companion Lorg/jetbrains/kotlinx/dataframe/codeGen/TypeCastGenerator$DataFrameApi$Companion;
4987+
public synthetic fun <init> ([Ljava/lang/String;Lkotlin/jvm/internal/DefaultConstructorMarker;)V
4988+
public fun addCastTo (Ljava/lang/String;)Ljava/lang/String;
4989+
public final fun getTypes ()[Ljava/lang/String;
4990+
}
4991+
4992+
public final class org/jetbrains/kotlinx/dataframe/codeGen/TypeCastGenerator$DataFrameApi$Companion {
4993+
public final fun invoke ([Ljava/lang/String;)Lorg/jetbrains/kotlinx/dataframe/codeGen/TypeCastGenerator;
4994+
}
4995+
4996+
public final class org/jetbrains/kotlinx/dataframe/codeGen/TypeCastGenerator$Empty : org/jetbrains/kotlinx/dataframe/codeGen/TypeCastGenerator {
4997+
public static final field INSTANCE Lorg/jetbrains/kotlinx/dataframe/codeGen/TypeCastGenerator$Empty;
4998+
public fun addCastTo (Ljava/lang/String;)Ljava/lang/String;
4999+
public fun invoke (Ljava/lang/String;)Ljava/lang/String;
5000+
}
5001+
49795002
public final class org/jetbrains/kotlinx/dataframe/codeGen/ValidFieldName {
49805003
public static final field Companion Lorg/jetbrains/kotlinx/dataframe/codeGen/ValidFieldName$Companion;
49815004
public synthetic fun <init> (Ljava/lang/String;ZLkotlin/jvm/internal/DefaultConstructorMarker;)V
@@ -5850,7 +5873,7 @@ public final class org/jetbrains/kotlinx/dataframe/impl/codeGen/CodeGeneratorImp
58505873
public static final fun quoteIfNeeded (Ljava/lang/String;)Ljava/lang/String;
58515874
public static final fun toStandaloneSnippet (Ljava/lang/String;Ljava/lang/String;Ljava/util/List;)Ljava/lang/String;
58525875
public static final fun toStandaloneSnippet (Lorg/jetbrains/kotlinx/dataframe/codeGen/CodeGenResult;Ljava/lang/String;Ljava/util/List;)Ljava/lang/String;
5853-
public static final fun toStandaloneSnippet (Lorg/jetbrains/kotlinx/dataframe/codeGen/CodeWithConverter;Ljava/lang/String;Ljava/util/List;)Ljava/lang/String;
5876+
public static final fun toStandaloneSnippet (Lorg/jetbrains/kotlinx/dataframe/codeGen/CodeWithTypeCastGenerator;Ljava/lang/String;Ljava/util/List;)Ljava/lang/String;
58545877
}
58555878

58565879
public abstract interface class org/jetbrains/kotlinx/dataframe/impl/codeGen/DfReadResult {

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

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -99,3 +99,5 @@ public fun <C> TransformableColumnSet<*>.cast(): TransformableColumnSet<C> = thi
9999
public fun <C> TransformableSingleColumn<*>.cast(): TransformableSingleColumn<C> = this as TransformableSingleColumn<C>
100100

101101
public fun <C> ColumnReference<*>.cast(): ColumnReference<C> = this as ColumnReference<C>
102+
103+
public fun <T, G> GroupBy<*, *>.cast(): GroupBy<T, G> = this as GroupBy<T, G>

core/src/main/kotlin/org/jetbrains/kotlinx/dataframe/codeGen/CodeGenerator.kt

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@ public enum class InterfaceGenerationMode {
1515
None,
1616
}
1717

18-
public data class CodeGenResult(val code: CodeWithConverter, val newMarkers: List<Marker>)
18+
public data class CodeGenResult(val code: CodeWithTypeCastGenerator, val newMarkers: List<Marker>)
1919

2020
public interface CodeGenerator : ExtensionsCodeGenerator {
2121

@@ -37,7 +37,7 @@ public interface CodeGenerator : ExtensionsCodeGenerator {
3737
interfaceMode: InterfaceGenerationMode,
3838
extensionProperties: Boolean,
3939
readDfMethod: DefaultReadDfMethod? = null,
40-
): CodeWithConverter
40+
): CodeWithTypeCastGenerator
4141

4242
public companion object {
4343
public fun create(useFqNames: Boolean = true): CodeGenerator =
@@ -54,7 +54,7 @@ internal fun CodeGenerator.generate(
5454
markerClass: KClass<*>,
5555
interfaceMode: InterfaceGenerationMode,
5656
extensionProperties: Boolean,
57-
): CodeWithConverter =
57+
): CodeWithTypeCastGenerator =
5858
generate(
5959
MarkersExtractor.get(markerClass),
6060
interfaceMode,
@@ -64,4 +64,4 @@ internal fun CodeGenerator.generate(
6464
public inline fun <reified T> CodeGenerator.generate(
6565
interfaceMode: InterfaceGenerationMode,
6666
extensionProperties: Boolean,
67-
): CodeWithConverter = generate(T::class, interfaceMode, extensionProperties)
67+
): CodeWithTypeCastGenerator = generate(T::class, interfaceMode, extensionProperties)

core/src/main/kotlin/org/jetbrains/kotlinx/dataframe/codeGen/CodeWithConverter.kt

Lines changed: 0 additions & 30 deletions
This file was deleted.
Lines changed: 81 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,81 @@
1+
package org.jetbrains.kotlinx.dataframe.codeGen
2+
3+
import org.jetbrains.kotlinx.dataframe.api.cast
4+
5+
/**
6+
* Class representing generated code declarations for a [Marker].
7+
*
8+
* @param declarations The generated code.
9+
* @param typeCastGenerator Optional [TypeCastGenerator] for the [Marker], see [TypeCastGenerator] for
10+
* more information.
11+
*/
12+
public data class CodeWithTypeCastGenerator(
13+
val declarations: Code,
14+
val typeCastGenerator: TypeCastGenerator = TypeCastGenerator.Empty,
15+
) {
16+
17+
public companion object {
18+
public const val EMPTY_DECLARATIONS: Code = ""
19+
20+
@Deprecated("", ReplaceWith("TypeCastGenerator.Empty"))
21+
public val EMPTY_CONVERTER: (Expression) -> Code = { it }
22+
public val EMPTY: CodeWithTypeCastGenerator = CodeWithTypeCastGenerator(EMPTY_DECLARATIONS)
23+
}
24+
25+
val hasDeclarations: Boolean get() = declarations.isNotBlank()
26+
27+
val hasCaster: Boolean
28+
get() = typeCastGenerator !is TypeCastGenerator.Empty &&
29+
typeCastGenerator("it").trim() != "it"
30+
31+
public fun declarationsWithCastExpression(expression: Expression): Code =
32+
when {
33+
!hasCaster -> declarations
34+
!hasDeclarations -> typeCastGenerator(expression)
35+
else -> declarations + "\n" + typeCastGenerator(expression)
36+
}
37+
}
38+
39+
public typealias Code = String
40+
public typealias Expression = String
41+
42+
/**
43+
* A [TypeCastGenerator] can generate [Code] given an [Expression] that casts or converts
44+
* it to a predefined target type.
45+
*
46+
* To create a [TypeCastGenerator] that, for instance, casts everything you pass to [Any?][Any]:
47+
* ```kt
48+
* val myCastGenerator = TypeCastGenerator { expression -> "(\$expression as Any?)" }
49+
*
50+
* myCastGenerator.addCastTo("myVariable") == "(myVariable as Any?)"
51+
* ```
52+
*
53+
* @see TypeCastGenerator.Empty
54+
* @see TypeCastGenerator.DataFrameApi
55+
*/
56+
public fun interface TypeCastGenerator {
57+
public fun addCastTo(expression: Expression): Code
58+
59+
public operator fun invoke(expression: Expression): Code = addCastTo(expression)
60+
61+
public object Empty : TypeCastGenerator by (TypeCastGenerator { it })
62+
63+
/**
64+
* [TypeCastGenerator] that uses the [cast] functions of the DataFrame API.
65+
*
66+
* NOTE: This generator assumes there's a `.cast<>()` function available that can be called on your
67+
* specific [Expression]. It will cause runtime errors when there isn't one.
68+
*/
69+
public class DataFrameApi private constructor(public val types: Array<out String>) : TypeCastGenerator {
70+
override fun addCastTo(expression: Expression): Code =
71+
if (types.isEmpty()) {
72+
"$expression.cast()"
73+
} else {
74+
"$expression.cast<${types.joinToString()}>()"
75+
}
76+
77+
public companion object {
78+
public operator fun invoke(vararg types: String): TypeCastGenerator = DataFrameApi(types)
79+
}
80+
}
81+
}

core/src/main/kotlin/org/jetbrains/kotlinx/dataframe/codeGen/ExtensionsCodeGenerator.kt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@ import org.jetbrains.kotlinx.dataframe.impl.codeGen.ExtensionsCodeGeneratorImpl
44
import org.jetbrains.kotlinx.dataframe.impl.codeGen.ShortNames
55

66
public interface ExtensionsCodeGenerator {
7-
public fun generate(marker: IsolatedMarker): CodeWithConverter
7+
public fun generate(marker: IsolatedMarker): CodeWithTypeCastGenerator
88

99
public companion object {
1010
public fun create(): ExtensionsCodeGenerator = ExtensionsCodeGeneratorImpl(ShortNames)

0 commit comments

Comments
 (0)