Skip to content

Commit dd13f2e

Browse files
[issue-1430] feat: revert Aggregators.kt and relax type constraints
The changes were successfully implemented by reverting `Aggregators.kt` to its original state while relaxing the type constraints for the `minFor`, `percentileFor`, and `medianFor` functions across their respective files. All modifications were validated with tests, and no errors were reported during the process.
1 parent bf762a8 commit dd13f2e

File tree

5 files changed

+73
-29
lines changed

5 files changed

+73
-29
lines changed

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

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

8993
public fun <T> DataFrame<T>.maxFor(vararg columns: String, skipNaN: Boolean = skipNaNDefault): DataRow<T> =
9094
maxFor(skipNaN) { columns.toComparableColumns() }
@@ -215,7 +219,11 @@ public fun <T> Grouped<T>.max(skipNaN: Boolean = skipNaNDefault): DataFrame<T> =
215219
public fun <T, C : Comparable<*>?> Grouped<T>.maxFor(
216220
skipNaN: Boolean = skipNaNDefault,
217221
columns: ColumnsForAggregateSelector<T, C>,
218-
): DataFrame<T> = Aggregators.max<C>(skipNaN).aggregateFor(this, columns)
222+
): DataFrame<T> {
223+
@Suppress("UNCHECKED_CAST")
224+
return Aggregators.max<Comparable<Any>?>(skipNaN)
225+
.aggregateFor(this, columns as ColumnsForAggregateSelector<T, Comparable<Any>?>)
226+
}
219227

220228
public fun <T> Grouped<T>.maxFor(vararg columns: String, skipNaN: Boolean = skipNaNDefault): DataFrame<T> =
221229
maxFor(skipNaN) { columns.toComparableColumns() }
@@ -392,7 +400,11 @@ public fun <T, R : Comparable<*>?> PivotGroupBy<T>.maxFor(
392400
separate: Boolean = false,
393401
skipNaN: Boolean = skipNaNDefault,
394402
columns: ColumnsForAggregateSelector<T, R>,
395-
): DataFrame<T> = Aggregators.max<R>(skipNaN).aggregateFor(this, separate, columns)
403+
): DataFrame<T> {
404+
@Suppress("UNCHECKED_CAST")
405+
return Aggregators.max<Comparable<Any>?>(skipNaN)
406+
.aggregateFor(this, separate, columns as ColumnsForAggregateSelector<T, Comparable<Any>?>)
407+
}
396408

