Skip to content

Commit 0500cd0

Browse files
committed
simplifying GroupBy.toDataFrame implementation to ease extensibility
1 parent d8635b0 commit 0500cd0

File tree

2 files changed

+15
-27
lines changed

2 files changed

+15
-27
lines changed

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

Lines changed: 4 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,6 @@ import org.jetbrains.kotlinx.dataframe.annotations.Interpretable
1111
import org.jetbrains.kotlinx.dataframe.annotations.Refine
1212
import org.jetbrains.kotlinx.dataframe.columns.FrameColumn
1313
import org.jetbrains.kotlinx.dataframe.columns.toColumnSet
14-
import org.jetbrains.kotlinx.dataframe.impl.GroupByInternal
1514
import org.jetbrains.kotlinx.dataframe.impl.aggregation.PivotImpl
1615
import org.jetbrains.kotlinx.dataframe.impl.api.getPivotColumnPaths
1716
import org.jetbrains.kotlinx.dataframe.impl.api.groupByImpl
@@ -85,24 +84,17 @@ public interface GroupBy<out T, out G> : Grouped<G> {
8584

8685
public fun filter(predicate: GroupedRowFilter<T, G>): GroupBy<T, G>
8786

87+
@Refine
88+
@Interpretable("GroupByToDataFrame")
89+
public fun toDataFrame(groupedColumnName: String? = null): DataFrame<T>
90+
8891
public data class Entry<T, G>(val key: DataRow<T>, val group: DataFrame<G>)
8992

9093
public companion object {
9194
internal val groupedColumnAccessor = column<AnyFrame>("group")
9295
}
9396
}
9497

95-
@Refine
96-
@Interpretable("GroupByToDataFrame")
97-
public fun <T, G> GroupBy<T, G>.toDataFrame(groupedColumnName: String? = null): DataFrame<T> =
98-
if (groupedColumnName == null || groupedColumnName == groups.name()) {
99-
internal().df
100-
} else {
101-
internal().df.rename(groups).into(groupedColumnName)
102-
}
103-
104-
internal fun <T, G> GroupBy<T, G>.internal(): GroupByInternal<T, G> = this as GroupByInternal<T, G>
105-
10698
public interface Grouped<out T> : Aggregatable<T>
10799

108100
public class ReducedGroupBy<T, G>(

core/src/main/kotlin/org/jetbrains/kotlinx/dataframe/impl/GroupByImpl.kt

Lines changed: 11 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -13,10 +13,11 @@ import org.jetbrains.kotlinx.dataframe.api.concat
1313
import org.jetbrains.kotlinx.dataframe.api.convert
1414
import org.jetbrains.kotlinx.dataframe.api.getColumn
1515
import org.jetbrains.kotlinx.dataframe.api.getColumnsWithPaths
16+
import org.jetbrains.kotlinx.dataframe.api.into
1617
import org.jetbrains.kotlinx.dataframe.api.isColumnGroup
1718
import org.jetbrains.kotlinx.dataframe.api.minus
1819
import org.jetbrains.kotlinx.dataframe.api.pathOf
19-
import org.jetbrains.kotlinx.dataframe.api.toDataFrame
20+
import org.jetbrains.kotlinx.dataframe.api.rename
2021
import org.jetbrains.kotlinx.dataframe.columns.FrameColumn
2122
import org.jetbrains.kotlinx.dataframe.impl.aggregation.AggregatableInternal
2223
import org.jetbrains.kotlinx.dataframe.impl.aggregation.GroupByReceiverImpl
@@ -30,26 +31,14 @@ import org.jetbrains.kotlinx.dataframe.ncol
3031
import org.jetbrains.kotlinx.dataframe.nrow
3132
import org.jetbrains.kotlinx.dataframe.values
3233

33-
/**
34-
* Internal implementation interface for [GroupBy].
35-
*
36-
* While [df] should be hidden in the [GroupBy] DSL, it must be accessible when running
37-
* [GroupBy.toDataFrame].
38-
*
39-
* This interface is public to allow Kandy to implement it.
40-
*/
41-
public interface GroupByInternal<T, G> : GroupBy<T, G> {
42-
public val df: DataFrame<T>
43-
}
44-
4534
/**
4635
* @property df DataFrame containing [groups] column and key columns. Represents GroupBy.
4736
*/
4837
internal class GroupByImpl<T, G>(
49-
override val df: DataFrame<T>,
38+
val df: DataFrame<T>,
5039
override val groups: FrameColumn<G>,
5140
internal val keyColumnsInGroups: ColumnsSelector<G, *>,
52-
) : GroupByInternal<T, G>,
41+
) : GroupBy<T, G>,
5342
AggregatableInternal<G> {
5443

5544
override val keys by lazy { df - groups }
@@ -69,6 +58,13 @@ internal class GroupByImpl<T, G>(
6958
}
7059
return df[indices].asGroupBy(groups)
7160
}
61+
62+
override fun toDataFrame(groupedColumnName: String?): DataFrame<T> =
63+
if (groupedColumnName == null || groupedColumnName == groups.name()) {
64+
df
65+
} else {
66+
df.rename(groups).into(groupedColumnName)
67+
}
7268
}
7369

7470
internal fun <T, G, R> aggregateGroupBy(

0 commit comments

Comments
 (0)