@@ -5,6 +5,8 @@ import org.jetbrains.kotlinx.dataframe.ColumnsSelector
5
5
import org.jetbrains.kotlinx.dataframe.DataFrame
6
6
import org.jetbrains.kotlinx.dataframe.DataRow
7
7
import org.jetbrains.kotlinx.dataframe.annotations.AccessApiOverload
8
+ import org.jetbrains.kotlinx.dataframe.annotations.Interpretable
9
+ import org.jetbrains.kotlinx.dataframe.annotations.Refine
8
10
import org.jetbrains.kotlinx.dataframe.columns.ColumnAccessor
9
11
import org.jetbrains.kotlinx.dataframe.columns.ColumnPath
10
12
import org.jetbrains.kotlinx.dataframe.columns.ColumnReference
@@ -16,6 +18,7 @@ import kotlin.reflect.KProperty
16
18
import kotlin.reflect.KType
17
19
import kotlin.reflect.typeOf
18
20
21
+ @Interpretable(" Merge0" )
19
22
public fun <T , C > DataFrame<T>.merge (selector : ColumnsSelector <T , C >): Merge <T , C , List <C >> =
20
23
Merge (this , selector, false , { it }, typeOf<Any ?>(), Infer .Type )
21
24
@@ -44,19 +47,51 @@ public data class Merge<T, C, R>(
44
47
internal val infer : Infer ,
45
48
)
46
49
47
- public fun <T , C , R > Merge <T , C , R >.notNull (): Merge <T , C , R > = copy(notNull = true )
50
+ public class MergeWithTransform <T , C , R >(
51
+ internal val df : DataFrame <T >,
52
+ internal val selector : ColumnsSelector <T , C >,
53
+ internal val notNull : Boolean ,
54
+ internal val transform : DataRow <T >.(List <C >) -> R ,
55
+ internal val resultType : KType ,
56
+ internal val infer : Infer ,
57
+ )
58
+
59
+ @Interpretable(" MergeId" )
60
+ public fun <T , C , R > Merge <T , C , R >.notNull (): Merge <T , C & Any , R > = copy(notNull = true ) as Merge <T , C & Any , R >
48
61
62
+ @JvmName(" notNullList" )
63
+ @Interpretable(" MergeId" )
64
+ public fun <T , C , R > Merge <T , C , List <R >>.notNull (): Merge <T , C & Any , List <R & Any >> =
65
+ copy(notNull = true ) as Merge <T , C & Any , List <R & Any >>
66
+
67
+ @Refine
68
+ @Interpretable(" MergeInto0" )
69
+ public fun <T , C , R > MergeWithTransform <T , C , R >.into (columnName : String ): DataFrame <T > = into(pathOf(columnName))
70
+
71
+ @Refine
72
+ @Interpretable(" MergeInto0" )
49
73
public fun <T , C , R > Merge <T , C , R >.into (columnName : String ): DataFrame <T > = into(pathOf(columnName))
50
74
51
75
@AccessApiOverload
52
- public fun <T , C , R > Merge <T , C , R >.into (column : ColumnAccessor <* >): DataFrame <T > = into(column.path())
76
+ public inline fun <T , C , reified R > Merge <T , C , R >.into (column : ColumnAccessor <* >): DataFrame <T > = into(column.path())
77
+
78
+ @AccessApiOverload
79
+ public inline fun <T , C , reified R > MergeWithTransform <T , C , R >.into (column : ColumnAccessor <* >): DataFrame <T > =
80
+ into(column.path())
53
81
54
82
public fun <T , C , R > Merge <T , C , R >.intoList (): List <R > =
55
83
df.select(selector).rows().map { transform(it, it.values() as List <C >) }
56
84
57
- public fun <T , C , R > Merge <T , C , R >.into (path : ColumnPath ): DataFrame <T > {
85
+ public fun <T , C , R > MergeWithTransform <T , C , R >.intoList (): List <R > =
86
+ df.select(selector).rows().map { transform(it, it.values() as List <C >) }
87
+
88
+ public fun <T , C , R > MergeWithTransform <T , C , R >.into (path : ColumnPath ): DataFrame <T > {
58
89
// If target path exists, merge into temp path
59
- val mergePath = if (df.getColumnOrNull(path) != null ) pathOf(nameGenerator().addUnique(" temp" )) else path
90
+ val mergePath = if (df.getColumnOrNull(path) != null ) {
91
+ pathOf(df.nameGenerator().addUnique(" temp" ))
92
+ } else {
93
+ path
94
+ }
60
95
61
96
// move columns into group
62
97
val grouped = df.move(selector).under { mergePath }
@@ -82,16 +117,21 @@ public fun <T, C, R> Merge<T, C, R>.into(path: ColumnPath): DataFrame<T> {
82
117
return res
83
118
}
84
119
85
- public fun <T , C , R > Merge <T , C , R >.asStrings (): Merge <T , C , String > = by(" , " )
120
+ public fun <T , C , R > Merge <T , C , R >.into (path : ColumnPath ): DataFrame <T > =
121
+ MergeWithTransform (df, selector, notNull, transform, resultType, infer).into(path)
122
+
123
+ @Interpretable(" MergeId" )
124
+ public fun <T , C , R > Merge <T , C , R >.asStrings (): MergeWithTransform <T , C , String > = by(" , " )
86
125
126
+ @Interpretable(" MergeBy0" )
87
127
public fun <T , C , R > Merge <T , C , R >.by (
88
128
separator : CharSequence = ", ",
89
129
prefix : CharSequence = "",
90
130
postfix : CharSequence = "",
91
131
limit : Int = -1,
92
132
truncated : CharSequence = "...",
93
- ): Merge <T , C , String > =
94
- Merge (
133
+ ): MergeWithTransform <T , C , String > =
134
+ MergeWithTransform (
95
135
df = df,
96
136
selector = selector,
97
137
notNull = notNull,
@@ -108,7 +148,11 @@ public fun <T, C, R> Merge<T, C, R>.by(
108
148
infer = Infer .Nulls ,
109
149
)
110
150
151
+ @Interpretable(" MergeBy1" )
111
152
public inline fun <T , C , R , reified V > Merge <T , C , R >.by (
112
153
infer : Infer = Infer .Nulls ,
113
154
crossinline transform : DataRow <T >.(R ) -> V ,
114
- ): Merge <T , C , V > = Merge (df, selector, notNull, { transform(this @by.transform(this , it)) }, typeOf<V >(), infer)
155
+ ): MergeWithTransform <T , C , V > =
156
+ MergeWithTransform (df, selector, notNull, {
157
+ transform(this @by.transform(this , it))
158
+ }, typeOf<V >(), infer)
0 commit comments