Skip to content

Commit a00602b

Browse files
authored
Added 3 APIs for Flatten function (#307)
* Added 3 APIs for Flatten function * Fixed the review
1 parent a32deb8 commit a00602b

File tree

4 files changed

+102
-4
lines changed

4 files changed

+102
-4
lines changed

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

Lines changed: 11 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -2,14 +2,22 @@ package org.jetbrains.kotlinx.dataframe.api
22

33
import org.jetbrains.kotlinx.dataframe.ColumnsSelector
44
import org.jetbrains.kotlinx.dataframe.DataFrame
5+
import org.jetbrains.kotlinx.dataframe.columns.ColumnReference
56
import org.jetbrains.kotlinx.dataframe.impl.api.flattenImpl
7+
import org.jetbrains.kotlinx.dataframe.impl.columns.toColumns
8+
import kotlin.reflect.KProperty
69

710
// region DataFrame
811

912
public fun <T> DataFrame<T>.flatten(): DataFrame<T> = flatten { all() }
1013

11-
public fun <T, C> DataFrame<T>.flatten(
12-
columns: ColumnsSelector<T, C>
13-
): DataFrame<T> = flattenImpl(columns)
14+
public fun <T, C> DataFrame<T>.flatten(columns: ColumnsSelector<T, C>): DataFrame<T> = flattenImpl(columns)
15+
16+
public fun <T> DataFrame<T>.flatten(vararg columns: String): DataFrame<T> = flattenImpl { columns.toColumns() }
17+
18+
public fun <T, C> DataFrame<T>.flatten(vararg columns: KProperty<C>): DataFrame<T> = flattenImpl { columns.toColumns() }
19+
20+
public fun <T, C> DataFrame<T>.flatten(vararg columns: ColumnReference<C>): DataFrame<T> =
21+
flattenImpl { columns.toColumns() }
1422

1523
// endregion

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

Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,8 @@
11
package org.jetbrains.kotlinx.dataframe.api
22

33
import io.kotest.matchers.shouldBe
4+
import org.jetbrains.kotlinx.dataframe.DataRow
5+
import org.jetbrains.kotlinx.dataframe.annotations.DataSchema
46
import org.junit.Test
57

68
class FlattenTests {
@@ -13,6 +15,41 @@ class FlattenTests {
1315
grouped.add("a") { 0 }.flatten().columnNames() shouldBe listOf("a1", "b", "c", "a")
1416
}
1517

18+
@DataSchema
19+
interface TestRow {
20+
val a: String
21+
val b: String
22+
val c: String
23+
}
24+
25+
@DataSchema
26+
interface Grouped {
27+
val d: DataRow<TestRow>
28+
}
29+
30+
@Test
31+
fun `flatten access APIs`() {
32+
val df = dataFrameOf("a", "b", "c")(1, 2, 3)
33+
val grouped = df.group("a", "b").into("d")
34+
35+
// String API
36+
grouped.flatten("d") shouldBe df
37+
val castedGroupedDF = grouped.cast<Grouped>()
38+
39+
// KProperties API
40+
castedGroupedDF.flatten(Grouped::d) shouldBe df
41+
42+
// Extension properties API
43+
castedGroupedDF.flatten { d } shouldBe df
44+
45+
// Column accessors API
46+
val d by columnGroup()
47+
val a by d.column<String>()
48+
val b by d.column<String>()
49+
val c by d.column<String>()
50+
grouped.flatten(d) shouldBe df
51+
}
52+
1653
@Test
1754
fun `flatten nested`() {
1855
val df = dataFrameOf("a", "b", "c", "d")(1, 2, 3, 4)

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

Lines changed: 31 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1052,14 +1052,44 @@ class Modify : TestBase() {
10521052
}
10531053

10541054
@Test
1055-
fun flatten() {
1055+
fun flatten_properties() {
10561056
// SampleStart
10571057
// name.firstName -> firstName
10581058
// name.lastName -> lastName
10591059
df.flatten { name }
10601060
// SampleEnd
10611061
}
10621062

1063+
@Test
1064+
fun flatten_strings() {
1065+
// SampleStart
1066+
// name.firstName -> firstName
1067+
// name.lastName -> lastName
1068+
df.flatten("name")
1069+
// SampleEnd
1070+
}
1071+
1072+
@Test
1073+
fun flatten_accessors() {
1074+
// SampleStart
1075+
val name by columnGroup()
1076+
val firstName by name.column<String>()
1077+
val lastName by name.column<String>()
1078+
// name.firstName -> firstName
1079+
// name.lastName -> lastName
1080+
df.flatten(name)
1081+
// SampleEnd
1082+
}
1083+
1084+
@Test
1085+
fun flatten_KProperties() {
1086+
// SampleStart
1087+
// name.firstName -> firstName
1088+
// name.lastName -> lastName
1089+
df.flatten(df::name)
1090+
// SampleEnd
1091+
}
1092+
10631093
@Test
10641094
fun flattenAll() {
10651095
// SampleStart

docs/StardustDocs/topics/flatten.md

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,13 +11,36 @@ flatten [ { columns } ]
1111
Columns after flattening will keep their original names. Potential column name clashes are resolved by adding minimal possible name prefix from ancestor columns.
1212

1313
<!---FUN flatten-->
14+
<tabs>
15+
<tab title="Properties">
1416

1517
```kotlin
1618
// name.firstName -> firstName
1719
// name.lastName -> lastName
1820
df.flatten { name }
1921
```
2022

23+
</tab>
24+
<tab title="Accessors">
25+
26+
```kotlin
27+
val name by columnGroup()
28+
val firstName by name.column<String>()
29+
val lastName by name.column<String>()
30+
31+
// name.firstName -> firstName
32+
// name.lastName -> lastName
33+
df.flatten(name)
34+
```
35+
36+
</tab>
37+
<tab title="Strings">
38+
39+
```kotlin
40+
df.flatten("name")
41+
```
42+
43+
</tab></tabs>
2144
<!---END-->
2245

2346
To remove all column groupings in [`DataFrame`](DataFrame.md), invoke `flatten` without parameters:

0 commit comments

Comments
 (0)