@@ -32,7 +32,11 @@ import kotlin.reflect.KProperty
32
32
* numbers -> Double
33
33
* comparable -> itself
34
34
*
35
- * medianBy is new
35
+ * TODO cases where the lambda dictates the return type require explicit type arguments for
36
+ * non-number, comparable overloads: https://youtrack.jetbrains.com/issue/KT-76683
37
+ * so, `df.median { intCol }` works, but needs `df.median<_, String> { stringCol }`
38
+ *
39
+ * medianBy is new for all overloads :)
36
40
*/
37
41
38
42
// region DataColumn
@@ -65,19 +69,18 @@ public inline fun <T, reified R : Comparable<R & Any>?> DataColumn<T>.medianByOr
65
69
crossinline selector : (T ) -> R ,
66
70
): T ? = Aggregators .medianCommon<R >(skipNaN).aggregateByOrNull(this , selector)
67
71
68
- // todo check overload resolution https://youtrack.jetbrains.com/issue/KT-76683
72
+ // TODO, requires explicit type R due to https://youtrack.jetbrains.com/issue/KT-76683
69
73
@OverloadResolutionByLambdaReturnType
70
74
public inline fun <T , reified R : Comparable <R & Any >? > DataColumn<T>.medianOf (
71
75
crossinline expression : (T ) -> R ,
72
76
): R & Any = medianOfOrNull(expression).suggestIfNull(" medianOf" )
73
77
74
- // todo check overload resolution https://youtrack.jetbrains.com/issue/KT-76683
78
+ // TODO, requires explicit type R due to https://youtrack.jetbrains.com/issue/KT-76683
75
79
@OverloadResolutionByLambdaReturnType
76
80
public inline fun <T , reified R : Comparable <R & Any >? > DataColumn<T>.medianOfOrNull (
77
81
crossinline expression : (T ) -> R ,
78
82
): R ? = Aggregators .medianComparables<R >().aggregateOf(this , expression)
79
83
80
- // todo check overload resolution https://youtrack.jetbrains.com/issue/KT-76683
81
84
@OverloadResolutionByLambdaReturnType
82
85
public inline fun <T , reified R > DataColumn<T>.medianOf (
83
86
skipNaN : Boolean = skipNaNDefault,
@@ -86,7 +89,6 @@ public inline fun <T, reified R> DataColumn<T>.medianOf(
86
89
where R : Comparable <R & Any >? , R : Number ? =
87
90
medianOfOrNull(skipNaN, expression).suggestIfNull(" medianOf" )
88
91
89
- // todo check overload resolution https://youtrack.jetbrains.com/issue/KT-76683
90
92
@OverloadResolutionByLambdaReturnType
91
93
public inline fun <T , reified R > DataColumn<T>.medianOfOrNull (
92
94
skipNaN : Boolean = skipNaNDefault,
@@ -149,26 +151,24 @@ public fun <T, C : Comparable<C & Any>?> DataFrame<T>.medianFor(
149
151
skipNaN : Boolean = skipNaNDefault,
150
152
): DataRow <T > = medianFor(skipNaN) { columns.toColumnSet() }
151
153
152
- // todo check overload resolution https://youtrack.jetbrains.com/issue/KT-76683
154
+ // TODO, requires explicit type C due to https://youtrack.jetbrains.com/issue/KT-76683
153
155
@OverloadResolutionByLambdaReturnType
154
156
public fun <T , C : Comparable <C & Any >? > DataFrame<T>.median (columns : ColumnsSelector <T , C >): C & Any =
155
157
medianOrNull(columns).suggestIfNull(" median" )
156
158
157
- // todo check overload resolution https://youtrack.jetbrains.com/issue/KT-76683
159
+ // TODO, requires explicit type C due to https://youtrack.jetbrains.com/issue/KT-76683
158
160
@OverloadResolutionByLambdaReturnType
159
161
@Suppress(" UNCHECKED_CAST" )
160
162
public fun <T , C : Comparable <C & Any >? > DataFrame<T>.medianOrNull (columns : ColumnsSelector <T , C >): C ? =
161
163
Aggregators .medianComparables<C >().aggregateAll(this , columns)
162
164
163
- // todo check overload resolution https://youtrack.jetbrains.com/issue/KT-76683
164
165
@OverloadResolutionByLambdaReturnType
165
166
public fun <T , C > DataFrame<T>.median (
166
167
skipNaN : Boolean = skipNaNDefault,
167
168
columns : ColumnsSelector <T , C >,
168
169
): Double
169
170
where C : Number ? , C : Comparable <C & Any >? = medianOrNull(skipNaN, columns).suggestIfNull(" median" )
170
171
171
- // todo check overload resolution https://youtrack.jetbrains.com/issue/KT-76683
172
172
@OverloadResolutionByLambdaReturnType
173
173
@Suppress(" UNCHECKED_CAST" )
174
174
public fun <T , C > DataFrame<T>.medianOrNull (
@@ -230,19 +230,18 @@ public fun <T, C> DataFrame<T>.medianOrNull(
230
230
): Double?
231
231
where C : Comparable <C & Any >? , C : Number ? = medianOrNull(skipNaN) { columns.toColumnSet() }
232
232
233
- // todo check overload resolution https://youtrack.jetbrains.com/issue/KT-76683
233
+ // TODO, requires explicit type R due to https://youtrack.jetbrains.com/issue/KT-76683
234
234
@OverloadResolutionByLambdaReturnType
235
235
public inline fun <T , reified R : Comparable <R & Any >? > DataFrame<T>.medianOf (
236
236
crossinline expression : RowExpression <T , R >,
237
237
): R & Any = medianOfOrNull(expression).suggestIfNull(" medianOf" )
238
238
239
- // todo check overload resolution https://youtrack.jetbrains.com/issue/KT-76683
239
+ // TODO, requires explicit type R due to https://youtrack.jetbrains.com/issue/KT-76683
240
240
@OverloadResolutionByLambdaReturnType
241
241
public inline fun <T , reified R : Comparable <R & Any >? > DataFrame<T>.medianOfOrNull (
242
242
crossinline expression : RowExpression <T , R >,
243
243
): R ? = Aggregators .medianComparables<R >().aggregateOf(this , expression)
244
244
245
- // todo check overload resolution https://youtrack.jetbrains.com/issue/KT-76683
246
245
@OverloadResolutionByLambdaReturnType
247
246
public inline fun <T , reified R > DataFrame<T>.medianOf (
248
247
skipNaN : Boolean = skipNaNDefault,
@@ -251,7 +250,6 @@ public inline fun <T, reified R> DataFrame<T>.medianOf(
251
250
where R : Comparable <R & Any >? , R : Number ? =
252
251
medianOfOrNull(skipNaN, expression).suggestIfNull(" medianOf" )
253
252
254
- // todo check overload resolution https://youtrack.jetbrains.com/issue/KT-76683
255
253
@OverloadResolutionByLambdaReturnType
256
254
public inline fun <T , reified R > DataFrame<T>.medianOfOrNull (
257
255
skipNaN : Boolean = skipNaNDefault,
@@ -260,6 +258,46 @@ public inline fun <T, reified R> DataFrame<T>.medianOfOrNull(
260
258
where R : Comparable <R & Any >? , R : Number ? =
261
259
Aggregators .medianNumbers<R >(skipNaN).aggregateOf(this , expression)
262
260
261
+ public inline fun <T , reified C : Comparable <C & Any >? > DataFrame<T>.medianBy (
262
+ skipNaN : Boolean = skipNaNDefault,
263
+ crossinline expression : RowExpression <T , C >,
264
+ ): DataRow <T > = medianByOrNull(skipNaN, expression).suggestIfNull(" medianBy" )
265
+
266
+ public fun <T > DataFrame<T>.medianBy (column : String , skipNaN : Boolean = skipNaNDefault): DataRow <T > =
267
+ medianByOrNull(column, skipNaN).suggestIfNull(" medianBy" )
268
+
269
+ @AccessApiOverload
270
+ public inline fun <T , reified C : Comparable <C & Any >? > DataFrame<T>.medianBy (
271
+ column : ColumnReference <C >,
272
+ skipNaN : Boolean = skipNaNDefault,
273
+ ): DataRow <T > = medianByOrNull(column, skipNaN).suggestIfNull(" medianBy" )
274
+
275
+ @AccessApiOverload
276
+ public inline fun <T , reified C : Comparable <C & Any >? > DataFrame<T>.medianBy (
277
+ column : KProperty <C >,
278
+ skipNaN : Boolean = skipNaNDefault,
279
+ ): DataRow <T > = medianByOrNull(column, skipNaN).suggestIfNull(" medianBy" )
280
+
281
+ public inline fun <T , reified C : Comparable <C & Any >? > DataFrame<T>.medianByOrNull (
282
+ skipNaN : Boolean = skipNaNDefault,
283
+ crossinline expression : RowExpression <T , C >,
284
+ ): DataRow <T >? = Aggregators .min<C >(skipNaN).aggregateByOrNull(this , expression)
285
+
286
+ public fun <T > DataFrame<T>.medianByOrNull (column : String , skipNaN : Boolean = skipNaNDefault): DataRow <T >? =
287
+ medianByOrNull(column.toColumnOf<Comparable <Any >? > (), skipNaN)
288
+
289
+ @AccessApiOverload
290
+ public inline fun <T , reified C : Comparable <C & Any >? > DataFrame<T>.medianByOrNull (
291
+ column : ColumnReference <C >,
292
+ skipNaN : Boolean = skipNaNDefault,
293
+ ): DataRow <T >? = Aggregators .min<C >(skipNaN).aggregateByOrNull(this , column)
294
+
295
+ @AccessApiOverload
296
+ public inline fun <T , reified C : Comparable <C & Any >? > DataFrame<T>.medianByOrNull (
297
+ column : KProperty <C >,
298
+ skipNaN : Boolean = skipNaNDefault,
299
+ ): DataRow <T >? = medianByOrNull(column.toColumnAccessor(), skipNaN)
300
+
263
301
// endregion
264
302
265
303
// region GroupBy
@@ -325,6 +363,27 @@ public inline fun <T, reified R : Comparable<R & Any>?> Grouped<T>.medianOf(
325
363
crossinline expression : RowExpression <T , R >,
326
364
): DataFrame <T > = Aggregators .medianCommon<R >(skipNaN).aggregateOf(this , name, expression)
327
365
366
+ @Interpretable(" GroupByReduceExpression" ) // TODO?
367
+ public inline fun <T , G , reified R : Comparable <R & Any >? > GroupBy <T , G >.medianBy (
368
+ skipNaN : Boolean = skipNaNDefault,
369
+ crossinline rowExpression : RowExpression <G , R >,
370
+ ): ReducedGroupBy <T , G > = reduce { medianByOrNull(skipNaN, rowExpression) }
371
+
372
+ @AccessApiOverload
373
+ public inline fun <T , G , reified C : Comparable <C & Any >? > GroupBy <T , G >.medianBy (
374
+ column : ColumnReference <C >,
375
+ skipNaN : Boolean = skipNaNDefault,
376
+ ): ReducedGroupBy <T , G > = reduce { medianByOrNull(column, skipNaN) }
377
+
378
+ public fun <T , G > GroupBy <T , G >.medianBy (column : String , skipNaN : Boolean = skipNaNDefault): ReducedGroupBy <T , G > =
379
+ medianBy(column.toColumnAccessor().cast<Comparable <Any >? > (), skipNaN)
380
+
381
+ @AccessApiOverload
382
+ public inline fun <T , G , reified C : Comparable <C & Any >? > GroupBy <T , G >.medianBy (
383
+ column : KProperty <C >,
384
+ skipNaN : Boolean = skipNaNDefault,
385
+ ): ReducedGroupBy <T , G > = medianBy(column.toColumnAccessor(), skipNaN)
386
+
328
387
// endregion
329
388
330
389
// region Pivot
@@ -383,6 +442,25 @@ public inline fun <T, reified R : Comparable<R & Any>?> Pivot<T>.medianOf(
383
442
crossinline expression : RowExpression <T , R >,
384
443
): DataRow <T > = delegate { medianOf(skipNaN, expression) }
385
444
445
+ public inline fun <T , reified R : Comparable <R & Any >? > Pivot<T>.medianBy (
446
+ skipNaN : Boolean = skipNaNDefault,
447
+ crossinline rowExpression : RowExpression <T , R >,
448
+ ): ReducedPivot <T > = reduce { medianByOrNull(skipNaN, rowExpression) }
449
+
450
+ @AccessApiOverload
451
+ public inline fun <T , reified C : Comparable <C & Any >? > Pivot<T>.medianBy (
452
+ column : ColumnReference <C >,
453
+ skipNaN : Boolean = skipNaNDefault,
454
+ ): ReducedPivot <T > = reduce { medianByOrNull(column, skipNaN) }
455
+
456
+ public fun <T > Pivot<T>.medianBy (column : String , skipNaN : Boolean = skipNaNDefault): ReducedPivot <T > =
457
+ medianBy(column.toColumnAccessor().cast<Comparable <Any >? > (), skipNaN)
458
+
459
+ @AccessApiOverload
460
+ public inline fun <T , reified C : Comparable <C & Any >? > Pivot<T>.medianBy (
461
+ column : KProperty <C >,
462
+ skipNaN : Boolean = skipNaNDefault,
463
+ ): ReducedPivot <T > = medianBy(column.toColumnAccessor(), skipNaN)
386
464
// endregion
387
465
388
466
// region PivotGroupBy
@@ -441,6 +519,28 @@ public inline fun <T, reified R : Comparable<R & Any>?> PivotGroupBy<T>.medianOf
441
519
crossinline expression : RowExpression <T , R >,
442
520
): DataFrame <T > = Aggregators .medianCommon<R >(skipNaN).aggregateOf(this , expression)
443
521
522
+ public inline fun <T , reified R : Comparable <R & Any >? > PivotGroupBy<T>.medianBy (
523
+ skipNaN : Boolean = skipNaNDefault,
524
+ crossinline rowExpression : RowExpression <T , R >,
525
+ ): ReducedPivotGroupBy <T > = reduce { medianByOrNull(skipNaN, rowExpression) }
526
+
527
+ @AccessApiOverload
528
+ public inline fun <T , reified C : Comparable <C & Any >? > PivotGroupBy<T>.medianBy (
529
+ column : ColumnReference <C >,
530
+ skipNaN : Boolean = skipNaNDefault,
531
+ ): ReducedPivotGroupBy <T > = reduce { medianByOrNull(column, skipNaN) }
532
+
533
+ public fun <T > PivotGroupBy<T>.medianBy (column : String , skipNaN : Boolean = skipNaNDefault): ReducedPivotGroupBy <T > =
534
+ medianBy(column.toColumnAccessor().cast<Comparable <Any >? > (), skipNaN)
535
+
536
+ @AccessApiOverload
537
+ public inline fun <T , reified C : Comparable <C & Any >? > PivotGroupBy<T>.medianBy (
538
+ column : KProperty <C >,
539
+ skipNaN : Boolean = skipNaNDefault,
540
+ ): ReducedPivotGroupBy <T > = medianBy(column.toColumnAccessor(), skipNaN)
541
+
444
542
// endregion
445
543
446
- // TODO more medianBy overloads
544
+ // region binary compatibility
545
+ // TODO
546
+ // endregion
0 commit comments