Skip to content

Commit 3e8a54a

Browse files
committed
Add typed overloads for columnGroup and frameColumn column accessor builders.
1 parent dc01d84 commit 3e8a54a

File tree

2 files changed

+74
-0
lines changed
  • src
    • main/kotlin/org/jetbrains/kotlinx/dataframe/api
    • test/kotlin/org/jetbrains/kotlinx/dataframe/api

2 files changed

+74
-0
lines changed

src/main/kotlin/org/jetbrains/kotlinx/dataframe/api/constructors.kt

Lines changed: 47 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@ import org.jetbrains.kotlinx.dataframe.AnyRow
77
import org.jetbrains.kotlinx.dataframe.ColumnGroupReference
88
import org.jetbrains.kotlinx.dataframe.DataColumn
99
import org.jetbrains.kotlinx.dataframe.DataFrame
10+
import org.jetbrains.kotlinx.dataframe.DataRow
1011
import org.jetbrains.kotlinx.dataframe.RowExpression
1112
import org.jetbrains.kotlinx.dataframe.columns.ColumnAccessor
1213
import org.jetbrains.kotlinx.dataframe.columns.ColumnPath
@@ -29,6 +30,8 @@ import kotlin.reflect.typeOf
2930

3031
// region create ColumnAccessor
3132

33+
// region column
34+
3235
public fun <T> column(): ColumnDelegate<T> = ColumnDelegate()
3336
public fun <T> column(name: String): ColumnAccessor<T> = ColumnAccessorImpl(name)
3437
public fun <T> column(path: ColumnPath): ColumnAccessor<T> = ColumnAccessorImpl(path)
@@ -48,19 +51,63 @@ public inline fun <T, reified C> column(
4851
noinline expression: RowExpression<T, C>
4952
): ColumnReference<C> = createComputedColumnReference(name, typeOf<C>(), infer, expression as RowExpression<Any?, C>)
5053

54+
// endregion
55+
56+
// region columnGroup
57+
5158
public fun columnGroup(): ColumnDelegate<AnyRow> = column()
59+
@JvmName("columnGroupTyped")
60+
public fun <T> columnGroup(): ColumnDelegate<DataRow<T>> = column()
61+
5262
public fun columnGroup(name: String): ColumnAccessor<AnyRow> = column(name)
63+
@JvmName("columnGroupTyped")
64+
public fun <T> columnGroup(name: String): ColumnAccessor<DataRow<T>> = column(name)
65+
5366
public fun columnGroup(path: ColumnPath): ColumnAccessor<AnyRow> = column(path)
67+
@JvmName("columnGroupTyped")
68+
public fun <T> columnGroup(path: ColumnPath): ColumnAccessor<DataRow<T>> = column(path)
69+
5470
public fun ColumnGroupReference.columnGroup(): ColumnDelegate<AnyRow> = ColumnDelegate(this)
71+
@JvmName("columnGroupTyped")
72+
public fun <T> ColumnGroupReference.columnGroup(): ColumnDelegate<DataRow<T>> = ColumnDelegate(this)
73+
5574
public fun ColumnGroupReference.columnGroup(name: String): ColumnAccessor<AnyRow> = ColumnAccessorImpl(path() + name)
75+
@JvmName("columnGroupTyped")
76+
public fun <T> ColumnGroupReference.columnGroup(name: String): ColumnAccessor<DataRow<T>> = ColumnAccessorImpl(path() + name)
77+
5678
public fun ColumnGroupReference.columnGroup(path: ColumnPath): ColumnAccessor<AnyRow> = ColumnAccessorImpl(this.path() + path)
79+
@JvmName("columnGroupTyped")
80+
public fun <T> ColumnGroupReference.columnGroup(path: ColumnPath): ColumnAccessor<DataRow<T>> = ColumnAccessorImpl(this.path() + path)
81+
82+
// endregion
83+
84+
// region frameColumn
5785

5886
public fun frameColumn(): ColumnDelegate<AnyFrame> = column()
87+
@JvmName("frameColumnTyped")
88+
public fun <T> frameColumn(): ColumnDelegate<DataFrame<T>> = column()
89+
5990
public fun frameColumn(name: String): ColumnAccessor<AnyFrame> = column(name)
91+
@JvmName("frameColumnTyped")
92+
public fun <T> frameColumn(name: String): ColumnAccessor<DataFrame<T>> = column(name)
93+
6094
public fun frameColumn(path: ColumnPath): ColumnAccessor<AnyFrame> = column(path)
95+
@JvmName("frameColumnTyped")
96+
public fun <T> frameColumn(path: ColumnPath): ColumnAccessor<DataFrame<T>> = column(path)
97+
6198
public fun ColumnGroupReference.frameColumn(): ColumnDelegate<AnyFrame> = ColumnDelegate(this)
99+
@JvmName("frameColumnTyped")
100+
public fun <T> ColumnGroupReference.frameColumn(): ColumnDelegate<DataFrame<T>> = ColumnDelegate(this)
101+
62102
public fun ColumnGroupReference.frameColumn(name: String): ColumnAccessor<AnyFrame> = ColumnAccessorImpl(path() + name)
103+
@JvmName("frameColumnTyped")
104+
public fun <T> ColumnGroupReference.frameColumn(name: String): ColumnAccessor<DataFrame<T>> = ColumnAccessorImpl(path() + name)
105+
63106
public fun ColumnGroupReference.frameColumn(path: ColumnPath): ColumnAccessor<AnyFrame> = ColumnAccessorImpl(this.path() + path)
107+
@JvmName("frameColumnTyped")
108+
public fun <T> ColumnGroupReference.frameColumn(path: ColumnPath): ColumnAccessor<DataFrame<T>> = ColumnAccessorImpl(this.path() + path)
109+
110+
// endregion
64111

65112
public class ColumnDelegate<T>(private val parent: ColumnGroupReference? = null) {
66113
public operator fun getValue(thisRef: Any?, property: KProperty<*>): ColumnAccessor<T> = named(property.columnName)

src/test/kotlin/org/jetbrains/kotlinx/dataframe/api/get.kt

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@ package org.jetbrains.kotlinx.dataframe.api
22

33
import io.kotest.assertions.throwables.shouldThrow
44
import io.kotest.matchers.shouldBe
5+
import org.jetbrains.kotlinx.dataframe.annotations.DataSchema
56
import org.junit.Test
67
import java.lang.ClassCastException
78
import java.lang.IllegalArgumentException
@@ -50,4 +51,30 @@ class GetTests {
5051
shouldThrow<ClassCastException> { added.getValue<Int>("c") + 1 }
5152
shouldThrow<ClassCastException> { added.getValue(A::c) + 1 }
5253
}
54+
55+
@DataSchema
56+
data class Schema(val a: Int)
57+
58+
@Test
59+
fun `create typed frame column accessor`() {
60+
val df = dataFrameOf(
61+
columnOf(
62+
dataFrameOf("a")(1),
63+
dataFrameOf("a", "b")(2, 3, 4, 5)
64+
).named("x")
65+
)
66+
val x by frameColumn<Schema>()
67+
df[x][0].a[0] shouldBe 1
68+
df[1][x].a[1] shouldBe 4
69+
}
70+
71+
@Test
72+
fun `create typed column group accessor`() {
73+
val df = dataFrameOf(
74+
dataFrameOf("a", "b")(1, 2, 3, 4).asColumnGroup("x")
75+
)
76+
val x by columnGroup<Schema>()
77+
df[x][0].a shouldBe 1
78+
df[1][x].a shouldBe 3
79+
}
5380
}

0 commit comments

Comments
 (0)