Skip to content

Commit 317f466

Browse files
committed
small API change
1 parent 1c5b11d commit 317f466

File tree

3 files changed

+138
-95
lines changed

3 files changed

+138
-95
lines changed

core/src/main/kotlin/org/jetbrains/kotlinx/dataframe/ColumnDataHolder.kt

Lines changed: 17 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,9 @@
33
package org.jetbrains.kotlinx.dataframe
44

55
import org.jetbrains.kotlinx.dataframe.impl.columns.ColumnDataHolderImpl
6-
import org.jetbrains.kotlinx.dataframe.impl.columns.of
6+
import org.jetbrains.kotlinx.dataframe.impl.columns.ofCollection
7+
import org.jetbrains.kotlinx.dataframe.impl.columns.ofBoxedArray
8+
import org.jetbrains.kotlinx.dataframe.impl.columns.ofPrimitiveArray
79
import kotlin.reflect.KType
810
import kotlin.reflect.typeOf
911

@@ -31,49 +33,49 @@ public interface ColumnDataHolder<T> : Iterable<T> {
3133
}
3234

3335
public fun <T> Collection<T>.toColumnDataHolder(type: KType, distinct: Lazy<Set<T>>? = null): ColumnDataHolder<T> =
34-
ColumnDataHolder.of(this, type, distinct)
36+
ColumnDataHolder.ofCollection(this, type, distinct)
3537

3638
public inline fun <reified T> Collection<T>.toColumnDataHolder(distinct: Lazy<Set<T>>? = null): ColumnDataHolder<T> =
3739
this.toColumnDataHolder(typeOf<T>(), distinct)
3840

3941
public fun <T> Array<T>.toColumnDataHolder(type: KType, distinct: Lazy<Set<T>>? = null): ColumnDataHolder<T> =
40-
ColumnDataHolder.of(this, type, distinct)
42+
ColumnDataHolder.ofBoxedArray(this, type, distinct)
4143

4244
public inline fun <reified T> Array<T>.toColumnDataHolder(distinct: Lazy<Set<T>>? = null): ColumnDataHolder<T> =
4345
this.toColumnDataHolder(typeOf<T>(), distinct)
4446

4547
public fun BooleanArray.asColumnDataHolder(distinct: Lazy<Set<Boolean>>? = null): ColumnDataHolder<Boolean> =
46-
ColumnDataHolder.of(this, typeOf<Boolean>(), distinct)
48+
ColumnDataHolder.ofPrimitiveArray(this, typeOf<Boolean>(), distinct)
4749

4850
public fun ByteArray.asColumnDataHolder(distinct: Lazy<Set<Byte>>? = null): ColumnDataHolder<Byte> =
49-
ColumnDataHolder.of(this, typeOf<Byte>(), distinct)
51+
ColumnDataHolder.ofPrimitiveArray(this, typeOf<Byte>(), distinct)
5052

5153
public fun ShortArray.asColumnDataHolder(distinct: Lazy<Set<Short>>? = null): ColumnDataHolder<Short> =
52-
ColumnDataHolder.of(this, typeOf<Short>(), distinct)
54+
ColumnDataHolder.ofPrimitiveArray(this, typeOf<Short>(), distinct)
5355

5456
public fun IntArray.asColumnDataHolder(distinct: Lazy<Set<Int>>? = null): ColumnDataHolder<Int> =
55-
ColumnDataHolder.of(this, typeOf<Int>(), distinct)
57+
ColumnDataHolder.ofPrimitiveArray(this, typeOf<Int>(), distinct)
5658

5759
public fun LongArray.asColumnDataHolder(distinct: Lazy<Set<Long>>? = null): ColumnDataHolder<Long> =
58-
ColumnDataHolder.of(this, typeOf<Long>(), distinct)
60+
ColumnDataHolder.ofPrimitiveArray(this, typeOf<Long>(), distinct)
5961

