Skip to content

Commit

Permalink
Update generated sources with recent changes
Browse files Browse the repository at this point in the history
  • Loading branch information
actions-user committed Jun 18, 2024
1 parent 87305e9 commit 0a2e917
Show file tree
Hide file tree
Showing 4 changed files with 100 additions and 13 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@ import org.jetbrains.kotlinx.dataframe.ColumnsContainer
import org.jetbrains.kotlinx.dataframe.ColumnsSelector
import org.jetbrains.kotlinx.dataframe.DataColumn
import org.jetbrains.kotlinx.dataframe.DataFrame
import org.jetbrains.kotlinx.dataframe.annotations.Interpretable
import org.jetbrains.kotlinx.dataframe.columns.ColumnReference
import org.jetbrains.kotlinx.dataframe.columns.toColumnSet
import org.jetbrains.kotlinx.dataframe.get
Expand All @@ -14,6 +15,7 @@ import org.jetbrains.kotlinx.dataframe.impl.api.insertImpl
import org.jetbrains.kotlinx.dataframe.impl.api.removeImpl
import kotlin.reflect.KProperty

@Interpretable("Replace0")
public fun <T, C> DataFrame<T>.replace(columns: ColumnsSelector<T, C>): ReplaceClause<T, C> =
ReplaceClause(this, columns)

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -5,22 +5,25 @@ import org.jetbrains.kotlinx.dataframe.AnyColumnReference
import org.jetbrains.kotlinx.dataframe.ColumnsSelector
import org.jetbrains.kotlinx.dataframe.DataColumn
import org.jetbrains.kotlinx.dataframe.DataFrame
import org.jetbrains.kotlinx.dataframe.columns.ColumnKind
import org.jetbrains.kotlinx.dataframe.annotations.Interpretable
import org.jetbrains.kotlinx.dataframe.annotations.Refine
import org.jetbrains.kotlinx.dataframe.columns.toColumnSet
import org.jetbrains.kotlinx.dataframe.impl.api.createDataFrameImpl
import org.jetbrains.kotlinx.dataframe.typeClass
import org.jetbrains.kotlinx.dataframe.impl.api.unfoldImpl
import kotlin.reflect.KProperty

public inline fun <reified T> DataColumn<T>.unfold(): AnyCol =
when (kind()) {
ColumnKind.Group, ColumnKind.Frame -> this
else -> when {
isPrimitive() -> this
else -> values().createDataFrameImpl(typeClass) {
(this as CreateDataFrameDsl<T>).properties()
}.asColumnGroup(name()).asDataColumn()
}
}
public inline fun <reified T> DataColumn<T>.unfold(vararg props: KProperty<*>, maxDepth: Int = 0): AnyCol =
unfoldImpl(skipPrimitive = true) { properties(roots = props, maxDepth = maxDepth) }

public inline fun <reified T> DataColumn<T>.unfold(noinline body: CreateDataFrameDsl<T>.() -> Unit): AnyCol =
unfoldImpl(skipPrimitive = false, body)

public inline fun <T, reified C> ReplaceClause<T, C>.unfold(vararg props: KProperty<*>, maxDepth: Int = 0): DataFrame<T> =
with { it.unfold(props = props, maxDepth) }

@Refine
@Interpretable("ReplaceUnfold1")
public inline fun <T, reified C> ReplaceClause<T, C>.unfold(noinline body: CreateDataFrameDsl<C>.() -> Unit): DataFrame<T> =
with { it.unfoldImpl(skipPrimitive = false, body) }

public fun <T> DataFrame<T>.unfold(columns: ColumnsSelector<T, *>): DataFrame<T> = replace(columns).with { it.unfold() }

Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
package org.jetbrains.kotlinx.dataframe.impl.api

import org.jetbrains.kotlinx.dataframe.AnyCol
import org.jetbrains.kotlinx.dataframe.DataColumn
import org.jetbrains.kotlinx.dataframe.api.CreateDataFrameDsl
import org.jetbrains.kotlinx.dataframe.api.asColumnGroup
import org.jetbrains.kotlinx.dataframe.api.asDataColumn
import org.jetbrains.kotlinx.dataframe.api.isPrimitive
import org.jetbrains.kotlinx.dataframe.columns.ColumnKind
import org.jetbrains.kotlinx.dataframe.typeClass

@PublishedApi
internal fun <T> DataColumn<T>.unfoldImpl(skipPrimitive: Boolean, body: CreateDataFrameDsl<T>.() -> Unit): AnyCol {
return when (kind()) {
ColumnKind.Group, ColumnKind.Frame -> this
else -> when {
skipPrimitive && isPrimitive() -> this
else -> values().createDataFrameImpl(typeClass) {
body((this as CreateDataFrameDsl<T>))
}.asColumnGroup(name()).asDataColumn()
}
}
}
Original file line number Diff line number Diff line change
@@ -1,6 +1,8 @@
package org.jetbrains.kotlinx.dataframe.api

import io.kotest.matchers.shouldBe
import org.jetbrains.kotlinx.dataframe.DataRow
import org.jetbrains.kotlinx.dataframe.io.readJsonStr
import org.junit.Test
import kotlin.reflect.typeOf

Expand All @@ -13,4 +15,61 @@ class ReplaceTests {
conv.columnNames() shouldBe listOf("b")
conv.columnTypes() shouldBe listOf(typeOf<Double>())
}

@Test
fun `unfold primitive`() {
val a by columnOf("123")
val df = dataFrameOf(a)

val conv = df.replace { a }.unfold {
"b" from { it }
"c" from { DataRow.readJsonStr("""{"prop": 1}""") }
}

val b = conv["a"]["b"]
b.type() shouldBe typeOf<String>()
b.values() shouldBe listOf("123")

val c = conv["a"]["c"]["prop"]
c.type() shouldBe typeOf<Int>()
c.values() shouldBe listOf(1)
}

@Test
fun `unfold properties`() {
val col by columnOf(A("1", 123, B(3.0)))
val df1 = dataFrameOf(col)
val conv = df1.replace { col }.unfold(maxDepth = 2)

val a = conv["col"]["a"]
a.type() shouldBe typeOf<String>()
a.values() shouldBe listOf("1")

val b = conv["col"]["b"]
b.type() shouldBe typeOf<Int>()
b.values() shouldBe listOf(123)

val d = conv["col"]["bb"]["d"]
d.type() shouldBe typeOf<Double>()
d.values() shouldBe listOf(3.0)
}

class B(val d: Double)
class A(val a: String, val b: Int, val bb: B)

@Test
fun `skip primitive`() {
val col1 by columnOf("1", "2")
val col2 by columnOf(B(1.0), B(2.0))
val df1 = dataFrameOf(col1, col2)
val conv = df1.replace { nameStartsWith("col") }.unfold()

val a = conv["col1"]
a.type() shouldBe typeOf<String>()
a.values() shouldBe listOf("1", "2")

val b = conv["col2"]["d"]
b.type() shouldBe typeOf<Double>()
b.values() shouldBe listOf(1.0, 2.0)
}
}

0 comments on commit 0a2e917

Please sign in to comment.