Skip to content

Commit 560a78d

Browse files
committed
proof-of-concept deprecation of GroupedDataRow, GroupWithKey, and GroupBy.Entry in favor of GroupByEntry
1 parent bfc4a25 commit 560a78d

File tree

3 files changed

+58
-5
lines changed

3 files changed

+58
-5
lines changed

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

Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,9 @@ package org.jetbrains.kotlinx.dataframe.api
22

33
import org.jetbrains.kotlinx.dataframe.AnyColumnReference
44
import org.jetbrains.kotlinx.dataframe.AnyFrame
5+
import org.jetbrains.kotlinx.dataframe.BuildConfig
56
import org.jetbrains.kotlinx.dataframe.ColumnsSelector
7+
import org.jetbrains.kotlinx.dataframe.DataColumn
68
import org.jetbrains.kotlinx.dataframe.DataFrame
79
import org.jetbrains.kotlinx.dataframe.DataRow
810
import org.jetbrains.kotlinx.dataframe.Selector
@@ -13,6 +15,7 @@ import org.jetbrains.kotlinx.dataframe.annotations.Refine
1315
import org.jetbrains.kotlinx.dataframe.columns.FrameColumn
1416
import org.jetbrains.kotlinx.dataframe.columns.toColumnSet
1517
import org.jetbrains.kotlinx.dataframe.impl.aggregation.PivotImpl
18+
import org.jetbrains.kotlinx.dataframe.impl.api.GroupByEntryImpl
1619
import org.jetbrains.kotlinx.dataframe.impl.api.getPivotColumnPaths
1720
import org.jetbrains.kotlinx.dataframe.impl.api.groupByImpl
1821
import org.jetbrains.kotlinx.dataframe.util.DEPRECATED_ACCESS_API
@@ -71,17 +74,46 @@ public fun <T> Pivot<T>.groupByOther(): PivotGroupBy<T> {
7174

7275
// endregion
7376

77+
@Deprecated("Replaced by GroupByEntrySelector")
7478
public typealias GroupedRowSelector<T, G, R> = GroupedDataRow<T, G>.(GroupedDataRow<T, G>) -> R
7579

80+
@Deprecated("Replaced by GroupByEntryFilter")
7681
public typealias GroupedRowFilter<T, G> = GroupedRowSelector<T, G, Boolean>
7782

83+
@Deprecated("Replaced by GroupByEntry")
7884
public interface GroupedDataRow<out T, out G> : DataRow<T> {
7985

8086
public fun group(): DataFrame<G>
8187
}
8288

8389
public val <T, G> GroupedDataRow<T, G>.group: DataFrame<G> get() = group()
8490

91+
/**
92+
* Represents a single combination of keys+group in a [GroupBy] instance.
93+
*
94+
* `this` is a [DataRow] representing the keys of the current group, while the [group()][group]
95+
* function points to the group that corresponds to the keys of this entry.
96+
*
97+
* For example:
98+
* ```kotlin
99+
* df.groupBy { name and age }.forEachEntry { // this|it: GroupByEntry<T, G> ->
100+
* println("There are \${group().rowsCount()} instances of \$name")
101+
* }
102+
* ```
103+
*/
104+
public interface GroupByEntry<out T, out G> : DataRow<T> {
105+
106+
/** Returns the [DataFrame] representing the group that corresponds to the keys of this entry. */
107+
public fun group(): DataFrame<G>
108+
109+
// TODO?
110+
public fun keys(): Map<String, Any?> = this.toMap()
111+
}
112+
113+
public typealias GroupByEntrySelector<T, G, R> = GroupByEntry<T, G>.(GroupByEntry<T, G>) -> R
114+
public typealias GroupByEntryFilter<T, G> = GroupByEntrySelector<T, G, Boolean>
115+
116+
@Deprecated("Replaced by GroupByEntry")
85117
public data class GroupWithKey<T, G>(val key: DataRow<T>, val group: DataFrame<G>)
86118

87119
public interface GroupBy<out T, out G> : Grouped<G> {
@@ -92,12 +124,14 @@ public interface GroupBy<out T, out G> : Grouped<G> {
92124

93125
public fun <R> updateGroups(transform: Selector<DataFrame<G>, DataFrame<R>>): GroupBy<T, R>
94126

127+
@Deprecated("Replaced by filterEntries")
95128
public fun filter(predicate: GroupedRowFilter<T, G>): GroupBy<T, G>
96129

97130
@Refine
98131
@Interpretable("GroupByToDataFrame")
99132
public fun toDataFrame(groupedColumnName: String? = null): DataFrame<T>
100133

134+
@Deprecated("")
101135
public data class Entry<T, G>(val key: DataRow<T>, val group: DataFrame<G>)
102136

103137
public companion object {

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

Lines changed: 12 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -7,8 +7,10 @@ import org.jetbrains.kotlinx.dataframe.Selector
77
import org.jetbrains.kotlinx.dataframe.aggregation.AggregateGroupedBody
88
import org.jetbrains.kotlinx.dataframe.aggregation.NamedValue
99
import org.jetbrains.kotlinx.dataframe.api.GroupBy
10+
import org.jetbrains.kotlinx.dataframe.api.GroupByEntryFilter
1011
import org.jetbrains.kotlinx.dataframe.api.GroupedRowFilter
1112
import org.jetbrains.kotlinx.dataframe.api.asGroupBy
13+
import org.jetbrains.kotlinx.dataframe.api.cast
1214
import org.jetbrains.kotlinx.dataframe.api.concat
1315
import org.jetbrains.kotlinx.dataframe.api.convert
1416
import org.jetbrains.kotlinx.dataframe.api.getColumn
@@ -18,11 +20,13 @@ import org.jetbrains.kotlinx.dataframe.api.isColumnGroup
1820
import org.jetbrains.kotlinx.dataframe.api.pathOf
1921
import org.jetbrains.kotlinx.dataframe.api.remove
2022
import org.jetbrains.kotlinx.dataframe.api.rename
23+
import org.jetbrains.kotlinx.dataframe.api.with
2124
import org.jetbrains.kotlinx.dataframe.columns.FrameColumn
2225
import org.jetbrains.kotlinx.dataframe.impl.aggregation.AggregatableInternal
2326
import org.jetbrains.kotlinx.dataframe.impl.aggregation.GroupByReceiverImpl
2427
import org.jetbrains.kotlinx.dataframe.impl.api.AggregatedPivot
2528
import org.jetbrains.kotlinx.dataframe.impl.api.ColumnToInsert
29+
import org.jetbrains.kotlinx.dataframe.impl.api.GroupByEntryImpl
2630
import org.jetbrains.kotlinx.dataframe.impl.api.GroupedDataRowImpl
2731
import org.jetbrains.kotlinx.dataframe.impl.api.insertImpl
2832
import org.jetbrains.kotlinx.dataframe.impl.api.removeImpl
@@ -41,29 +45,32 @@ internal class GroupByImpl<T, G>(
4145
) : GroupBy<T, G>,
4246
AggregatableInternal<G> {
4347

44-
override val keys by lazy { df.remove(groups) }
48+
override val keys by lazy { df.remove { groups } }
4549

50+
@Suppress("UNCHECKED_CAST")
4651
override fun <R> updateGroups(transform: Selector<DataFrame<G>, DataFrame<R>>) =
47-
df.convert(groups) { transform(it, it) }.asGroupBy(groups.name()) as GroupBy<T, R>
52+
df.convert { groups }.with { transform(it, it) }
53+
.asGroupBy(groups.name()) as GroupBy<T, R>
4854

4955
override fun toString() = df.toString()
5056

5157
override fun remainingColumnsSelector(): ColumnsSelector<*, *> =
5258
keyColumnsInGroups.toColumnSet().let { groupCols -> { all().except(groupCols) } }
5359

60+
@Deprecated("Replaced by filterEntries")
5461
override fun filter(predicate: GroupedRowFilter<T, G>): GroupBy<T, G> {
5562
val indices = (0 until df.nrow).filter {
56-
val row = GroupedDataRowImpl(df.get(it), groups)
63+
val row = GroupedDataRowImpl(df[it], groups)
5764
predicate(row, row)
5865
}
59-
return df[indices].asGroupBy(groups)
66+
return df[indices].asGroupBy(groups.name()).cast()
6067
}
6168

6269
override fun toDataFrame(groupedColumnName: String?): DataFrame<T> =
6370
if (groupedColumnName == null || groupedColumnName == groups.name()) {
6471
df
6572
} else {
66-
df.rename(groups).into(groupedColumnName)
73+
df.rename { groups }.into(groupedColumnName)
6774
}
6875
}
6976

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

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ import org.jetbrains.kotlinx.dataframe.ColumnsSelector
44
import org.jetbrains.kotlinx.dataframe.DataFrame
55
import org.jetbrains.kotlinx.dataframe.DataRow
66
import org.jetbrains.kotlinx.dataframe.api.GroupBy
7+
import org.jetbrains.kotlinx.dataframe.api.GroupByEntry
78
import org.jetbrains.kotlinx.dataframe.api.GroupedDataRow
89
import org.jetbrains.kotlinx.dataframe.api.cast
910
import org.jetbrains.kotlinx.dataframe.api.getColumnsWithPaths
@@ -13,14 +14,25 @@ import org.jetbrains.kotlinx.dataframe.api.pathOf
1314
import org.jetbrains.kotlinx.dataframe.columns.FrameColumn
1415
import org.jetbrains.kotlinx.dataframe.impl.GroupByImpl
1516
import org.jetbrains.kotlinx.dataframe.impl.nameGenerator
17+
import org.jetbrains.kotlinx.dataframe.io.renderToString
1618

19+
@Deprecated("Replaced by GroupByEntryImpl")
1720
internal class GroupedDataRowImpl<T, G>(private val row: DataRow<T>, private val frameCol: FrameColumn<G>) :
1821
GroupedDataRow<T, G>,
1922
DataRow<T> by row {
2023

2124
override fun group() = frameCol[row.index()]
2225
}
2326

27+
@PublishedApi
28+
internal class GroupByEntryImpl<T, G>(private val keysRow: DataRow<T>, internal val allGroups: FrameColumn<G>) :
29+
GroupByEntry<T, G>,
30+
DataRow<T> by keysRow {
31+
override fun group() = allGroups[keysRow.index()]
32+
33+
override fun toString(): String = "GroupByEntry(keysRow=${renderToString()}, group()=${group()})"
34+
}
35+
2436
@PublishedApi
2537
internal fun <T> DataFrame<T>.groupByImpl(moveToTop: Boolean, columns: ColumnsSelector<T, *>): GroupBy<T, T> {
2638
val nameGenerator = nameGenerator(GroupBy.groupedColumnAccessor.name())

0 commit comments

Comments
 (0)