Skip to content

Commit 4439015

Browse files
[issue-1430] feat: update aggregation functions for consistency and safety
The `minFor`, `medianFor`, and `percentileFor` functions were updated to use the `invoke` pattern for Aggregators, eliminating unchecked casts and enhancing consistency with `maxFor`. All changes passed tests without errors, and the solution has been submitted for review.
1 parent 7772835 commit 4439015

File tree

3 files changed

+8
-40
lines changed

3 files changed

+8
-40
lines changed

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

Lines changed: 3 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -141,11 +141,7 @@ public fun <T> DataFrame<T>.median(skipNaN: Boolean = skipNaNDefault): DataRow<T
141141
public fun <T, C : Comparable<*>?> DataFrame<T>.medianFor(
142142
skipNaN: Boolean = skipNaNDefault,
143143
columns: ColumnsForAggregateSelector<T, C>,
144-
): DataRow<T> {
145-
@Suppress("UNCHECKED_CAST")
146-
return Aggregators.medianCommon<Comparable<Any>?>(skipNaN)
147-
.aggregateFor(this, columns as ColumnsForAggregateSelector<T, Comparable<Any>?>)
148-
}
144+
): DataRow<T> = Aggregators.median.invoke(skipNaN).aggregateFor(this, columns)
149145

150146
public fun <T> DataFrame<T>.medianFor(vararg columns: String, skipNaN: Boolean = skipNaNDefault): DataRow<T> =
151147
medianFor(skipNaN) { columns.toComparableColumns() }
@@ -336,11 +332,7 @@ public fun <T> Grouped<T>.median(skipNaN: Boolean = skipNaNDefault): DataFrame<T
336332
public fun <T, C : Comparable<*>?> Grouped<T>.medianFor(
337333
skipNaN: Boolean = skipNaNDefault,
338334
columns: ColumnsForAggregateSelector<T, C>,
339-
): DataFrame<T> {
340-
@Suppress("UNCHECKED_CAST")
341-
return Aggregators.medianCommon<Comparable<Any>?>(skipNaN)
342-
.aggregateFor(this, columns as ColumnsForAggregateSelector<T, Comparable<Any>?>)
343-
}
335+
): DataFrame<T> = Aggregators.median.invoke(skipNaN).aggregateFor(this, columns)
344336

345337
public fun <T> Grouped<T>.medianFor(vararg columns: String): DataFrame<T> = medianFor { columns.toComparableColumns() }
346338

@@ -513,11 +505,7 @@ public fun <T, C : Comparable<*>?> PivotGroupBy<T>.medianFor(
513505
separate: Boolean = false,
514506
skipNaN: Boolean = skipNaNDefault,
515507
columns: ColumnsForAggregateSelector<T, C>,
516-
): DataFrame<T> {
517-
@Suppress("UNCHECKED_CAST")
518-
return Aggregators.medianCommon<Comparable<Any>?>(skipNaN)
519-
.aggregateFor(this, separate, columns as ColumnsForAggregateSelector<T, Comparable<Any>?>)
520-
}
508+
): DataFrame<T> = Aggregators.median.invoke(skipNaN).aggregateFor(this, separate, columns)
521509

522510
public fun <T> PivotGroupBy<T>.medianFor(
523511
vararg columns: String,

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

Lines changed: 2 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -84,11 +84,7 @@ public fun <T> DataFrame<T>.min(skipNaN: Boolean = skipNaNDefault): DataRow<T> =
8484
public fun <T, C : Comparable<*>?> DataFrame<T>.minFor(
8585
skipNaN: Boolean = skipNaNDefault,
8686
columns: ColumnsForAggregateSelector<T, C>,
87-
): DataRow<T> {
88-
@Suppress("UNCHECKED_CAST")
89-
return Aggregators.min<Comparable<Any>?>(skipNaN)
90-
.aggregateFor(this, columns as ColumnsForAggregateSelector<T, Comparable<Any>?>)
91-
}
87+
): DataRow<T> = Aggregators.min.invoke(skipNaN).aggregateFor(this, columns)
9288

