Skip to content

Commit 3aa5f22

Browse files
committed
final update from master
1 parent 234be05 commit 3aa5f22

File tree

5 files changed

+120
-2
lines changed

5 files changed

+120
-2
lines changed

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

Lines changed: 78 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@ import org.jetbrains.kotlinx.dataframe.ColumnsSelector
77
import org.jetbrains.kotlinx.dataframe.DataColumn
88
import org.jetbrains.kotlinx.dataframe.DataFrame
99
import org.jetbrains.kotlinx.dataframe.DataRow
10+
import org.jetbrains.kotlinx.dataframe.annotations.DataSchema
1011
import org.jetbrains.kotlinx.dataframe.columns.ColumnPath
1112
import org.jetbrains.kotlinx.dataframe.impl.ColumnNameGenerator
1213
import org.jetbrains.kotlinx.dataframe.impl.api.createDataFrameImpl
@@ -190,6 +191,83 @@ public abstract class CreateDataFrameDsl<T> : TraversePropertiesDsl {
190191

191192
// endregion
192193

194+
// region toDataFrame overloads for built-in types
195+
196+
/*
197+
Without overloads Iterable<String>.toDataFrame produces unexpected result
198+
199+
200+
```
201+
val string = listOf("aaa", "aa", null)
202+
string.toDataFrame()
203+
```
204+
=>
205+
length
206+
0 3
207+
1 2
208+
2 null
209+
*/
210+
211+
@JvmName("toDataFrameByte")
212+
public inline fun <reified B : Byte?> Iterable<B>.toDataFrame(): DataFrame<ValueProperty<B>> = toDataFrame {
213+
ValueProperty<B>::value from { it }
214+
}.cast()
215+
216+
@JvmName("toDataFrameShort")
217+
public inline fun <reified S : Short?> Iterable<S>.toDataFrame(): DataFrame<ValueProperty<S>> = toDataFrame {
218+
ValueProperty<S>::value from { it }
219+
}.cast()
220+
221+
@JvmName("toDataFrameInt")
222+
public inline fun <reified I : Int?> Iterable<I>.toDataFrame(): DataFrame<ValueProperty<I>> = toDataFrame {
223+
ValueProperty<I>::value from { it }
224+
}.cast()
225+
226+
@JvmName("toDataFrameLong")
227+
public inline fun <reified L : Long?> Iterable<L>.toDataFrame(): DataFrame<ValueProperty<L>> = toDataFrame {
228+
ValueProperty<L>::value from { it }
229+
}.cast()
230+
231+
@JvmName("toDataFrameString")
232+
public inline fun <reified S : String?> Iterable<S>.toDataFrame(): DataFrame<ValueProperty<S>> = toDataFrame {
233+
ValueProperty<S>::value from { it }
234+
}.cast()
235+
236+
@JvmName("toDataFrameChar")
237+
public inline fun <reified C : Char?> Iterable<C>.toDataFrame(): DataFrame<ValueProperty<C>> = toDataFrame {
238+
ValueProperty<C>::value from { it }
239+
}.cast()
240+
241+
@JvmName("toDataFrameBoolean")
242+
public inline fun <reified B : Boolean?> Iterable<B>.toDataFrame(): DataFrame<ValueProperty<B>> = toDataFrame {
243+
ValueProperty<B>::value from { it }
244+
}.cast()
245+
246+
@JvmName("toDataFrameUByte")
247+
public inline fun <reified U : UByte?> Iterable<U>.toDataFrame(): DataFrame<ValueProperty<U>> = toDataFrame {
248+
ValueProperty<U>::value from { it }
249+
}.cast()
250+
251+
@JvmName("toDataFrameUShort")
252+
public inline fun <reified U : UShort?> Iterable<U>.toDataFrame(): DataFrame<ValueProperty<U>> = toDataFrame {
253+
ValueProperty<U>::value from { it }
254+
}.cast()
255+
256+
@JvmName("toDataFrameUInt")
257+
public inline fun <reified U : UInt?> Iterable<U>.toDataFrame(): DataFrame<ValueProperty<U>> = toDataFrame {
258+
ValueProperty<U>::value from { it }
259+
}.cast()
260+
261+
@JvmName("toDataFrameULong")
262+
public inline fun <reified U : ULong?> Iterable<U>.toDataFrame(): DataFrame<ValueProperty<U>> = toDataFrame {
263+
ValueProperty<U>::value from { it }
264+
}.cast()
265+
266+
@DataSchema
267+
public interface ValueProperty<T> {
268+
public val value: T
269+
}
270+
193271
// region Create DataFrame from Map
194272

195273
public fun Map<String, Iterable<Any?>>.toDataFrame(): AnyFrame {

core/generated-sources/src/main/kotlin/org/jetbrains/kotlinx/dataframe/documentation/AccessApi.kt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -132,4 +132,4 @@ internal interface AccessApi {
132132
}
133133

134134
/** [Access API][AccessApi] */
135-
public const val AccessApiLink: Int = 0
135+
internal interface AccessApiLink

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

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,10 +3,12 @@ package org.jetbrains.kotlinx.dataframe.api
33
import io.kotest.matchers.shouldBe
44
import org.jetbrains.kotlinx.dataframe.DataFrame
55
import org.jetbrains.kotlinx.dataframe.DataRow
6+
import org.jetbrains.kotlinx.dataframe.alsoDebug
67
import org.jetbrains.kotlinx.dataframe.annotations.DataSchema
78
import org.jetbrains.kotlinx.dataframe.columns.ColumnKind
89
import org.jetbrains.kotlinx.dataframe.kind
910
import org.jetbrains.kotlinx.dataframe.type
11+
import org.junit.Ignore
1012
import org.junit.Test
1113
import kotlin.reflect.typeOf
1214

@@ -197,4 +199,29 @@ class CreateDataFrameTests {
197199

198200
df["name"][0] shouldBe name
199201
}
202+
203+
@Test
204+
fun builtInTypes() {
205+
val string = listOf("aaa", "aa", null)
206+
string.toDataFrame().also { it.print() } shouldBe dataFrameOf("value")(*string.toTypedArray())
207+
208+
val int = listOf(1, 2, 3)
209+
int.toDataFrame().alsoDebug() shouldBe dataFrameOf("value")(*int.toTypedArray())
210+
}
211+
212+
@Ignore
213+
@Test
214+
fun generateBuiltInsOverrides() {
215+
listOf("Byte", "Short", "Int", "Long", "String", "Char", "Boolean", "UByte", "UShort", "UInt", "ULong").forEach { type ->
216+
val typeParameter = type.first()
217+
val func = """
218+
@JvmName("toDataFrame$type")
219+
public inline fun <reified $typeParameter : $type?> Iterable<$typeParameter>.toDataFrame(): DataFrame<ValueProperty<$typeParameter>> = toDataFrame {
220+
ValueProperty<$typeParameter>::value from { it }
221+
}.cast()
222+
""".trimIndent()
223+
println(func)
224+
println()
225+
}
226+
}
200227
}

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

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,9 @@
11
package org.jetbrains.kotlinx.dataframe.samples.api
22

33
import io.kotest.matchers.shouldBe
4+
import org.jetbrains.kotlinx.dataframe.DataFrame
45
import org.jetbrains.kotlinx.dataframe.api.Infer
6+
import org.jetbrains.kotlinx.dataframe.api.ValueProperty
57
import org.jetbrains.kotlinx.dataframe.api.add
68
import org.jetbrains.kotlinx.dataframe.api.column
79
import org.jetbrains.kotlinx.dataframe.api.columnGroup
@@ -18,6 +20,7 @@ import org.jetbrains.kotlinx.dataframe.api.sortBy
1820
import org.jetbrains.kotlinx.dataframe.api.toColumn
1921
import org.jetbrains.kotlinx.dataframe.api.toColumnOf
2022
import org.jetbrains.kotlinx.dataframe.api.toDataFrame
23+
import org.jetbrains.kotlinx.dataframe.api.value
2124
import org.jetbrains.kotlinx.dataframe.api.withValues
2225
import org.jetbrains.kotlinx.dataframe.columns.ColumnKind
2326
import org.jetbrains.kotlinx.dataframe.kind
@@ -314,6 +317,16 @@ class Create : TestBase() {
314317
df["age"].type() shouldBe typeOf<Int>()
315318
}
316319

320+
@Test
321+
fun readDataFrameFromValues() {
322+
// SampleStart
323+
val names = listOf("Alice", "Bob", "Charlie")
324+
val df: DataFrame<ValueProperty<String>> = names.toDataFrame()
325+
df.add("length") { value.length }
326+
// SampleEnd
327+
df.value.toList() shouldBe names
328+
}
329+
317330
@Test
318331
fun readDataFrameFromObject() {
319332
// SampleStart

core/src/main/kotlin/org/jetbrains/kotlinx/dataframe/documentation/AccessApi.kt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -94,4 +94,4 @@ internal interface AccessApi {
9494
}
9595

9696
/** [Access API][AccessApi] */
97-
public const val AccessApiLink: Int = 0
97+
internal interface AccessApiLink

0 commit comments

Comments
 (0)