Skip to content

Commit 0be9e2e

Browse files
Automated commit of generated code
1 parent c01ff02 commit 0be9e2e

File tree

26 files changed

+589
-109
lines changed

26 files changed

+589
-109
lines changed

core/generated-sources/src/main/kotlin/org/jetbrains/kotlinx/dataframe/api/DataColumnType.kt

Lines changed: 31 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,11 @@ import org.jetbrains.kotlinx.dataframe.impl.isNothing
1111
import org.jetbrains.kotlinx.dataframe.impl.projectTo
1212
import org.jetbrains.kotlinx.dataframe.type
1313
import org.jetbrains.kotlinx.dataframe.typeClass
14+
import org.jetbrains.kotlinx.dataframe.util.IS_COMPARABLE
15+
import org.jetbrains.kotlinx.dataframe.util.IS_COMPARABLE_REPLACE
16+
import org.jetbrains.kotlinx.dataframe.util.IS_INTER_COMPARABLE_IMPORT
17+
import java.math.BigDecimal
18+
import java.math.BigInteger
1419
import kotlin.contracts.ExperimentalContracts
1520
import kotlin.contracts.contract
1621
import kotlin.reflect.KClass
@@ -44,13 +49,36 @@ public inline fun <reified T> AnyCol.isType(): Boolean = type() == typeOf<T>()
4449

4550
public fun AnyCol.isNumber(): Boolean = isSubtypeOf<Number?>()
4651

52+
public fun AnyCol.isBigNumber(): Boolean = isSubtypeOf<BigInteger?>() || isSubtypeOf<BigDecimal?>()
53+
4754
public fun AnyCol.isList(): Boolean = typeClass == List::class
4855