6062
public fun FloatArray.asColumnDataHolder(distinct: Lazy<Set<Float>>? = null): ColumnDataHolder<Float> =
61-
ColumnDataHolder.of(this, typeOf<Float>(), distinct)
63+
ColumnDataHolder.ofPrimitiveArray(this, typeOf<Float>(), distinct)
6264

6365
public fun DoubleArray.asColumnDataHolder(distinct: Lazy<Set<Double>>? = null): ColumnDataHolder<Double> =
64-
ColumnDataHolder.of(this, typeOf<Double>(), distinct)
66+
ColumnDataHolder.ofPrimitiveArray(this, typeOf<Double>(), distinct)
6567

6668
public fun CharArray.asColumnDataHolder(distinct: Lazy<Set<Char>>? = null): ColumnDataHolder<Char> =
67-
ColumnDataHolder.of(this, typeOf<Char>(), distinct)
69+
ColumnDataHolder.ofPrimitiveArray(this, typeOf<Char>(), distinct)
6870

6971
public fun UByteArray.asColumnDataHolder(distinct: Lazy<Set<UByte>>? = null): ColumnDataHolder<UByte> =
70-
ColumnDataHolder.of(this, typeOf<UByte>(), distinct)
72+
ColumnDataHolder.ofPrimitiveArray(this, typeOf<UByte>(), distinct)
7173

7274
public fun UShortArray.asColumnDataHolder(distinct: Lazy<Set<UShort>>? = null): ColumnDataHolder<UShort> =
73-
ColumnDataHolder.of(this, typeOf<UShort>(), distinct)
75+
ColumnDataHolder.ofPrimitiveArray(this, typeOf<UShort>(), distinct)
7476

7577
public fun UIntArray.asColumnDataHolder(distinct: Lazy<Set<UInt>>? = null): ColumnDataHolder<UInt> =
76-
ColumnDataHolder.of(this, typeOf<UInt>(), distinct)
78+
ColumnDataHolder.ofPrimitiveArray(this, typeOf<UInt>(), distinct)
7779

7880
public fun ULongArray.asColumnDataHolder(distinct: Lazy<Set<ULong>>? = null): ColumnDataHolder<ULong> =
79-
ColumnDataHolder.of(this, typeOf<ULong>(), distinct)
81+
ColumnDataHolder.ofPrimitiveArray(this, typeOf<ULong>(), distinct)

core/src/main/kotlin/org/jetbrains/kotlinx/dataframe/DataColumn.kt

Lines changed: 41 additions & 60 deletions
Original file line numberDiff line numberDiff line change
@@ -16,13 +16,13 @@ import org.jetbrains.kotlinx.dataframe.columns.ColumnResolutionContext
1616
import org.jetbrains.kotlinx.dataframe.columns.ColumnWithPath
1717
import org.jetbrains.kotlinx.dataframe.columns.FrameColumn
1818
import org.jetbrains.kotlinx.dataframe.columns.ValueColumn
19-
import org.jetbrains.kotlinx.dataframe.impl.columns.ColumnDataHolderImpl
20-
import org.jetbrains.kotlinx.dataframe.impl.columns.ColumnDataHolderImpl
2119
import org.jetbrains.kotlinx.dataframe.impl.columns.ColumnGroupImpl
2220
import org.jetbrains.kotlinx.dataframe.impl.columns.FrameColumnImpl
2321
import org.jetbrains.kotlinx.dataframe.impl.columns.ValueColumnImpl
2422
import org.jetbrains.kotlinx.dataframe.impl.columns.addPath
2523
import org.jetbrains.kotlinx.dataframe.impl.columns.guessColumnType
24+
import org.jetbrains.kotlinx.dataframe.impl.columns.ofCollection
25+
import org.jetbrains.kotlinx.dataframe.impl.columns.ofBoxedArray
2626
import org.jetbrains.kotlinx.dataframe.impl.columns.toColumnKind
2727
import org.jetbrains.kotlinx.dataframe.impl.getValuesType
2828
import org.jetbrains.kotlinx.dataframe.impl.splitByIndices
@@ -51,65 +51,41 @@ public interface DataColumn<out T> : BaseColumn<T> {
5151
defaultValue: T? = null,
5252
): ValueColumn<T> = ValueColumnImpl(values, name, type, defaultValue)
5353

