Skip to content

Commit 739133b

Browse files
authored
Merge pull request #579 from Kotlin/inferType-parameters
add infer types parameter in DSL functions
2 parents a2f749b + db74efb commit 739133b

File tree

8 files changed

+66
-8
lines changed

8 files changed

+66
-8
lines changed

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

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -174,8 +174,8 @@ public class AddDsl<T>(@PublishedApi internal val df: DataFrame<T>) : ColumnsCon
174174
noinline expression: RowExpression<T, R>
175175
): Boolean = add(df.mapToColumn(name, infer, expression))
176176

177-
public inline fun <reified R> expr(noinline expression: RowExpression<T, R>): DataColumn<R> {
178-
return df.mapToColumn("", Infer.Nulls, expression)
177+
public inline fun <reified R> expr(infer: Infer = Infer.Nulls, noinline expression: RowExpression<T, R>): DataColumn<R> {
178+
return df.mapToColumn("", infer, expression)
179179
}
180180

181181
public inline infix fun <reified R> String.from(noinline expression: RowExpression<T, R>): Boolean =

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

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -153,8 +153,8 @@ public abstract class CreateDataFrameDsl<T> : TraversePropertiesDsl {
153153
body: (TraversePropertiesDsl.() -> Unit)? = null,
154154
)
155155

156-
public inline fun <reified R> expr(noinline expression: (T) -> R): DataColumn<R> =
157-
source.map { expression(it) }.toColumn()
156+
public inline fun <reified R> expr(infer: Infer = Infer.Nulls, noinline expression: (T) -> R): DataColumn<R> =
157+
source.map { expression(it) }.toColumn(infer = infer)
158158

159159
public inline fun <reified R> add(name: String, noinline expression: (T) -> R): Unit =
160160
add(source.map { expression(it) }.toColumn(name, Infer.Nulls))
@@ -165,6 +165,9 @@ public abstract class CreateDataFrameDsl<T> : TraversePropertiesDsl {
165165
public inline infix fun <reified R> KProperty<R>.from(noinline expression: (T) -> R): Unit =
166166
add(columnName, expression)
167167

168+
public inline infix fun <reified R> String.from(inferType: InferType<T, R>): Unit =
169+
add(DataColumn.createWithTypeInference(this, source.map { inferType.expression(it) }))
170+
168171
public inline infix fun <reified R> KProperty<R>.from(inferType: InferType<T, R>): Unit =
169172
add(DataColumn.createWithTypeInference(columnName, source.map { inferType.expression(it) }))
170173

core/generated-sources/src/test/kotlin/org/jetbrains/kotlinx/dataframe/api/toDataFrame.kt

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -60,6 +60,21 @@ class CreateDataFrameTests {
6060
res["e"].type() shouldBe typeOf<Int>()
6161
}
6262

63+
@Test
64+
fun `create column with infer type`() {
65+
val data: List<Any> = listOf(1, 2, 3)
66+
val res = data.toDataFrame {
67+
"e" from inferType { it }
68+
expr(infer = Infer.Type) { it } into "d"
69+
}
70+
71+
res["e"].type() shouldBe typeOf<Int>()
72+
res["e"].kind() shouldBe ColumnKind.Value
73+
74+
res["d"].type() shouldBe typeOf<Int>()
75+
res["d"].kind() shouldBe ColumnKind.Value
76+
}
77+
6378
@Test
6479
fun `preserve fields order`() {
6580
class B(val x: Int, val c: String, d: Double) {

core/generated-sources/src/test/kotlin/org/jetbrains/kotlinx/dataframe/testSets/person/DataFrameTests.kt

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@ import org.jetbrains.kotlinx.dataframe.annotations.ColumnName
1515
import org.jetbrains.kotlinx.dataframe.annotations.DataSchema
1616
import org.jetbrains.kotlinx.dataframe.api.ExcessiveColumns
1717
import org.jetbrains.kotlinx.dataframe.api.GroupBy
18+
import org.jetbrains.kotlinx.dataframe.api.Infer
1819
import org.jetbrains.kotlinx.dataframe.api.ParserOptions
1920
import org.jetbrains.kotlinx.dataframe.api.add
2021
import org.jetbrains.kotlinx.dataframe.api.addAll
@@ -182,6 +183,7 @@ import org.jetbrains.kotlinx.dataframe.size
182183
import org.jetbrains.kotlinx.dataframe.type
183184
import org.jetbrains.kotlinx.dataframe.typeClass
184185
import org.junit.Test
186+
import java.lang.reflect.Type
185187
import java.math.BigDecimal
186188
import java.time.LocalDate
187189
import kotlin.reflect.jvm.jvmErasure
@@ -919,6 +921,15 @@ class DataFrameTests : BaseTest() {
919921
}
920922
}
921923

924+
@Test
925+
fun `add several columns with type inference`() {
926+
val f: Any = 123
927+
val df = typed.add {
928+
expr(infer = Infer.Type) { f } into "f"
929+
}
930+
df["f"].type() shouldBe typeOf<Int>()
931+
}
932+
922933
@Test
923934
fun `remove one column`() {
924935
val expected = listOf("name", "city", "weight")

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

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -174,8 +174,8 @@ public class AddDsl<T>(@PublishedApi internal val df: DataFrame<T>) : ColumnsCon
174174
noinline expression: RowExpression<T, R>
175175
): Boolean = add(df.mapToColumn(name, infer, expression))
176176

177-
public inline fun <reified R> expr(noinline expression: RowExpression<T, R>): DataColumn<R> {
178-
return df.mapToColumn("", Infer.Nulls, expression)
177+
public inline fun <reified R> expr(infer: Infer = Infer.Nulls, noinline expression: RowExpression<T, R>): DataColumn<R> {
178+
return df.mapToColumn("", infer, expression)
179179
}
180180

181181
public inline infix fun <reified R> String.from(noinline expression: RowExpression<T, R>): Boolean =

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

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -153,8 +153,8 @@ public abstract class CreateDataFrameDsl<T> : TraversePropertiesDsl {
153153
body: (TraversePropertiesDsl.() -> Unit)? = null,
154154
)
155155

156-
public inline fun <reified R> expr(noinline expression: (T) -> R): DataColumn<R> =
157-
source.map { expression(it) }.toColumn()
156+
public inline fun <reified R> expr(infer: Infer = Infer.Nulls, noinline expression: (T) -> R): DataColumn<R> =
157+
source.map { expression(it) }.toColumn(infer = infer)
158158

159159
public inline fun <reified R> add(name: String, noinline expression: (T) -> R): Unit =
160160
add(source.map { expression(it) }.toColumn(name, Infer.Nulls))
@@ -165,6 +165,9 @@ public abstract class CreateDataFrameDsl<T> : TraversePropertiesDsl {
165165
public inline infix fun <reified R> KProperty<R>.from(noinline expression: (T) -> R): Unit =
166166
add(columnName, expression)
167167

168+
public inline infix fun <reified R> String.from(inferType: InferType<T, R>): Unit =
169+
add(DataColumn.createWithTypeInference(this, source.map { inferType.expression(it) }))
170+
168171
public inline infix fun <reified R> KProperty<R>.from(inferType: InferType<T, R>): Unit =
169172
add(DataColumn.createWithTypeInference(columnName, source.map { inferType.expression(it) }))
170173

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

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -60,6 +60,21 @@ class CreateDataFrameTests {
6060
res["e"].type() shouldBe typeOf<Int>()
6161
}
6262

63+
@Test
64+
fun `create column with infer type`() {
65+
val data: List<Any> = listOf(1, 2, 3)
66+
val res = data.toDataFrame {
67+
"e" from inferType { it }
68+
expr(infer = Infer.Type) { it } into "d"
69+
}
70+
71+
res["e"].type() shouldBe typeOf<Int>()
72+
res["e"].kind() shouldBe ColumnKind.Value
73+
74+
res["d"].type() shouldBe typeOf<Int>()
75+
res["d"].kind() shouldBe ColumnKind.Value
76+
}
77+
6378
@Test
6479
fun `preserve fields order`() {
6580
class B(val x: Int, val c: String, d: Double) {

core/src/test/kotlin/org/jetbrains/kotlinx/dataframe/testSets/person/DataFrameTests.kt

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@ import org.jetbrains.kotlinx.dataframe.annotations.ColumnName
1515
import org.jetbrains.kotlinx.dataframe.annotations.DataSchema
1616
import org.jetbrains.kotlinx.dataframe.api.ExcessiveColumns
1717
import org.jetbrains.kotlinx.dataframe.api.GroupBy
18+
import org.jetbrains.kotlinx.dataframe.api.Infer
1819
import org.jetbrains.kotlinx.dataframe.api.ParserOptions
1920
import org.jetbrains.kotlinx.dataframe.api.add
2021
import org.jetbrains.kotlinx.dataframe.api.addAll
@@ -182,6 +183,7 @@ import org.jetbrains.kotlinx.dataframe.size
182183
import org.jetbrains.kotlinx.dataframe.type
183184
import org.jetbrains.kotlinx.dataframe.typeClass
184185
import org.junit.Test
186+
import java.lang.reflect.Type
185187
import java.math.BigDecimal
186188
import java.time.LocalDate
187189
import kotlin.reflect.jvm.jvmErasure
@@ -919,6 +921,15 @@ class DataFrameTests : BaseTest() {
919921
}
920922
}
921923

924+
@Test
925+
fun `add several columns with type inference`() {
926+
val f: Any = 123
927+
val df = typed.add {
928+
expr(infer = Infer.Type) { f } into "f"
929+
}
930+
df["f"].type() shouldBe typeOf<Int>()
931+
}
932+
922933
@Test
923934
fun `remove one column`() {
924935
val expected = listOf("name", "city", "weight")

0 commit comments

Comments
 (0)