diff --git a/core/generated-sources/src/main/kotlin/org/jetbrains/kotlinx/dataframe/api/add.kt b/core/generated-sources/src/main/kotlin/org/jetbrains/kotlinx/dataframe/api/add.kt index ab8ccac54..ff7be2a15 100644 --- a/core/generated-sources/src/main/kotlin/org/jetbrains/kotlinx/dataframe/api/add.kt +++ b/core/generated-sources/src/main/kotlin/org/jetbrains/kotlinx/dataframe/api/add.kt @@ -174,8 +174,8 @@ public class AddDsl(@PublishedApi internal val df: DataFrame) : ColumnsCon noinline expression: RowExpression ): Boolean = add(df.mapToColumn(name, infer, expression)) - public inline fun expr(noinline expression: RowExpression): DataColumn { - return df.mapToColumn("", Infer.Nulls, expression) + public inline fun expr(infer: Infer = Infer.Nulls, noinline expression: RowExpression): DataColumn { + return df.mapToColumn("", infer, expression) } public inline infix fun String.from(noinline expression: RowExpression): Boolean = diff --git a/core/generated-sources/src/main/kotlin/org/jetbrains/kotlinx/dataframe/api/toDataFrame.kt b/core/generated-sources/src/main/kotlin/org/jetbrains/kotlinx/dataframe/api/toDataFrame.kt index c755f0617..4cf7f2319 100644 --- a/core/generated-sources/src/main/kotlin/org/jetbrains/kotlinx/dataframe/api/toDataFrame.kt +++ b/core/generated-sources/src/main/kotlin/org/jetbrains/kotlinx/dataframe/api/toDataFrame.kt @@ -153,8 +153,8 @@ public abstract class CreateDataFrameDsl : TraversePropertiesDsl { body: (TraversePropertiesDsl.() -> Unit)? = null, ) - public inline fun expr(noinline expression: (T) -> R): DataColumn = - source.map { expression(it) }.toColumn() + public inline fun expr(infer: Infer = Infer.Nulls, noinline expression: (T) -> R): DataColumn = + source.map { expression(it) }.toColumn(infer = infer) public inline fun add(name: String, noinline expression: (T) -> R): Unit = add(source.map { expression(it) }.toColumn(name, Infer.Nulls)) @@ -165,6 +165,9 @@ public abstract class CreateDataFrameDsl : TraversePropertiesDsl { public inline infix fun KProperty.from(noinline expression: (T) -> R): Unit = add(columnName, expression) + public inline infix fun String.from(inferType: InferType): Unit = + add(DataColumn.createWithTypeInference(this, source.map { inferType.expression(it) })) + public inline infix fun KProperty.from(inferType: InferType): Unit = add(DataColumn.createWithTypeInference(columnName, source.map { inferType.expression(it) })) diff --git a/core/generated-sources/src/test/kotlin/org/jetbrains/kotlinx/dataframe/api/toDataFrame.kt b/core/generated-sources/src/test/kotlin/org/jetbrains/kotlinx/dataframe/api/toDataFrame.kt index d29ae4ef8..0b42c3dc4 100644 --- a/core/generated-sources/src/test/kotlin/org/jetbrains/kotlinx/dataframe/api/toDataFrame.kt +++ b/core/generated-sources/src/test/kotlin/org/jetbrains/kotlinx/dataframe/api/toDataFrame.kt @@ -60,6 +60,21 @@ class CreateDataFrameTests { res["e"].type() shouldBe typeOf() } + @Test + fun `create column with infer type`() { + val data: List = listOf(1, 2, 3) + val res = data.toDataFrame { + "e" from inferType { it } + expr(infer = Infer.Type) { it } into "d" + } + + res["e"].type() shouldBe typeOf() + res["e"].kind() shouldBe ColumnKind.Value + + res["d"].type() shouldBe typeOf() + res["d"].kind() shouldBe ColumnKind.Value + } + @Test fun `preserve fields order`() { class B(val x: Int, val c: String, d: Double) { diff --git a/core/generated-sources/src/test/kotlin/org/jetbrains/kotlinx/dataframe/testSets/person/DataFrameTests.kt b/core/generated-sources/src/test/kotlin/org/jetbrains/kotlinx/dataframe/testSets/person/DataFrameTests.kt index fe693bec9..59f3d6d02 100644 --- a/core/generated-sources/src/test/kotlin/org/jetbrains/kotlinx/dataframe/testSets/person/DataFrameTests.kt +++ b/core/generated-sources/src/test/kotlin/org/jetbrains/kotlinx/dataframe/testSets/person/DataFrameTests.kt @@ -15,6 +15,7 @@ import org.jetbrains.kotlinx.dataframe.annotations.ColumnName import org.jetbrains.kotlinx.dataframe.annotations.DataSchema import org.jetbrains.kotlinx.dataframe.api.ExcessiveColumns import org.jetbrains.kotlinx.dataframe.api.GroupBy +import org.jetbrains.kotlinx.dataframe.api.Infer import org.jetbrains.kotlinx.dataframe.api.ParserOptions import org.jetbrains.kotlinx.dataframe.api.add import org.jetbrains.kotlinx.dataframe.api.addAll @@ -182,6 +183,7 @@ import org.jetbrains.kotlinx.dataframe.size import org.jetbrains.kotlinx.dataframe.type import org.jetbrains.kotlinx.dataframe.typeClass import org.junit.Test +import java.lang.reflect.Type import java.math.BigDecimal import java.time.LocalDate import kotlin.reflect.jvm.jvmErasure @@ -919,6 +921,15 @@ class DataFrameTests : BaseTest() { } } + @Test + fun `add several columns with type inference`() { + val f: Any = 123 + val df = typed.add { + expr(infer = Infer.Type) { f } into "f" + } + df["f"].type() shouldBe typeOf() + } + @Test fun `remove one column`() { val expected = listOf("name", "city", "weight") diff --git a/core/src/main/kotlin/org/jetbrains/kotlinx/dataframe/api/add.kt b/core/src/main/kotlin/org/jetbrains/kotlinx/dataframe/api/add.kt index ab8ccac54..ff7be2a15 100644 --- a/core/src/main/kotlin/org/jetbrains/kotlinx/dataframe/api/add.kt +++ b/core/src/main/kotlin/org/jetbrains/kotlinx/dataframe/api/add.kt @@ -174,8 +174,8 @@ public class AddDsl(@PublishedApi internal val df: DataFrame) : ColumnsCon noinline expression: RowExpression ): Boolean = add(df.mapToColumn(name, infer, expression)) - public inline fun expr(noinline expression: RowExpression): DataColumn { - return df.mapToColumn("", Infer.Nulls, expression) + public inline fun expr(infer: Infer = Infer.Nulls, noinline expression: RowExpression): DataColumn { + return df.mapToColumn("", infer, expression) } public inline infix fun String.from(noinline expression: RowExpression): Boolean = diff --git a/core/src/main/kotlin/org/jetbrains/kotlinx/dataframe/api/toDataFrame.kt b/core/src/main/kotlin/org/jetbrains/kotlinx/dataframe/api/toDataFrame.kt index c755f0617..4cf7f2319 100644 --- a/core/src/main/kotlin/org/jetbrains/kotlinx/dataframe/api/toDataFrame.kt +++ b/core/src/main/kotlin/org/jetbrains/kotlinx/dataframe/api/toDataFrame.kt @@ -153,8 +153,8 @@ public abstract class CreateDataFrameDsl : TraversePropertiesDsl { body: (TraversePropertiesDsl.() -> Unit)? = null, ) - public inline fun expr(noinline expression: (T) -> R): DataColumn = - source.map { expression(it) }.toColumn() + public inline fun expr(infer: Infer = Infer.Nulls, noinline expression: (T) -> R): DataColumn = + source.map { expression(it) }.toColumn(infer = infer) public inline fun add(name: String, noinline expression: (T) -> R): Unit = add(source.map { expression(it) }.toColumn(name, Infer.Nulls)) @@ -165,6 +165,9 @@ public abstract class CreateDataFrameDsl : TraversePropertiesDsl { public inline infix fun KProperty.from(noinline expression: (T) -> R): Unit = add(columnName, expression) + public inline infix fun String.from(inferType: InferType): Unit = + add(DataColumn.createWithTypeInference(this, source.map { inferType.expression(it) })) + public inline infix fun KProperty.from(inferType: InferType): Unit = add(DataColumn.createWithTypeInference(columnName, source.map { inferType.expression(it) })) diff --git a/core/src/test/kotlin/org/jetbrains/kotlinx/dataframe/api/toDataFrame.kt b/core/src/test/kotlin/org/jetbrains/kotlinx/dataframe/api/toDataFrame.kt index d29ae4ef8..0b42c3dc4 100644 --- a/core/src/test/kotlin/org/jetbrains/kotlinx/dataframe/api/toDataFrame.kt +++ b/core/src/test/kotlin/org/jetbrains/kotlinx/dataframe/api/toDataFrame.kt @@ -60,6 +60,21 @@ class CreateDataFrameTests { res["e"].type() shouldBe typeOf() } + @Test + fun `create column with infer type`() { + val data: List = listOf(1, 2, 3) + val res = data.toDataFrame { + "e" from inferType { it } + expr(infer = Infer.Type) { it } into "d" + } + + res["e"].type() shouldBe typeOf() + res["e"].kind() shouldBe ColumnKind.Value + + res["d"].type() shouldBe typeOf() + res["d"].kind() shouldBe ColumnKind.Value + } + @Test fun `preserve fields order`() { class B(val x: Int, val c: String, d: Double) { diff --git a/core/src/test/kotlin/org/jetbrains/kotlinx/dataframe/testSets/person/DataFrameTests.kt b/core/src/test/kotlin/org/jetbrains/kotlinx/dataframe/testSets/person/DataFrameTests.kt index fe693bec9..59f3d6d02 100644 --- a/core/src/test/kotlin/org/jetbrains/kotlinx/dataframe/testSets/person/DataFrameTests.kt +++ b/core/src/test/kotlin/org/jetbrains/kotlinx/dataframe/testSets/person/DataFrameTests.kt @@ -15,6 +15,7 @@ import org.jetbrains.kotlinx.dataframe.annotations.ColumnName import org.jetbrains.kotlinx.dataframe.annotations.DataSchema import org.jetbrains.kotlinx.dataframe.api.ExcessiveColumns import org.jetbrains.kotlinx.dataframe.api.GroupBy +import org.jetbrains.kotlinx.dataframe.api.Infer import org.jetbrains.kotlinx.dataframe.api.ParserOptions import org.jetbrains.kotlinx.dataframe.api.add import org.jetbrains.kotlinx.dataframe.api.addAll @@ -182,6 +183,7 @@ import org.jetbrains.kotlinx.dataframe.size import org.jetbrains.kotlinx.dataframe.type import org.jetbrains.kotlinx.dataframe.typeClass import org.junit.Test +import java.lang.reflect.Type import java.math.BigDecimal import java.time.LocalDate import kotlin.reflect.jvm.jvmErasure @@ -919,6 +921,15 @@ class DataFrameTests : BaseTest() { } } + @Test + fun `add several columns with type inference`() { + val f: Any = 123 + val df = typed.add { + expr(infer = Infer.Type) { f } into "f" + } + df["f"].type() shouldBe typeOf() + } + @Test fun `remove one column`() { val expected = listOf("name", "city", "weight")