54-
public fun createValueColumn(
55-
name: String,
56-
values: BooleanArray,
57-
): ValueColumn<Boolean> = createValueColumn(name, values.asColumnDataHolder(), typeOf<Boolean>())
54+
public fun createValueColumn(name: String, values: BooleanArray): ValueColumn<Boolean> =
55+
createValueColumn(name, values.asColumnDataHolder(), typeOf<Boolean>())
5856

59-
public fun createValueColumn(
60-
name: String,
61-
values: ByteArray,
62-
): ValueColumn<Byte> = createValueColumn(name, values.asColumnDataHolder(), typeOf<Byte>())
57+
public fun createValueColumn(name: String, values: ByteArray): ValueColumn<Byte> =
58+
createValueColumn(name, values.asColumnDataHolder(), typeOf<Byte>())
6359

64-
public fun createValueColumn(
65-
name: String,
66-
values: ShortArray,
67-
): ValueColumn<Short> = createValueColumn(name, values.asColumnDataHolder(), typeOf<Short>())
60+
public fun createValueColumn(name: String, values: ShortArray): ValueColumn<Short> =
61+
createValueColumn(name, values.asColumnDataHolder(), typeOf<Short>())
6862

69-
public fun createValueColumn(
70-
name: String,
71-
values: IntArray,
72-
): ValueColumn<Int> = createValueColumn(name, values.asColumnDataHolder(), typeOf<Int>())
63+
public fun createValueColumn(name: String, values: IntArray): ValueColumn<Int> =
64+
createValueColumn(name, values.asColumnDataHolder(), typeOf<Int>())
7365

74-
public fun createValueColumn(
75-
name: String,
76-
values: LongArray,
77-
): ValueColumn<Long> = createValueColumn(name, values.asColumnDataHolder(), typeOf<Long>())
66+
public fun createValueColumn(name: String, values: LongArray): ValueColumn<Long> =
67+
createValueColumn(name, values.asColumnDataHolder(), typeOf<Long>())
7868

79-
public fun createValueColumn(
80-
name: String,
81-
values: FloatArray,
82-
): ValueColumn<Float> = createValueColumn(name, values.asColumnDataHolder(), typeOf<Float>())
69+
public fun createValueColumn(name: String, values: FloatArray): ValueColumn<Float> =
70+
createValueColumn(name, values.asColumnDataHolder(), typeOf<Float>())
8371

84-
public fun createValueColumn(
85-
name: String,
86-
values: DoubleArray,
87-
): ValueColumn<Double> = createValueColumn(name, values.asColumnDataHolder(), typeOf<Double>())
72+
public fun createValueColumn(name: String, values: DoubleArray): ValueColumn<Double> =
73+
createValueColumn(name, values.asColumnDataHolder(), typeOf<Double>())
8874

89-
public fun createValueColumn(
90-
name: String,
91-
values: CharArray,
92-
): ValueColumn<Char> = createValueColumn(name, values.asColumnDataHolder(), typeOf<Char>())
75+
public fun createValueColumn(name: String, values: CharArray): ValueColumn<Char> =
76+
createValueColumn(name, values.asColumnDataHolder(), typeOf<Char>())
9377

94-
public fun createValueColumn(
95-
name: String,
96-
values: UByteArray,
97-
): ValueColumn<UByte> = createValueColumn(name, values.asColumnDataHolder(), typeOf<UByte>())
78+
public fun createValueColumn(name: String, values: UByteArray): ValueColumn<UByte> =
79+
createValueColumn(name, values.asColumnDataHolder(), typeOf<UByte>())
9880