397409
public fun <T> PivotGroupBy<T>.maxFor(
398410
vararg columns: String,

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

Lines changed: 19 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -138,10 +138,14 @@ public fun <T> DataFrame<T>.median(skipNaN: Boolean = skipNaNDefault): DataRow<T
138138

139139
@Refine
140140
@Interpretable("Median1")
141-
public fun <T, C : Comparable<C & Any>?> DataFrame<T>.medianFor(
141+
public fun <T, C : Comparable<*>?> DataFrame<T>.medianFor(
142142
skipNaN: Boolean = skipNaNDefault,
143143
columns: ColumnsForAggregateSelector<T, C>,
144-
): DataRow<T> = Aggregators.medianCommon<C>(skipNaN).aggregateFor(this, columns)
144+
): DataRow<T> {
145+
@Suppress("UNCHECKED_CAST")
146+
return Aggregators.medianCommon<Comparable<Any>?>(skipNaN)
147+
.aggregateFor(this, columns as ColumnsForAggregateSelector<T, Comparable<Any>?>)
148+
}
145149

146150
public fun <T> DataFrame<T>.medianFor(vararg columns: String, skipNaN: Boolean = skipNaNDefault): DataRow<T> =
147151
medianFor(skipNaN) { columns.toComparableColumns() }
@@ -329,10 +333,14 @@ public fun <T> Grouped<T>.median(skipNaN: Boolean = skipNaNDefault): DataFrame<T
329333

330334
@Refine
331335
@Interpretable("GroupByMedian0")
332-
public fun <T, C : Comparable<C & Any>?> Grouped<T>.medianFor(
336+
public fun <T, C : Comparable<*>?> Grouped<T>.medianFor(
333337
skipNaN: Boolean = skipNaNDefault,
334338
columns: ColumnsForAggregateSelector<T, C>,
335-
): DataFrame<T> = Aggregators.medianCommon<C>(skipNaN).aggregateFor(this, columns)
339+
): DataFrame<T> {
340+
@Suppress("UNCHECKED_CAST")
341+
return Aggregators.medianCommon<Comparable<Any>?>(skipNaN)
342+
.aggregateFor(this, columns as ColumnsForAggregateSelector<T, Comparable<Any>?>)
343+
}
336344

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

@@ -418,7 +426,7 @@ public inline fun <T, G, reified C : Comparable<C & Any>?> GroupBy<T, G>.medianB
418426
public fun <T> Pivot<T>.median(separate: Boolean = false, skipNaN: Boolean = skipNaNDefault): DataRow<T> =
419427
medianFor(separate, skipNaN, intraComparableColumns())
420428

421-
public fun <T, C : Comparable<C & Any>?> Pivot<T>.medianFor(
429+
public fun <T, C : Comparable<*>?> Pivot<T>.medianFor(
422430
separate: Boolean = false,
423431
skipNaN: Boolean = skipNaNDefault,
424432
columns: ColumnsForAggregateSelector<T, C>,
@@ -501,11 +509,15 @@ public inline fun <T, reified C : Comparable<C & Any>?> Pivot<T>.medianBy(
501509
public fun <T> PivotGroupBy<T>.median(separate: Boolean = false, skipNaN: Boolean = skipNaNDefault): DataFrame<T> =
502510
medianFor(separate, skipNaN, intraComparableColumns())
503511

504-
public fun <T, C : Comparable<C & Any>?> PivotGroupBy<T>.medianFor(
512+
public fun <T, C : Comparable<*>?> PivotGroupBy<T>.medianFor(
505513
separate: Boolean = false,
506514
skipNaN: Boolean = skipNaNDefault,
507515
columns: ColumnsForAggregateSelector<T, C>,
508-
): DataFrame<T> = Aggregators.medianCommon<C>(skipNaN).aggregateFor(this, separate, columns)
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+
}
509521

510522
public fun <T> PivotGroupBy<T>.medianFor(
511523
vararg columns: String,

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

Lines changed: 13 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -81,10 +81,14 @@ public fun <T> DataFrame<T>.min(skipNaN: Boolean = skipNaNDefault): DataRow<T> =
8181

8282
@Refine
8383
@Interpretable("Min1")
84-
public fun <T, C : Comparable<C & Any>?> DataFrame<T>.minFor(
84+
public fun <T, C : Comparable<*>?> DataFrame<T>.minFor(
8585
skipNaN: Boolean = skipNaNDefault,
8686
columns: ColumnsForAggregateSelector<T, C>,
87-
): DataRow<T> = Aggregators.min<C>(skipNaN).aggregateFor(this, columns)
87+
): DataRow<T> {
88+
@Suppress("UNCHECKED_CAST")
89+
return Aggregators.min<Comparable<Any>?>(skipNaN)
90+
.aggregateFor(this, columns as ColumnsForAggregateSelector<T, Comparable<Any>?>)
91+
}
8892

8993
public fun <T> DataFrame<T>.minFor(vararg columns: String, skipNaN: Boolean = skipNaNDefault): DataRow<T> =
9094
minFor(skipNaN) { columns.toComparableColumns() }
@@ -212,10 +216,14 @@ public fun <T> Grouped<T>.min(skipNaN: Boolean = skipNaNDefault): DataFrame<T> =
212216

213217
@Refine
214218
@Interpretable("GroupByMin0")
215-
public fun <T, C : Comparable<C & Any>?> Grouped<T>.minFor(
219+
public fun <T, C : Comparable<*>?> Grouped<T>.minFor(
216220
skipNaN: Boolean = skipNaNDefault,
217221
columns: ColumnsForAggregateSelector<T, C>,
218-
): DataFrame<T> = Aggregators.min<C>(skipNaN).aggregateFor(this, columns)
222+
): DataFrame<T> {
223+
@Suppress("UNCHECKED_CAST")
224+
return Aggregators.min<Comparable<Any>?>(skipNaN)
225+
.aggregateFor(this, columns as ColumnsForAggregateSelector<T, Comparable<Any>?>)
226+
}
219227

220228
public fun <T> Grouped<T>.minFor(vararg columns: String, skipNaN: Boolean = skipNaNDefault): DataFrame<T> =
221229
minFor(skipNaN) { columns.toComparableColumns() }
@@ -302,7 +310,7 @@ public inline fun <T, G, reified C : Comparable<C & Any>?> GroupBy<T, G>.minBy(
302310
public fun <T> Pivot<T>.min(separate: Boolean = false, skipNaN: Boolean = skipNaNDefault): DataRow<T> =
303311
delegate { min(separate, skipNaN) }
304312

305-
public fun <T, R : Comparable<R & Any>?> Pivot<T>.minFor(
313+
public fun <T, R : Comparable<*>?> Pivot<T>.minFor(
306314
separate: Boolean = false,
307315
skipNaN: Boolean = skipNaNDefault,
308316
columns: ColumnsForAggregateSelector<T, R>,

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

Lines changed: 19 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -152,11 +152,15 @@ public fun <T> DataFrame<T>.percentile(percentile: Double, skipNaN: Boolean = sk
152152

153153
@Refine
154154
@Interpretable("Percentile1")
155-
public fun <T, C : Comparable<C & Any>?> DataFrame<T>.percentileFor(
155+
public fun <T, C : Comparable<*>?> DataFrame<T>.percentileFor(
156156
percentile: Double,
157157
skipNaN: Boolean = skipNaNDefault,
158158
columns: ColumnsForAggregateSelector<T, C>,
159-
): DataRow<T> = Aggregators.percentileCommon<C>(percentile, skipNaN).aggregateFor(this, columns)
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+
}
160164

161165
public fun <T> DataFrame<T>.percentileFor(
162166
percentile: Double,
@@ -393,11 +397,15 @@ public fun <T> Grouped<T>.percentile(percentile: Double, skipNaN: Boolean = skip
393397

394398
@Refine
395399
@Interpretable("GroupByPercentile0")
396-
public fun <T, C : Comparable<C & Any>?> Grouped<T>.percentileFor(
400+
public fun <T, C : Comparable<*>?> Grouped<T>.percentileFor(
397401
percentile: Double,
398402
skipNaN: Boolean = skipNaNDefault,
399403
columns: ColumnsForAggregateSelector<T, C>,
400-
): DataFrame<T> = Aggregators.percentileCommon<C>(percentile, skipNaN).aggregateFor(this, columns)
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+
}
401409

402410
public fun <T> Grouped<T>.percentileFor(percentile: Double, vararg columns: String): DataFrame<T> =
403411
percentileFor(percentile) { columns.toComparableColumns() }
@@ -500,7 +508,7 @@ public fun <T> Pivot<T>.percentile(
500508
skipNaN: Boolean = skipNaNDefault,
501509
): DataRow<T> = percentileFor(percentile, separate, skipNaN, intraComparableColumns())
502510

503-
public fun <T, C : Comparable<C & Any>?> Pivot<T>.percentileFor(
511+
public fun <T, C : Comparable<*>?> Pivot<T>.percentileFor(
504512
percentile: Double,
505513
separate: Boolean = false,
506514
skipNaN: Boolean = skipNaNDefault,
@@ -603,12 +611,16 @@ public fun <T> PivotGroupBy<T>.percentile(
603611
skipNaN: Boolean = skipNaNDefault,
604612
): DataFrame<T> = percentileFor(percentile, separate, skipNaN, intraComparableColumns())
605613

606-
public fun <T, C : Comparable<C & Any>?> PivotGroupBy<T>.percentileFor(
614+
public fun <T, C : Comparable<*>?> PivotGroupBy<T>.percentileFor(
607615
percentile: Double,
608616
separate: Boolean = false,
609617
skipNaN: Boolean = skipNaNDefault,
610618
columns: ColumnsForAggregateSelector<T, C>,
611-
): DataFrame<T> = Aggregators.percentileCommon<C>(percentile, skipNaN).aggregateFor(this, separate, columns)
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+
}
612624

613625
public fun <T> PivotGroupBy<T>.percentileFor(
614626
percentile: Double,

core/src/main/kotlin/org/jetbrains/kotlinx/dataframe/impl/aggregation/aggregators/Aggregators.kt

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -124,7 +124,7 @@ public object Aggregators {
124124

125125
// T: Comparable<T> -> T?
126126
// T : Comparable<T & Any>? -> T?
127-
public fun <T : Comparable<*>?> max(skipNaN: Boolean): Aggregator<T & Any, T?> = max.invoke(skipNaN).cast2()
127+
public fun <T : Comparable<T & Any>?> max(skipNaN: Boolean): Aggregator<T & Any, T?> = max.invoke(skipNaN).cast2()
128128

129129
public val max: AggregatorOptionSwitch1<Boolean, Comparable<Any>, Comparable<Any>?>
130130
by withOneOption { skipNaN: Boolean ->
@@ -159,22 +159,22 @@ public object Aggregators {
159159
percentile: Double,
160160
skipNaN: Boolean,
161161
): Aggregator<T & Any, T?>
162-
where T : Comparable<*>? =
162+
where T : Comparable<T & Any>? =
163163
this.percentile.invoke(percentile, skipNaN).cast2()
164164

165165
// T: Comparable<T & Any>? -> T?
166166
public fun <T> percentileComparables(
167167
percentile: Double,
168168
): Aggregator<T & Any, T?>
169-
where T : Comparable<*>? =
169+
where T : Comparable<T & Any>? =
170170
percentileCommon<T>(percentile, skipNaNDefault).cast2()
171171

172172
// T: primitive Number? -> Double?
173173
public fun <T> percentileNumbers(
174174
percentile: Double,
175175
skipNaN: Boolean,
176176
): Aggregator<T & Any, Double?>
177-
where T : Comparable<*>?, T : Number? =
177+
where T : Comparable<T & Any>?, T : Number? =
178178
percentileCommon<T>(percentile, skipNaN).cast2()
179179

180180
@Suppress("UNCHECKED_CAST")
@@ -193,19 +193,19 @@ public object Aggregators {
193193
// T: primitive Number? -> Double?
194194
// T: Comparable<T & Any>? -> T?
195195
public fun <T> medianCommon(skipNaN: Boolean): Aggregator<T & Any, T?>
196-
where T : Comparable<*>? =
196+
where T : Comparable<T & Any>? =
197197
median.invoke(skipNaN).cast2()
198198

199199
// T: Comparable<T & Any>? -> T?
200200
public fun <T> medianComparables(): Aggregator<T & Any, T?>
201-
where T : Comparable<*>? =
201+
where T : Comparable<T & Any>? =
202202
medianCommon<T>(skipNaNDefault).cast2()
203203

204204
// T: primitive Number? -> Double?
205205
public fun <T> medianNumbers(
206206
skipNaN: Boolean,
207207
): Aggregator<T & Any, Double?>
208-
where T : Comparable<*>?, T : Number? =
208+
where T : Comparable<T & Any>?, T : Number? =
209209
medianCommon<T>(skipNaN).cast2()
210210

211211
@Suppress("UNCHECKED_CAST")

0 commit comments

Comments
 (0)