Skip to content

Commit 0d009c6

Browse files
committed
added tests for concat with empty columns, fixed bug in createColumnGuessing type
1 parent a7f9498 commit 0d009c6

File tree

3 files changed

+33
-8
lines changed

3 files changed

+33
-8
lines changed

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,7 @@ internal fun <T> concatImpl(name: String, columns: List<DataColumn<T>>): DataCol
2424
internal fun <T> concatImpl(name: String, columns: List<DataColumn<T>?>, columnSizes: List<Int>): DataColumn<T> {
2525
when (columns.size) {
2626
0 -> return DataColumn.empty(name).cast()
27-
1 -> return columns[0] ?: DataColumn.empty(name).cast()
27+
1 -> return columns.single() ?: DataColumn.empty(name).cast()
2828
}
2929

3030
if (columns.all { it == null || it.isColumnGroup() }) {

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

Lines changed: 5 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,6 @@ import org.jetbrains.kotlinx.dataframe.ColumnsContainer
77
import org.jetbrains.kotlinx.dataframe.ColumnsSelector
88
import org.jetbrains.kotlinx.dataframe.DataColumn
99
import org.jetbrains.kotlinx.dataframe.DataFrame
10-
import org.jetbrains.kotlinx.dataframe.DataRow
1110
import org.jetbrains.kotlinx.dataframe.Selector
1211
import org.jetbrains.kotlinx.dataframe.api.AddDataRow
1312
import org.jetbrains.kotlinx.dataframe.api.AddExpression
@@ -43,9 +42,9 @@ import org.jetbrains.kotlinx.dataframe.index
4342
import org.jetbrains.kotlinx.dataframe.nrow
4443
import org.jetbrains.kotlinx.dataframe.util.CREATE_COLUMN
4544
import org.jetbrains.kotlinx.dataframe.util.GUESS_COLUMN_TYPE
46-
import kotlin.reflect.KClass
4745
import kotlin.reflect.KType
4846
import kotlin.reflect.full.isSubtypeOf
47+
import kotlin.reflect.full.starProjectedType
4948
import kotlin.reflect.full.withNullability
5049
import kotlin.reflect.typeOf
5150

@@ -262,10 +261,10 @@ internal fun <T> createColumnGuessingType(
262261
return { value -> if (value != null && value is Number) converter(value) else value }
263262
}
264263

265-
return when (type.classifier!! as KClass<*>) {
264+
return when (type.classifier?.starProjectedType) {
266265
// guessValueType can only return DataRow if all values are `AnyRow?`
267266
// or allColsMakesColGroup == true, and all values are `AnyCol`
268-
DataRow::class ->
267+
typeOf<AnyRow>() ->
269268
if (allColsMakesColGroup && values.firstOrNull() is AnyCol) {
270269
val df = dataFrameOf(values as Iterable<AnyCol>)
271270
DataColumn.createColumnGroup(name, df)
@@ -276,7 +275,7 @@ internal fun <T> createColumnGuessingType(
276275
DataColumn.createColumnGroup(name, df)
277276
}.asDataColumn().cast()
278277

279-
DataFrame::class -> {
278+
typeOf<AnyFrame>() -> {
280279
val frames = values.map {
281280
when (it) {
282281
null -> DataFrame.empty()
@@ -289,7 +288,7 @@ internal fun <T> createColumnGuessingType(
289288
DataColumn.createFrameColumn(name, frames).asDataColumn().cast()
290289
}
291290

292-
List::class -> {
291+
typeOf<List<*>>() -> {
293292
val nullable = type.isMarkedNullable
294293
var isListOfRows: Boolean? = null
295294
val subType = type.arguments.first().type!! // List<T> -> T

core/src/test/kotlin/org/jetbrains/kotlinx/dataframe/api/concat.kt

Lines changed: 27 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,8 @@
11
package org.jetbrains.kotlinx.dataframe.api
22

33
import io.kotest.matchers.shouldBe
4+
import org.jetbrains.kotlinx.dataframe.DataColumn
5+
import org.jetbrains.kotlinx.dataframe.DataFrame
46
import org.junit.Test
57

68
class ConcatTests {
@@ -9,7 +11,7 @@ class ConcatTests {
911
fun `different types`() {
1012
val a by columnOf(1, 2)
1113
val b by columnOf(3.0, null)
12-
a.concat(b) shouldBe columnOf(1, 2, 3.0, null).named("a")
14+
a.concat(b) shouldBe columnOf<Number?>(1, 2, 3.0, null).named("a")
1315
}
1416

1517
@Test
@@ -23,4 +25,28 @@ class ConcatTests {
2325

2426
dfWithCategory.columnNames() shouldBe listOf("value", "type", "category")
2527
}
28+
29+
@Test
30+
fun `concat empty DataFrames no rows`() {
31+
val dfWithSchema = DataFrame.emptyOf<Pair<Int, String>>()
32+
(dfWithSchema concat dfWithSchema).let { concatenated ->
33+
concatenated shouldBe dfWithSchema
34+
concatenated.schema() shouldBe dfWithSchema.schema()
35+
}
36+
37+
val dfNothingCols = dataFrameOf(
38+
"a" to DataColumn.empty(),
39+
"b" to DataColumn.empty(),
40+
)
41+
(dfNothingCols concat dfNothingCols).let { concatenated ->
42+
concatenated shouldBe dfNothingCols
43+
concatenated.schema() shouldBe dfNothingCols.schema()
44+
}
45+
}
46+
47+
@Test
48+
fun `concat empty DataFrames no cols`() {
49+
val dfNoCols = DataFrame.empty(5)
50+
(dfNoCols concat dfNoCols) shouldBe DataFrame.empty(10)
51+
}
2652
}

0 commit comments

Comments
 (0)