56+
/** Returns `true` if [this] column is inter-comparable, i.e.
57+
* its values can be compared with each other and thus ordered.
58+
*
59+
* If true, operations like [`min()`][AnyCol.min], [`max()`][AnyCol.max], [`median()`][AnyCol.median], etc.
60+
* will work.
61+
*
62+
* Technically, this means the values' common type is a subtype of [Comparable] with
63+
* the type argument not being [Nothing]. */
64+
@Deprecated(
65+
message = IS_COMPARABLE,
66+
replaceWith = ReplaceWith(IS_COMPARABLE_REPLACE, IS_INTER_COMPARABLE_IMPORT),
67+
level = DeprecationLevel.WARNING,
68+
)
69+
public fun AnyCol.isComparable(): Boolean = valuesAreComparable()
70+
4971
/**
50-
* Returns `true` if [this] column is comparable, i.e. its type is a subtype of [Comparable] and its
51-
* type argument is not [Nothing].
72+
* Returns `true` if [this] column is inter-comparable, i.e.
73+
* its values can be compared with each other and thus ordered.
74+
*
75+
* If true, operations like [`min()`][AnyCol.min], [`max()`][AnyCol.max], [`median()`][AnyCol.median], etc.
76+
* will work.
77+
*
78+
* Technically, this means the values' common type is a subtype of [Comparable] with
79+
* the type argument not being [Nothing].
5280
*/
53-
public fun AnyCol.isComparable(): Boolean =
81+
public fun AnyCol.valuesAreComparable(): Boolean =
5482
isSubtypeOf<Comparable<*>?>() &&
5583
type().projectTo(Comparable::class).arguments[0].let {
5684
it != KTypeProjection.STAR &&

core/generated-sources/src/main/kotlin/org/jetbrains/kotlinx/dataframe/api/cumSum.kt

Lines changed: 43 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,10 +5,13 @@ import org.jetbrains.kotlinx.dataframe.ColumnsSelector
55
import org.jetbrains.kotlinx.dataframe.DataColumn
66
import org.jetbrains.kotlinx.dataframe.DataFrame
77
import org.jetbrains.kotlinx.dataframe.columns.toColumnSet
8+
import org.jetbrains.kotlinx.dataframe.impl.nothingType
9+
import org.jetbrains.kotlinx.dataframe.impl.nullableNothingType
810
import org.jetbrains.kotlinx.dataframe.math.cumSum
911
import org.jetbrains.kotlinx.dataframe.math.defaultCumSumSkipNA
1012
import org.jetbrains.kotlinx.dataframe.typeClass
1113
import java.math.BigDecimal
14+
import java.math.BigInteger
1215
import kotlin.reflect.KProperty
1316
import kotlin.reflect.typeOf
1417

@@ -17,20 +20,59 @@ import kotlin.reflect.typeOf
1720
public fun <T : Number?> DataColumn<T>.cumSum(skipNA: Boolean = defaultCumSumSkipNA): DataColumn<T> =
1821
when (type()) {
1922
typeOf<Double>() -> cast<Double>().cumSum(skipNA).cast()
23+
2024
typeOf<Double?>() -> cast<Double?>().cumSum(skipNA).cast()
25+
2126
typeOf<Float>() -> cast<Float>().cumSum(skipNA).cast()
27+
2228
typeOf<Float?>() -> cast<Float?>().cumSum(skipNA).cast()
29+
2330
typeOf<Int>() -> cast<Int>().cumSum().cast()
31+
32+
// TODO cumSum for Byte returns Int but is converted back to T: Byte, Issue #558
33+
typeOf<Byte>() -> cast<Byte>().cumSum().map { it.toByte() }.cast()
34+
35+
// TODO cumSum for Short returns Int but is converted back to T: Short, Issue #558
36+
typeOf<Short>() -> cast<Short>().cumSum().map { it.toShort() }.cast()
37+
2438
typeOf<Int?>() -> cast<Int?>().cumSum(skipNA).cast()
39+
40+
// TODO cumSum for Byte? returns Int? but is converted back to T: Byte?, Issue #558
41+
typeOf<Byte?>() -> cast<Byte?>().cumSum(skipNA).map { it?.toByte() }.cast()
42+
43+
// TODO cumSum for Short? returns Int? but is converted back to T: Short?, Issue #558
44+
typeOf<Short?>() -> cast<Short?>().cumSum(skipNA).map { it?.toShort() }.cast()
45+
2546
typeOf<Long>() -> cast<Long>().cumSum().cast()
47+
2648
typeOf<Long?>() -> cast<Long?>().cumSum(skipNA).cast()
49+
50+
typeOf<BigInteger>() -> cast<BigInteger>().cumSum().cast()
51+
52+
typeOf<BigInteger?>() -> cast<BigInteger?>().cumSum(skipNA).cast()
53+
2754
typeOf<BigDecimal>() -> cast<BigDecimal>().cumSum().cast()
55+
2856
typeOf<BigDecimal?>() -> cast<BigDecimal?>().cumSum(skipNA).cast()
57+
2958
typeOf<Number?>(), typeOf<Number>() -> convertToDouble().cumSum(skipNA).cast()
59+
60+
// Cumsum for empty column or column with just null is itself
61+
nothingType, nullableNothingType -> this
62+
3063
else -> error("Cumsum for type ${type()} is not supported")
3164
}
3265

33-
private val supportedClasses = setOf(Double::class, Float::class, Int::class, Long::class, BigDecimal::class)
66+
private val supportedClasses = setOf(
67+
Double::class,
68+
Float::class,
69+
Int::class,
70+
Byte::class,
71+
Short::class,
72+
Long::class,
73+
BigInteger::class,
74+
BigDecimal::class,
75+
)
3476

3577
// endregion
3678

core/generated-sources/src/main/kotlin/org/jetbrains/kotlinx/dataframe/api/describe.kt

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -9,14 +9,13 @@ import org.jetbrains.kotlinx.dataframe.columns.ColumnReference
99
import org.jetbrains.kotlinx.dataframe.columns.toColumnSet
1010
import org.jetbrains.kotlinx.dataframe.impl.api.describeImpl
1111
import kotlin.reflect.KProperty
12-
import kotlin.reflect.KType
1312

1413
// region DataSchema
1514
@DataSchema
1615
public interface ColumnDescription {
1716
public val name: String
1817
public val path: ColumnPath
19-
public val type: KType
18+
public val type: String
2019
public val count: Int
2120
public val unique: Int
2221
public val nulls: Int

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

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@ import org.jetbrains.kotlinx.dataframe.columns.ColumnReference
1111
import org.jetbrains.kotlinx.dataframe.columns.toColumnSet
1212
import org.jetbrains.kotlinx.dataframe.columns.values
1313
import org.jetbrains.kotlinx.dataframe.impl.aggregation.aggregators.Aggregators
14-
import org.jetbrains.kotlinx.dataframe.impl.aggregation.comparableColumns
14+
import org.jetbrains.kotlinx.dataframe.impl.aggregation.interComparableColumns
1515
import org.jetbrains.kotlinx.dataframe.impl.aggregation.modes.aggregateAll
1616
import org.jetbrains.kotlinx.dataframe.impl.aggregation.modes.aggregateFor
1717
import org.jetbrains.kotlinx.dataframe.impl.aggregation.modes.aggregateOfDelegated
@@ -52,7 +52,7 @@ public inline fun <reified T : Comparable<T>> AnyRow.rowMaxOf(): T = rowMaxOfOrN
5252

5353
// region DataFrame
5454

55-
public fun <T> DataFrame<T>.max(): DataRow<T> = maxFor(comparableColumns())
55+
public fun <T> DataFrame<T>.max(): DataRow<T> = maxFor(interComparableColumns())
5656

5757
public fun <T, C : Comparable<C>> DataFrame<T>.maxFor(columns: ColumnsForAggregateSelector<T, C?>): DataRow<T> =
5858
Aggregators.max.aggregateFor(this, columns)
@@ -121,7 +121,7 @@ public fun <T, C : Comparable<C>> DataFrame<T>.maxByOrNull(column: KProperty<C?>
121121

122122
// region GroupBy
123123

124-
public fun <T> Grouped<T>.max(): DataFrame<T> = maxFor(comparableColumns())
124+
public fun <T> Grouped<T>.max(): DataFrame<T> = maxFor(interComparableColumns())
125125

126126
public fun <T, C : Comparable<C>> Grouped<T>.maxFor(columns: ColumnsForAggregateSelector<T, C?>): DataFrame<T> =
127127
Aggregators.max.aggregateFor(this, columns)
@@ -218,7 +218,7 @@ public fun <T, C : Comparable<C>> Pivot<T>.maxBy(column: KProperty<C?>): Reduced
218218

219219
// region PivotGroupBy
220220

221-
public fun <T> PivotGroupBy<T>.max(separate: Boolean = false): DataFrame<T> = maxFor(separate, comparableColumns())
221+
public fun <T> PivotGroupBy<T>.max(separate: Boolean = false): DataFrame<T> = maxFor(separate, interComparableColumns())
222222

223223
public fun <T, R : Comparable<R>> PivotGroupBy<T>.maxFor(
224224
separate: Boolean = false,

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

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@ import org.jetbrains.kotlinx.dataframe.columns.ColumnReference
1111
import org.jetbrains.kotlinx.dataframe.columns.toColumnSet
1212
import org.jetbrains.kotlinx.dataframe.impl.aggregation.aggregators.Aggregators
1313
import org.jetbrains.kotlinx.dataframe.impl.aggregation.aggregators.cast
14-
import org.jetbrains.kotlinx.dataframe.impl.aggregation.comparableColumns
14+
import org.jetbrains.kotlinx.dataframe.impl.aggregation.interComparableColumns
1515
import org.jetbrains.kotlinx.dataframe.impl.aggregation.modes.aggregateAll
1616
import org.jetbrains.kotlinx.dataframe.impl.aggregation.modes.aggregateFor
1717
import org.jetbrains.kotlinx.dataframe.impl.aggregation.modes.aggregateOf
@@ -53,7 +53,7 @@ public inline fun <reified T : Comparable<T>> AnyRow.rowMedianOf(): T =
5353

5454
// region DataFrame
5555

56-
public fun <T> DataFrame<T>.median(): DataRow<T> = medianFor(comparableColumns())
56+
public fun <T> DataFrame<T>.median(): DataRow<T> = medianFor(interComparableColumns())
5757

5858
public fun <T, C : Comparable<C>> DataFrame<T>.medianFor(columns: ColumnsForAggregateSelector<T, C?>): DataRow<T> =
5959
Aggregators.median.aggregateFor(this, columns)
@@ -96,7 +96,7 @@ public inline fun <T, reified R : Comparable<R>> DataFrame<T>.medianOf(
9696

9797
// region GroupBy
9898

99-
public fun <T> Grouped<T>.median(): DataFrame<T> = medianFor(comparableColumns())
99+
public fun <T> Grouped<T>.median(): DataFrame<T> = medianFor(interComparableColumns())
100100

101101
public fun <T, C : Comparable<C>> Grouped<T>.medianFor(columns: ColumnsForAggregateSelector<T, C?>): DataFrame<T> =
102102
Aggregators.median.aggregateFor(this, columns)
@@ -134,7 +134,7 @@ public inline fun <T, reified R : Comparable<R>> Grouped<T>.medianOf(
134134

135135
// region Pivot
136136

137-
public fun <T> Pivot<T>.median(separate: Boolean = false): DataRow<T> = medianFor(separate, comparableColumns())
137+
public fun <T> Pivot<T>.median(separate: Boolean = false): DataRow<T> = medianFor(separate, interComparableColumns())
138138

139139
public fun <T, C : Comparable<C>> Pivot<T>.medianFor(
140140
separate: Boolean = false,
@@ -174,7 +174,7 @@ public inline fun <T, reified R : Comparable<R>> Pivot<T>.medianOf(
174174
// region PivotGroupBy
175175

176176
public fun <T> PivotGroupBy<T>.median(separate: Boolean = false): DataFrame<T> =
177-
medianFor(separate, comparableColumns())
177+
medianFor(separate, interComparableColumns())
178178

179179
public fun <T, C : Comparable<C>> PivotGroupBy<T>.medianFor(
180180
separate: Boolean = false,

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

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@ import org.jetbrains.kotlinx.dataframe.columns.ColumnReference
1111
import org.jetbrains.kotlinx.dataframe.columns.toColumnSet
1212
import org.jetbrains.kotlinx.dataframe.columns.values
1313
import org.jetbrains.kotlinx.dataframe.impl.aggregation.aggregators.Aggregators
14-
import org.jetbrains.kotlinx.dataframe.impl.aggregation.comparableColumns
14+
import org.jetbrains.kotlinx.dataframe.impl.aggregation.interComparableColumns
1515
import org.jetbrains.kotlinx.dataframe.impl.aggregation.modes.aggregateAll
1616
import org.jetbrains.kotlinx.dataframe.impl.aggregation.modes.aggregateFor
1717
import org.jetbrains.kotlinx.dataframe.impl.aggregation.modes.aggregateOfDelegated
@@ -52,7 +52,7 @@ public inline fun <reified T : Comparable<T>> AnyRow.rowMinOf(): T = rowMinOfOrN
5252

5353
// region DataFrame
5454

55-
public fun <T> DataFrame<T>.min(): DataRow<T> = minFor(comparableColumns())
55+
public fun <T> DataFrame<T>.min(): DataRow<T> = minFor(interComparableColumns())
5656

5757
public fun <T, C : Comparable<C>> DataFrame<T>.minFor(columns: ColumnsForAggregateSelector<T, C?>): DataRow<T> =
5858
Aggregators.min.aggregateFor(this, columns)
@@ -121,7 +121,7 @@ public fun <T, C : Comparable<C>> DataFrame<T>.minByOrNull(column: KProperty<C?>
121121

122122
// region GroupBy
123123

124-
public fun <T> Grouped<T>.min(): DataFrame<T> = minFor(comparableColumns())
124+
public fun <T> Grouped<T>.min(): DataFrame<T> = minFor(interComparableColumns())
125125

126126
public fun <T, C : Comparable<C>> Grouped<T>.minFor(columns: ColumnsForAggregateSelector<T, C?>): DataFrame<T> =
127127
Aggregators.min.aggregateFor(this, columns)
@@ -219,7 +219,7 @@ public fun <T, C : Comparable<C>> Pivot<T>.minBy(column: KProperty<C?>): Reduced
219219

220220
// region PivotGroupBy
221221

222-
public fun <T> PivotGroupBy<T>.min(separate: Boolean = false): DataFrame<T> = minFor(separate, comparableColumns())
222+
public fun <T> PivotGroupBy<T>.min(separate: Boolean = false): DataFrame<T> = minFor(separate, interComparableColumns())
223223

224224
public fun <T, R : Comparable<R>> PivotGroupBy<T>.minFor(
225225
separate: Boolean = false,

core/generated-sources/src/main/kotlin/org/jetbrains/kotlinx/dataframe/api/typeConversions.kt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -83,7 +83,7 @@ public fun DataColumn<Any>.asNumbers(): ValueColumn<Number> {
8383
}
8484

8585
public fun <T> DataColumn<T>.asComparable(): DataColumn<Comparable<T>> {
86-
require(isComparable())
86+
require(valuesAreComparable())
8787
return this as DataColumn<Comparable<T>>
8888
}
8989

core/generated-sources/src/main/kotlin/org/jetbrains/kotlinx/dataframe/impl/TypeUtils.kt

Lines changed: 22 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,8 @@ import org.jetbrains.kotlinx.dataframe.DataRow
1111
import org.jetbrains.kotlinx.dataframe.api.Infer
1212
import org.jetbrains.kotlinx.dataframe.impl.columns.createColumnGuessingType
1313
import org.jetbrains.kotlinx.dataframe.util.GUESS_VALUE_TYPE
14+
import java.math.BigDecimal
15+
import java.math.BigInteger
1416
import kotlin.reflect.KClass
1517
import kotlin.reflect.KType
1618
import kotlin.reflect.KTypeParameter
@@ -29,6 +31,7 @@ import kotlin.reflect.full.superclasses
2931
import kotlin.reflect.full.withNullability
3032
import kotlin.reflect.jvm.jvmErasure
3133
import kotlin.reflect.typeOf
34+
import kotlin.toBigDecimal as toBigDecimalKotlin
3235

3336
internal inline fun <reified T> KClass<*>.createTypeUsing() = typeOf<T>().projectTo(this)
3437

@@ -546,12 +549,10 @@ internal fun guessValueType(
546549
internal val KType.isNothing: Boolean
547550
get() = classifier == Nothing::class
548551

549-
internal fun nothingType(nullable: Boolean): KType =
550-
if (nullable) {
551-
typeOf<List<Nothing?>>()
552-
} else {
553-
typeOf<List<Nothing>>()
554-
}.arguments.first().type!!
552+
internal val nothingType: KType = typeOf<List<Nothing>>().arguments.first().type!!
553+
internal val nullableNothingType: KType = typeOf<List<Nothing?>>().arguments.first().type!!
554+
555+
internal fun nothingType(nullable: Boolean): KType = if (nullable) nullableNothingType else nothingType
555556

556557
@OptIn(ExperimentalUnsignedTypes::class)
557558
private val primitiveArrayClasses = setOf(
@@ -646,3 +647,18 @@ internal fun Any.asArrayAsListOrNull(): List<*>? =
646647
is Array<*> -> asList()
647648
else -> null
648649
}
650+
651+
internal fun Any.isBigNumber(): Boolean = this is BigInteger || this is BigDecimal
652+
653+
internal fun Number.toBigDecimal(): BigDecimal =
654+
when (this) {
655+
is BigDecimal -> this
656+
is BigInteger -> this.toBigDecimalKotlin()
657+
is Int -> this.toBigDecimalKotlin()
658+
is Byte -> this.toInt().toBigDecimalKotlin()
659+
is Short -> this.toInt().toBigDecimalKotlin()
660+
is Long -> this.toBigDecimalKotlin()
661+
is Float -> this.toBigDecimalKotlin()
662+
is Double -> this.toBigDecimalKotlin()
663+
else -> BigDecimal(this.toString())
664+
}

core/generated-sources/src/main/kotlin/org/jetbrains/kotlinx/dataframe/impl/aggregation/getColumns.kt

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -5,17 +5,17 @@ import org.jetbrains.kotlinx.dataframe.ColumnsSelector
55
import org.jetbrains.kotlinx.dataframe.aggregation.Aggregatable
66
import org.jetbrains.kotlinx.dataframe.aggregation.NamedValue
77
import org.jetbrains.kotlinx.dataframe.api.filter
8-
import org.jetbrains.kotlinx.dataframe.api.isComparable
98
import org.jetbrains.kotlinx.dataframe.api.isNumber
9+
import org.jetbrains.kotlinx.dataframe.api.valuesAreComparable
1010
import org.jetbrains.kotlinx.dataframe.columns.TypeSuggestion
1111
import org.jetbrains.kotlinx.dataframe.impl.columns.createColumnGuessingType
1212

1313
internal inline fun <T> Aggregatable<T>.remainingColumns(
1414
crossinline predicate: (AnyCol) -> Boolean,
1515
): ColumnsSelector<T, Any?> = remainingColumnsSelector().filter { predicate(it.data) }
1616

17-
internal fun <T> Aggregatable<T>.comparableColumns() =
18-
remainingColumns { it.isComparable() } as ColumnsSelector<T, Comparable<Any?>>
17+
internal fun <T> Aggregatable<T>.interComparableColumns() =
18+
remainingColumns { it.valuesAreComparable() } as ColumnsSelector<T, Comparable<Any?>>
1919

2020
internal fun <T> Aggregatable<T>.numberColumns() = remainingColumns { it.isNumber() } as ColumnsSelector<T, Number?>
2121

0 commit comments

Comments
 (0)