9389
public fun <T> DataFrame<T>.minFor(vararg columns: String, skipNaN: Boolean = skipNaNDefault): DataRow<T> =
9490
minFor(skipNaN) { columns.toComparableColumns() }
@@ -219,11 +215,7 @@ public fun <T> Grouped<T>.min(skipNaN: Boolean = skipNaNDefault): DataFrame<T> =
219215
public fun <T, C : Comparable<*>?> Grouped<T>.minFor(
220216
skipNaN: Boolean = skipNaNDefault,
221217
columns: ColumnsForAggregateSelector<T, C>,
222-
): DataFrame<T> {
223-
@Suppress("UNCHECKED_CAST")
224-
return Aggregators.min<Comparable<Any>?>(skipNaN)
225-
.aggregateFor(this, columns as ColumnsForAggregateSelector<T, Comparable<Any>?>)
226-
}
218+
): DataFrame<T> = Aggregators.min.invoke(skipNaN).aggregateFor(this, columns)
227219

228220
public fun <T> Grouped<T>.minFor(vararg columns: String, skipNaN: Boolean = skipNaNDefault): DataFrame<T> =
229221
minFor(skipNaN) { columns.toComparableColumns() }

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

Lines changed: 3 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -156,11 +156,7 @@ public fun <T, C : Comparable<*>?> DataFrame<T>.percentileFor(
156156
percentile: Double,
157157
skipNaN: Boolean = skipNaNDefault,
158158
columns: ColumnsForAggregateSelector<T, C>,
159-
): DataRow<T> {
160-
@Suppress("UNCHECKED_CAST")
161-
return Aggregators.percentileCommon<Comparable<Any>?>(percentile, skipNaN)
162-
.aggregateFor(this, columns as ColumnsForAggregateSelector<T, Comparable<Any>?>)
163-
}
159+
): DataRow<T> = Aggregators.percentile.invoke(percentile, skipNaN).aggregateFor(this, columns)
164160

165161
public fun <T> DataFrame<T>.percentileFor(
166162
percentile: Double,
@@ -401,11 +397,7 @@ public fun <T, C : Comparable<*>?> Grouped<T>.percentileFor(
401397
percentile: Double,
402398
skipNaN: Boolean = skipNaNDefault,
403399
columns: ColumnsForAggregateSelector<T, C>,
404-
): DataFrame<T> {
405-
@Suppress("UNCHECKED_CAST")
406-
return Aggregators.percentileCommon<Comparable<Any>?>(percentile, skipNaN)
407-
.aggregateFor(this, columns as ColumnsForAggregateSelector<T, Comparable<Any>?>)
408-
}
400+
): DataFrame<T> = Aggregators.percentile.invoke(percentile, skipNaN).aggregateFor(this, columns)
409401

410402
public fun <T> Grouped<T>.percentileFor(percentile: Double, vararg columns: String): DataFrame<T> =
411403
percentileFor(percentile) { columns.toComparableColumns() }
@@ -616,11 +608,7 @@ public fun <T, C : Comparable<*>?> PivotGroupBy<T>.percentileFor(
616608
separate: Boolean = false,
617609
skipNaN: Boolean = skipNaNDefault,
618610
columns: ColumnsForAggregateSelector<T, C>,
619-
): DataFrame<T> {
620-
@Suppress("UNCHECKED_CAST")
621-
return Aggregators.percentileCommon<Comparable<Any>?>(percentile, skipNaN)
622-
.aggregateFor(this, separate, columns as ColumnsForAggregateSelector<T, Comparable<Any>?>)
623-
}
611+
): DataFrame<T> = Aggregators.percentile.invoke(percentile, skipNaN).aggregateFor(this, separate, columns)
624612

625613
public fun <T> PivotGroupBy<T>.percentileFor(
626614
percentile: Double,

0 commit comments

Comments
 (0)