99-
public fun createValueColumn(
100-
name: String,
101-
values: UShortArray,
102-
): ValueColumn<UShort> = createValueColumn(name, values.asColumnDataHolder(), typeOf<UShort>())
81+
public fun createValueColumn(name: String, values: UShortArray): ValueColumn<UShort> =
82+
createValueColumn(name, values.asColumnDataHolder(), typeOf<UShort>())
10383

104-
public fun createValueColumn(
105-
name: String,
106-
values: UIntArray,
107-
): ValueColumn<UInt> = createValueColumn(name, values.asColumnDataHolder(), typeOf<UInt>())
84+
public fun createValueColumn(name: String, values: UIntArray): ValueColumn<UInt> =
85+
createValueColumn(name, values.asColumnDataHolder(), typeOf<UInt>())
10886

109-
public fun createValueColumn(
110-
name: String,
111-
values: ULongArray,
112-
): ValueColumn<ULong> = createValueColumn(name, values.asColumnDataHolder(), typeOf<ULong>())
87+
public fun createValueColumn(name: String, values: ULongArray): ValueColumn<ULong> =
88+
createValueColumn(name, values.asColumnDataHolder(), typeOf<ULong>())
11389

11490
/**
11591
* Creates [ValueColumn] using given [name], [values] and [type].
@@ -129,9 +105,9 @@ public interface DataColumn<out T> : BaseColumn<T> {
129105
val valueType = getValuesType(values, type, infer)
130106
return createValueColumn(
131107
name = name,
132-
values = ColumnDataHolderImpl.of(values, valueType),
108+
values = ColumnDataHolder.ofCollection(values, valueType),
133109
type = valueType,
134-
defaultValue = defaultValue
110+
defaultValue = defaultValue,
135111
)
136112
}
137113

@@ -170,26 +146,31 @@ public interface DataColumn<out T> : BaseColumn<T> {
170146
val valueType = getValuesType(values.asList(), type, infer)
171147
return createValueColumn(
172148
name = name,
173-
values = ColumnDataHolderImpl.of(values, valueType),
149+
values = ColumnDataHolder.ofBoxedArray(values, valueType),
174150
type = valueType,
175-
defaultValue = defaultValue
151+
defaultValue = defaultValue,
176152
)
177153
}
178154

179155
public inline fun <reified T> createValueColumn(
180156
name: String,
181157
values: Array<T>,
182158
infer: Infer = Infer.None,
183-
): ValueColumn<T> = createValueColumn(
184-
name = name,
185-
values = values,
186-
type = getValuesType(values.asList(), typeOf<T>(), infer)
187-
)
159+
): ValueColumn<T> =
160+
createValueColumn(
161+
name = name,
162+
values = values,
163+
type = getValuesType(values.asList(), typeOf<T>(), infer),
164+
)
188165

189166
public fun <T> createColumnGroup(name: String, df: DataFrame<T>): ColumnGroup<T> = ColumnGroupImpl(name, df)
190167

191168
public fun <T> createFrameColumn(name: String, df: DataFrame<T>, startIndices: Iterable<Int>): FrameColumn<T> =
192-
FrameColumnImpl(name, df.splitByIndices(startIndices.asSequence()).toList().toColumnDataHolder(), lazy { df.schema() })
169+
FrameColumnImpl(
170+
name,
171+
df.splitByIndices(startIndices.asSequence()).toList().toColumnDataHolder(),
172+
lazy { df.schema() },
173+
)
193174

194175
public fun <T> createFrameColumn(
195176
name: String,

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

Lines changed: 80 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -4,10 +4,57 @@ package org.jetbrains.kotlinx.dataframe.impl.columns
44

55
import org.jetbrains.kotlinx.dataframe.ColumnDataHolder
66
import org.jetbrains.kotlinx.dataframe.impl.asList
7+
import org.jetbrains.kotlinx.dataframe.impl.isArray
78
import org.jetbrains.kotlinx.dataframe.impl.isPrimitiveArray
89
import kotlin.reflect.KType
910
import kotlin.reflect.typeOf
1011

12+
/**
13+
* Using the [ofPrimitiveArray] functions, this can store natively without converting:
14+
* - [BooleanArray]
15+
* - [ByteArray]
16+
* - [ShortArray]
17+
* - [IntArray]
18+
* - [LongArray]
19+
* - [FloatArray]
20+
* - [DoubleArray]
21+
* - [CharArray]
22+
* - [UByteArray]
23+
* - [UShortArray]
24+
* - [UIntArray]
25+
* - [ULongArray]
26+
*
27+
* Store with converting to primitive arrays:
28+
* - [Array][Array]`<`[Boolean][Boolean]`>`
29+
* - [Array][Array]`<`[Byte][Byte]`>`
30+
* - [Array][Array]`<`[Short][Short]`>`
31+
* - [Array][Array]`<`[Int][Int]`>`
32+
* - [Array][Array]`<`[Long][Long]`>`
33+
* - [Array][Array]`<`[Float][Float]`>`
34+
* - [Array][Array]`<`[Double][Double]`>`
35+
* - [Array][Array]`<`[Char][Char]`>`
36+
* - [Array][Array]`<`[UByte][UByte]`>`
37+
* - [Array][Array]`<`[UShort][UShort]`>`
38+
* - [Array][Array]`<`[UInt][UInt]`>`
39+
* - [Array][Array]`<`[ULong][ULong]`>`
40+
* - [Collection][Collection]`<`[Boolean][Boolean]`>`
41+
* - [Collection][Collection]`<`[Byte][Byte]`>`
42+
* - [Collection][Collection]`<`[Short][Short]`>`
43+
* - [Collection][Collection]`<`[Int][Int]`>`
44+
* - [Collection][Collection]`<`[Long][Long]`>`
45+
* - [Collection][Collection]`<`[Float][Float]`>`
46+
* - [Collection][Collection]`<`[Double][Double]`>`
47+
* - [Collection][Collection]`<`[Char][Char]`>`
48+
* - [Collection][Collection]`<`[UByte][UByte]`>`
49+
* - [Collection][Collection]`<`[UShort][UShort]`>`
50+
* - [Collection][Collection]`<`[UInt][UInt]`>`
51+
* - [Collection][Collection]`<`[ULong][ULong]`>`
52+
*
53+
* Store them as is:
54+
* - [Array][Array]`<`[Any?][Any]`>`
55+
* - [Collection][Collection]`<`[Any?][Any]`>`
56+
*
57+
*/
1158
internal class ColumnDataHolderImpl<T>(private val list: List<T>, distinct: Lazy<Set<T>>?) : ColumnDataHolder<T> {
1259

1360
override val distinct = distinct ?: lazy { list.toSet() }
@@ -41,36 +88,36 @@ private val UINT = typeOf<UInt>()
4188
private val ULONG = typeOf<ULong>()
4289

4390
/**
44-
* Constructs [ColumnDataHolderImpl] using an [asList] wrapper around the [list].
91+
* Constructs [ColumnDataHolderImpl] using an [asList] wrapper around the [collection].
4592
*/
4693
@Suppress("UNCHECKED_CAST")
47-
internal fun <T> ColumnDataHolder.Companion.of(
48-
list: Collection<T>,
94+
internal fun <T> ColumnDataHolder.Companion.ofCollection(
95+
collection: Collection<T>,
4996
type: KType,
5097
distinct: Lazy<Set<T>>? = null,
5198
): ColumnDataHolder<T> {
52-
if (list is ColumnDataHolder<*>) return list as ColumnDataHolder<T>
99+
if (collection is ColumnDataHolder<*>) return collection as ColumnDataHolder<T>
53100

54101
try {
55102
val newList = when (type) {
56-
BOOLEAN -> (list as Collection<Boolean>).toBooleanArray().asList()
57-
BYTE -> (list as Collection<Byte>).toByteArray().asList()
58-
SHORT -> (list as Collection<Short>).toShortArray().asList()
59-
INT -> (list as Collection<Int>).toIntArray().asList()
60-
LONG -> (list as Collection<Long>).toLongArray().asList()
61-
FLOAT -> (list as Collection<Float>).toFloatArray().asList()
62-
DOUBLE -> (list as Collection<Double>).toDoubleArray().asList()
63-
CHAR -> (list as Collection<Char>).toCharArray().asList()
64-
UBYTE -> (list as Collection<UByte>).toUByteArray().asList()
65-
USHORT -> (list as Collection<UShort>).toUShortArray().asList()
66-
UINT -> (list as Collection<UInt>).toUIntArray().asList()
67-
ULONG -> (list as Collection<ULong>).toULongArray().asList()
68-
else -> list.asList()
103+
BOOLEAN -> (collection as Collection<Boolean>).toBooleanArray().asList()
104+
BYTE -> (collection as Collection<Byte>).toByteArray().asList()
105+
SHORT -> (collection as Collection<Short>).toShortArray().asList()
106+
INT -> (collection as Collection<Int>).toIntArray().asList()
107+
LONG -> (collection as Collection<Long>).toLongArray().asList()
108+
FLOAT -> (collection as Collection<Float>).toFloatArray().asList()
109+
DOUBLE -> (collection as Collection<Double>).toDoubleArray().asList()
110+
CHAR -> (collection as Collection<Char>).toCharArray().asList()
111+
UBYTE -> (collection as Collection<UByte>).toUByteArray().asList()
112+
USHORT -> (collection as Collection<UShort>).toUShortArray().asList()
113+
UINT -> (collection as Collection<UInt>).toUIntArray().asList()
114+
ULONG -> (collection as Collection<ULong>).toULongArray().asList()
115+
else -> collection.asList()
69116
} as List<T>
70117

71118
return ColumnDataHolderImpl(newList, distinct)
72119
} catch (e: Exception) {
73-
throw IllegalArgumentException("Can't create ColumnDataHolder from $list and type $type", e)
120+
throw IllegalArgumentException("Can't create ColumnDataHolder from $collection and type $type", e)
74121
}
75122
}
76123

@@ -80,7 +127,7 @@ internal fun <T> ColumnDataHolder.Companion.of(
80127
* wrapped with [asList].
81128
*/
82129
@Suppress("UNCHECKED_CAST")
83-
internal fun <T> ColumnDataHolder.Companion.of(
130+
internal fun <T> ColumnDataHolder.Companion.ofBoxedArray(
84131
array: Array<T>,
85132
type: KType,
86133
distinct: Lazy<Set<T>>? = null,
@@ -116,7 +163,7 @@ internal fun <T> ColumnDataHolder.Companion.of(
116163
* [primitiveArray] must be an array of primitives, returns `null` if something goes wrong.
117164
*/
118165
@Suppress("UNCHECKED_CAST")
119-
internal fun <T> ColumnDataHolder.Companion.of(
166+
internal fun <T> ColumnDataHolder.Companion.ofPrimitiveArray(
120167
primitiveArray: Any,
121168
type: KType,
122169
distinct: Lazy<Set<T>>? = null,
@@ -157,3 +204,16 @@ internal fun <T> ColumnDataHolder.Companion.of(
157204

158205
return ColumnDataHolderImpl(newList, distinct)
159206
}
207+
208+
@Suppress("UNCHECKED_CAST")
209+
internal fun <T> ColumnDataHolder.Companion.of(
210+
any: Any,
211+
type: KType,
212+
distinct: Lazy<Set<T>>? = null,
213+
): ColumnDataHolder<T> =
214+
when {
215+
any.isPrimitiveArray -> ofPrimitiveArray(primitiveArray = any, type = type, distinct = distinct)
216+
any.isArray -> ofBoxedArray(array = any as Array<T>, type = type, distinct = distinct)
217+
any is Collection<*> -> ofCollection(collection = any as Collection<T>, type = type, distinct = distinct)
218+
else -> throw IllegalArgumentException("Can't create ColumnDataHolder from $any and type $type")
219+
}

0 commit comments

Comments
 (0)