Skip to content

Commit 7990082

Browse files
Automated commit of generated code
1 parent 9031d0b commit 7990082

File tree

3 files changed

+105
-18
lines changed
  • core/generated-sources/src

3 files changed

+105
-18
lines changed

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

+13-18
Original file line numberDiff line numberDiff line change
@@ -6,28 +6,23 @@ import org.jetbrains.kotlinx.dataframe.ColumnsSelector
66
import org.jetbrains.kotlinx.dataframe.DataColumn
77
import org.jetbrains.kotlinx.dataframe.DataFrame
88
import org.jetbrains.kotlinx.dataframe.annotations.AccessApiOverload
9-
import org.jetbrains.kotlinx.dataframe.columns.ColumnKind
9+
import org.jetbrains.kotlinx.dataframe.annotations.Interpretable
10+
import org.jetbrains.kotlinx.dataframe.annotations.Refine
1011
import org.jetbrains.kotlinx.dataframe.columns.toColumnSet
11-
import org.jetbrains.kotlinx.dataframe.impl.api.canBeUnfolded
12-
import org.jetbrains.kotlinx.dataframe.impl.api.createDataFrameImpl
13-
import org.jetbrains.kotlinx.dataframe.typeClass
12+
import org.jetbrains.kotlinx.dataframe.impl.api.unfoldImpl
13+
import kotlin.reflect.KCallable
1414
import kotlin.reflect.KProperty
1515

16-
public inline fun <reified T> DataColumn<T>.unfold(): AnyCol =
17-
when (kind()) {
18-
ColumnKind.Group, ColumnKind.Frame -> this
16+
public inline fun <reified T> DataColumn<T>.unfold(vararg roots: KCallable<*>, maxDepth: Int = 0): AnyCol =
17+
unfoldImpl { properties(roots = roots, maxDepth) }
1918

20-
else -> when {
21-
!typeClass.canBeUnfolded -> this
22-
23-
else -> values()
24-
.createDataFrameImpl(typeClass) { (this as CreateDataFrameDsl<T>).properties() }
25-
.asColumnGroup(name())
26-
.asDataColumn()
27-
}
28-
}
29-
30-
public fun <T> DataFrame<T>.unfold(columns: ColumnsSelector<T, *>): DataFrame<T> = replace(columns).with { it.unfold() }
19+
@Refine
20+
@Interpretable("DataFrameUnfold")
21+
public fun <T> DataFrame<T>.unfold(
22+
vararg roots: KCallable<*>,
23+
maxDepth: Int = 0,
24+
columns: ColumnsSelector<T, *>,
25+
): DataFrame<T> = replace(columns).with { it.unfoldImpl { properties(roots = roots, maxDepth) } }
3126

3227
public fun <T> DataFrame<T>.unfold(vararg columns: String): DataFrame<T> = unfold { columns.toColumnSet() }
3328

Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
package org.jetbrains.kotlinx.dataframe.impl.api
2+
3+
import org.jetbrains.kotlinx.dataframe.AnyCol
4+
import org.jetbrains.kotlinx.dataframe.DataColumn
5+
import org.jetbrains.kotlinx.dataframe.api.CreateDataFrameDsl
6+
import org.jetbrains.kotlinx.dataframe.api.asColumnGroup
7+
import org.jetbrains.kotlinx.dataframe.api.asDataColumn
8+
import org.jetbrains.kotlinx.dataframe.columns.ColumnKind
9+
import org.jetbrains.kotlinx.dataframe.typeClass
10+
11+
@PublishedApi
12+
internal fun <T> DataColumn<T>.unfoldImpl(body: CreateDataFrameDsl<T>.() -> Unit): AnyCol =
13+
when (kind()) {
14+
ColumnKind.Group, ColumnKind.Frame -> this
15+
16+
else -> when {
17+
!typeClass.canBeUnfolded -> this
18+
19+
else -> values()
20+
.createDataFrameImpl(typeClass) { (this as CreateDataFrameDsl<T>).body() }
21+
.asColumnGroup(name())
22+
.asDataColumn()
23+
}
24+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,68 @@
1+
package org.jetbrains.kotlinx.dataframe.api
2+
3+
import io.kotest.matchers.shouldBe
4+
import io.kotest.matchers.types.shouldBeInstanceOf
5+
import org.jetbrains.kotlinx.dataframe.AnyFrame
6+
import org.junit.Test
7+
import kotlin.reflect.typeOf
8+
9+
class UnfoldTests {
10+
@Test
11+
fun unfold() {
12+
val df = dataFrameOf(
13+
"col" to listOf(A("123", 321)),
14+
)
15+
16+
val res = df.unfold { col("col") }
17+
res[pathOf("col", "str")][0] shouldBe "123"
18+
res[pathOf("col", "i")][0] shouldBe 321
19+
}
20+
21+
@Test
22+
fun `unfold deep`() {
23+
val df1 = dataFrameOf(
24+
"col" to listOf(
25+
Group(
26+
"1",
27+
listOf(
28+
Person("Alice", "Cooper", 15, "London"),
29+
Person("Bob", "Dylan", 45, "Dubai"),
30+
),
31+
),
32+
Group(
33+
"2",
34+
listOf(
35+
Person("Charlie", "Daniels", 20, "Moscow"),
36+
Person("Charlie", "Chaplin", 40, "Milan"),
37+
),
38+
),
39+
),
40+
)
41+
42+
df1.unfold { col("col") }[pathOf("col", "participants")].type() shouldBe typeOf<List<Person>>()
43+
44+
df1.unfold(maxDepth = 2) { col("col") }[pathOf("col", "participants")][0].shouldBeInstanceOf<AnyFrame> {
45+
it["firstName"][0] shouldBe "Alice"
46+
}
47+
}
48+
49+
@Test
50+
fun `keep value type`() {
51+
val values = listOf(1, 2, 3, 4)
52+
val df2 = dataFrameOf("int" to values)
53+
val column = df2.unfold { col("int") }["int"]
54+
column.type() shouldBe typeOf<Int>()
55+
column.values() shouldBe values
56+
}
57+
58+
data class A(val str: String, val i: Int)
59+
60+
data class Person(
61+
val firstName: String,
62+
val lastName: String,
63+
val age: Int,
64+
val city: String?,
65+
)
66+
67+
data class Group(val id: String, val participants: List<Person>)
68+
}

0 commit comments

Comments
 (0)