Skip to content

Commit 3448fc9

Browse files
authored
Merge pull request #1035 from Kotlin/supported-apis-1
More variations of "move", AddDsl.group, CreateDataFrameDsl String.invoke
2 parents 57a9768 + 8f8d368 commit 3448fc9

File tree

20 files changed

+731
-1
lines changed

20 files changed

+731
-1
lines changed

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

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -225,6 +225,7 @@ public class AddDsl<T>(
225225
@AccessApiOverload
226226
public fun group(column: AnyColumnGroupAccessor, body: AddDsl<T>.() -> Unit): Unit = group(column.name(), body)
227227

228+
@Interpretable("AddDslNamedGroup")
228229
public fun group(name: String, body: AddDsl<T>.() -> Unit) {
229230
val dsl = AddDsl(df)
230231
body(dsl)

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

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -83,6 +83,7 @@ public fun <T> InsertClause<T>.after(column: ColumnSelector<T, *>): DataFrame<T>
8383

8484
public fun <T> InsertClause<T>.after(column: String): DataFrame<T> = df.add(this.column).move(this.column).after(column)
8585

86+
@AccessApiOverload
8687
public fun <T> InsertClause<T>.after(column: ColumnAccessor<*>): DataFrame<T> = after(column.path())
8788

8889
@AccessApiOverload

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

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -53,10 +53,13 @@ public fun <T> DataFrame<T>.moveTo(newColumnIndex: Int, vararg columns: KPropert
5353

5454
// region moveToLeft
5555

56+
@Refine
57+
@Interpretable("MoveToLeft1")
5658
public fun <T> DataFrame<T>.moveToLeft(columns: ColumnsSelector<T, *>): DataFrame<T> = move(columns).toLeft()
5759

5860
public fun <T> DataFrame<T>.moveToLeft(vararg columns: String): DataFrame<T> = moveToLeft { columns.toColumnSet() }
5961

62+
@AccessApiOverload
6063
public fun <T> DataFrame<T>.moveToLeft(vararg columns: AnyColumnReference): DataFrame<T> =
6164
moveToLeft { columns.toColumnSet() }
6265

@@ -68,13 +71,17 @@ public fun <T> DataFrame<T>.moveToLeft(vararg columns: KProperty<*>): DataFrame<
6871

6972
// region moveToRight
7073

74+
@Refine
75+
@Interpretable("MoveToRight1")
7176
public fun <T> DataFrame<T>.moveToRight(columns: ColumnsSelector<T, *>): DataFrame<T> = move(columns).toRight()
7277

7378
public fun <T> DataFrame<T>.moveToRight(vararg columns: String): DataFrame<T> = moveToRight { columns.toColumnSet() }
7479

80+
@AccessApiOverload
7581
public fun <T> DataFrame<T>.moveToRight(vararg columns: AnyColumnReference): DataFrame<T> =
7682
moveToRight { columns.toColumnSet() }
7783

84+
@AccessApiOverload
7885
public fun <T> DataFrame<T>.moveToRight(vararg columns: KProperty<*>): DataFrame<T> =
7986
moveToRight { columns.toColumnSet() }
8087

@@ -94,6 +101,11 @@ public fun <T, C> MoveClause<T, C>.into(
94101
newPathExpression = column,
95102
)
96103

104+
/**
105+
* Move a single selected column to top level with a new name
106+
*/
107+
@Refine
108+
@Interpretable("MoveInto0")
97109
public fun <T, C> MoveClause<T, C>.into(column: String): DataFrame<T> = pathOf(column).let { path -> into { path } }
98110

99111
public fun <T, C> MoveClause<T, C>.intoIndexed(
@@ -109,11 +121,19 @@ public fun <T, C> MoveClause<T, C>.intoIndexed(
109121

110122
// region under
111123

124+
@Refine
125+
@Interpretable("MoveUnder0")
112126
public fun <T, C> MoveClause<T, C>.under(column: String): DataFrame<T> = pathOf(column).let { path -> under { path } }
113127

128+
@AccessApiOverload
114129
public fun <T, C> MoveClause<T, C>.under(column: AnyColumnGroupAccessor): DataFrame<T> =
115130
column.path().let { path -> under { path } }
116131

132+
/**
133+
* Move selected columns under existing column group
134+
*/
135+
@Refine
136+
@Interpretable("MoveUnder1")
117137
public fun <T, C> MoveClause<T, C>.under(
118138
column: ColumnsSelectionDsl<T>.(ColumnWithPath<C>) -> AnyColumnReference,
119139
): DataFrame<T> =
@@ -138,10 +158,13 @@ public fun <T, C> MoveClause<T, C>.toTop(
138158

139159
// region after
140160

161+
@Refine
162+
@Interpretable("MoveAfter0")
141163
public fun <T, C> MoveClause<T, C>.after(column: ColumnSelector<T, *>): DataFrame<T> = afterOrBefore(column, true)
142164

143165
public fun <T, C> MoveClause<T, C>.after(column: String): DataFrame<T> = after { column.toColumnAccessor() }
144166

167+
@AccessApiOverload
145168
public fun <T, C> MoveClause<T, C>.after(column: AnyColumnReference): DataFrame<T> = after { column }
146169

147170
@AccessApiOverload
@@ -157,8 +180,12 @@ fun <T, C> MoveColsClause<T, C>.before(column: String) = before { column.toColum
157180
fun <T, C> MoveColsClause<T, C>.before(column: ColumnSelector<T, *>) = afterOrBefore(column, false)
158181
*/
159182

183+
@Refine
184+
@Interpretable("MoveToLeft0")
160185
public fun <T, C> MoveClause<T, C>.toLeft(): DataFrame<T> = to(0)
161186

187+
@Refine
188+
@Interpretable("MoveToRight0")
162189
public fun <T, C> MoveClause<T, C>.toRight(): DataFrame<T> = to(df.ncol)
163190

164191
public class MoveClause<T, C>(internal val df: DataFrame<T>, internal val columns: ColumnsSelector<T, C>) {

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

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -202,6 +202,7 @@ public abstract class CreateDataFrameDsl<T> : TraversePropertiesDsl {
202202

203203
public inline fun <reified R> inferType(noinline expression: (T) -> R): InferType<T, R> = InferType(expression)
204204

205+
@Interpretable("ToDataFrameDslStringInvoke")
205206
public abstract operator fun String.invoke(builder: CreateDataFrameDsl<T>.() -> Unit)
206207
}
207208

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

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -795,4 +795,10 @@ class DataFrameTreeTests : BaseTest() {
795795
val df = typed2.convert { nameAndCity }.asFrame { it.remove { city } }
796796
df.nameAndCity.columns() shouldBe typed2.nameAndCity.remove { city }.columns()
797797
}
798+
799+
@Test
800+
fun `move under existing group`() {
801+
val df = typed2.move { age }.under { nameAndCity }
802+
df.nameAndCity.columnNames() shouldBe listOf("name", "city", "age")
803+
}
798804
}

plugins/kotlin-dataframe/src/org/jetbrains/kotlinx/dataframe/plugin/impl/api/add.kt

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -68,3 +68,15 @@ class AddDslStringInvoke : AbstractInterpreter<Unit>() {
6868
dsl.columns.add(SimpleColumnGroup(receiver, addDsl.columns))
6969
}
7070
}
71+
72+
class AddDslNamedGroup : AbstractInterpreter<Unit>() {
73+
val Arguments.dsl: AddDslApproximation by arg()
74+
val Arguments.name: String by arg()
75+
val Arguments.body by dsl()
76+
77+
override fun Arguments.interpret() {
78+
val addDsl = AddDslApproximation(mutableListOf())
79+
body(addDsl, emptyMap())
80+
dsl.columns.add(SimpleColumnGroup(name, addDsl.columns))
81+
}
82+
}

plugins/kotlin-dataframe/src/org/jetbrains/kotlinx/dataframe/plugin/impl/api/move.kt

Lines changed: 76 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,13 @@
11
package org.jetbrains.kotlinx.dataframe.plugin.impl.api
22

3+
import org.jetbrains.kotlinx.dataframe.api.after
4+
import org.jetbrains.kotlinx.dataframe.api.into
35
import org.jetbrains.kotlinx.dataframe.api.move
4-
import org.jetbrains.kotlinx.dataframe.api.pathOf
6+
import org.jetbrains.kotlinx.dataframe.api.moveToLeft
7+
import org.jetbrains.kotlinx.dataframe.api.toLeft
8+
import org.jetbrains.kotlinx.dataframe.api.toRight
59
import org.jetbrains.kotlinx.dataframe.api.toTop
10+
import org.jetbrains.kotlinx.dataframe.api.under
611
import org.jetbrains.kotlinx.dataframe.columns.toColumnSet
712
import org.jetbrains.kotlinx.dataframe.plugin.impl.AbstractInterpreter
813
import org.jetbrains.kotlinx.dataframe.plugin.impl.AbstractSchemaModificationInterpreter
@@ -30,4 +35,74 @@ class ToTop : AbstractSchemaModificationInterpreter() {
3035
}
3136
}
3237

38+
class MoveUnder0 : AbstractSchemaModificationInterpreter() {
39+
val Arguments.receiver: MoveClauseApproximation by arg()
40+
val Arguments.column: String by arg()
41+
42+
override fun Arguments.interpret(): PluginDataFrameSchema {
43+
val columns = receiver.columns.resolve(receiver.df).map { it.path }
44+
return receiver.df.asDataFrame().move { columns.toColumnSet() }.under(column).toPluginDataFrameSchema()
45+
}
46+
}
47+
48+
class MoveUnder1 : AbstractSchemaModificationInterpreter() {
49+
val Arguments.receiver: MoveClauseApproximation by arg()
50+
val Arguments.column: SingleColumnApproximation by arg()
51+
52+
override fun Arguments.interpret(): PluginDataFrameSchema {
53+
val columns = receiver.columns.resolve(receiver.df).map { it.path }
54+
return receiver.df.asDataFrame().move { columns.toColumnSet() }.under { column.col.path }.toPluginDataFrameSchema()
55+
}
56+
}
57+
58+
class MoveInto0 : AbstractSchemaModificationInterpreter() {
59+
val Arguments.receiver: MoveClauseApproximation by arg()
60+
val Arguments.column: String by arg()
61+
62+
override fun Arguments.interpret(): PluginDataFrameSchema {
63+
val columns = receiver.columns.resolve(receiver.df).map { it.path }
64+
return receiver.df.asDataFrame().move { columns.toColumnSet() }.into(column).toPluginDataFrameSchema()
65+
}
66+
}
67+
68+
class MoveToLeft0 : AbstractSchemaModificationInterpreter() {
69+
val Arguments.receiver: MoveClauseApproximation by arg()
70+
71+
override fun Arguments.interpret(): PluginDataFrameSchema {
72+
val columns = receiver.columns.resolve(receiver.df).map { it.path }
73+
return receiver.df.asDataFrame().move { columns.toColumnSet() }.toLeft().toPluginDataFrameSchema()
74+
}
75+
}
76+
77+
class MoveToLeft1 : AbstractSchemaModificationInterpreter() {
78+
val Arguments.receiver: PluginDataFrameSchema by dataFrame()
79+
val Arguments.columns: ColumnsResolver by arg()
80+
81+
override fun Arguments.interpret(): PluginDataFrameSchema {
82+
val columns = columns.resolve(receiver).map { it.path }
83+
return receiver.asDataFrame().moveToLeft { columns.toColumnSet() }.toPluginDataFrameSchema()
84+
}
85+
}
86+
87+
88+
class MoveToRight0 : AbstractSchemaModificationInterpreter() {
89+
val Arguments.receiver: MoveClauseApproximation by arg()
90+
91+
override fun Arguments.interpret(): PluginDataFrameSchema {
92+
val columns = receiver.columns.resolve(receiver.df).map { it.path }
93+
return receiver.df.asDataFrame().move { columns.toColumnSet() }.toRight().toPluginDataFrameSchema()
94+
}
95+
}
96+
97+
class MoveAfter0 : AbstractSchemaModificationInterpreter() {
98+
val Arguments.receiver: MoveClauseApproximation by arg()
99+
val Arguments.column: SingleColumnApproximation by arg()
100+
101+
override fun Arguments.interpret(): PluginDataFrameSchema {
102+
val columns = receiver.columns.resolve(receiver.df).map { it.path }
103+
return receiver.df.asDataFrame().move { columns.toColumnSet() }.after { column.col.path }.toPluginDataFrameSchema()
104+
}
105+
}
106+
107+
33108
class MoveClauseApproximation(val df: PluginDataFrameSchema, val columns: ColumnsResolver)

plugins/kotlin-dataframe/src/org/jetbrains/kotlinx/dataframe/plugin/impl/api/toDataFrame.kt

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -131,6 +131,18 @@ class Properties0 : AbstractInterpreter<Unit>() {
131131
}
132132
}
133133

134+
class ToDataFrameDslStringInvoke : AbstractInterpreter<Unit>() {
135+
val Arguments.dsl: CreateDataFrameDslImplApproximation by arg()
136+
val Arguments.receiver: String by arg()
137+
val Arguments.builder by dsl()
138+
139+
override fun Arguments.interpret() {
140+
val addDsl = CreateDataFrameDslImplApproximation()
141+
builder(addDsl, emptyMap())
142+
dsl.columns.add(SimpleColumnGroup(receiver, addDsl.columns))
143+
}
144+
}
145+
134146
class CreateDataFrameConfiguration {
135147
var maxDepth = DEFAULT_MAX_DEPTH
136148
var traverseConfiguration: TraverseConfiguration = TraverseConfiguration()

plugins/kotlin-dataframe/src/org/jetbrains/kotlinx/dataframe/plugin/loadInterpreter.kt

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -71,6 +71,7 @@ import org.jetbrains.kotlin.name.CallableId
7171
import org.jetbrains.kotlin.name.ClassId
7272
import org.jetbrains.kotlin.name.Name
7373
import org.jetbrains.kotlin.name.StandardClassIds
74+
import org.jetbrains.kotlinx.dataframe.plugin.impl.api.AddDslNamedGroup
7475
import org.jetbrains.kotlinx.dataframe.plugin.impl.api.AddDslStringInvoke
7576
import org.jetbrains.kotlinx.dataframe.plugin.impl.api.AddId
7677
import org.jetbrains.kotlinx.dataframe.plugin.impl.api.Aggregate
@@ -88,6 +89,13 @@ import org.jetbrains.kotlinx.dataframe.plugin.impl.api.FlattenDefault
8889
import org.jetbrains.kotlinx.dataframe.plugin.impl.api.FrameCols0
8990
import org.jetbrains.kotlinx.dataframe.plugin.impl.api.MapToFrame
9091
import org.jetbrains.kotlinx.dataframe.plugin.impl.api.Move0
92+
import org.jetbrains.kotlinx.dataframe.plugin.impl.api.MoveAfter0
93+
import org.jetbrains.kotlinx.dataframe.plugin.impl.api.MoveInto0
94+
import org.jetbrains.kotlinx.dataframe.plugin.impl.api.MoveToLeft0
95+
import org.jetbrains.kotlinx.dataframe.plugin.impl.api.MoveToLeft1
96+
import org.jetbrains.kotlinx.dataframe.plugin.impl.api.MoveToRight0
97+
import org.jetbrains.kotlinx.dataframe.plugin.impl.api.MoveUnder0
98+
import org.jetbrains.kotlinx.dataframe.plugin.impl.api.MoveUnder1
9199
import org.jetbrains.kotlinx.dataframe.plugin.impl.api.PairConstructor
92100
import org.jetbrains.kotlinx.dataframe.plugin.impl.api.PairToConstructor
93101
import org.jetbrains.kotlinx.dataframe.plugin.impl.api.ReadExcel
@@ -96,6 +104,7 @@ import org.jetbrains.kotlinx.dataframe.plugin.impl.api.ToDataFrame
96104
import org.jetbrains.kotlinx.dataframe.plugin.impl.api.ToDataFrameColumn
97105
import org.jetbrains.kotlinx.dataframe.plugin.impl.api.ToDataFrameDefault
98106
import org.jetbrains.kotlinx.dataframe.plugin.impl.api.ToDataFrameDsl
107+
import org.jetbrains.kotlinx.dataframe.plugin.impl.api.ToDataFrameDslStringInvoke
99108
import org.jetbrains.kotlinx.dataframe.plugin.impl.api.ToDataFrameFrom
100109
import org.jetbrains.kotlinx.dataframe.plugin.impl.api.ToTop
101110
import org.jetbrains.kotlinx.dataframe.plugin.impl.api.TrimMargin
@@ -235,6 +244,7 @@ internal inline fun <reified T> String.load(): T {
235244
"toDataFrameDsl" -> ToDataFrameDsl()
236245
"toDataFrame" -> ToDataFrame()
237246
"toDataFrameDefault" -> ToDataFrameDefault()
247+
"ToDataFrameDslStringInvoke" -> ToDataFrameDslStringInvoke()
238248
"DataFrameOf0" -> DataFrameOf0()
239249
"DataFrameBuilderInvoke0" -> DataFrameBuilderInvoke0()
240250
"ToDataFrameColumn" -> ToDataFrameColumn()
@@ -246,6 +256,7 @@ internal inline fun <reified T> String.load(): T {
246256
"FlattenDefault" -> FlattenDefault()
247257
"AddId" -> AddId()
248258
"AddDslStringInvoke" -> AddDslStringInvoke()
259+
"AddDslNamedGroup" -> AddDslNamedGroup()
249260
"MapToFrame" -> MapToFrame()
250261
"Move0" -> Move0()
251262
"ToTop" -> ToTop()
@@ -255,6 +266,13 @@ internal inline fun <reified T> String.load(): T {
255266
"ValueCounts" -> ValueCounts()
256267
"RenameToCamelCase" -> RenameToCamelCase()
257268
"RenameToCamelCaseClause" -> RenameToCamelCaseClause()
269+
"MoveUnder0" -> MoveUnder0()
270+
"MoveUnder1" -> MoveUnder1()
271+
"MoveInto0" -> MoveInto0()
272+
"MoveToLeft0" -> MoveToLeft0()
273+
"MoveToLeft1" -> MoveToLeft1()
274+
"MoveToRight0" -> MoveToRight0()
275+
"MoveAfter0" -> MoveAfter0()
258276
else -> error("$this")
259277
} as T
260278
}

plugins/kotlin-dataframe/testData/box/addDsl.kt

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,8 +9,12 @@ fun box(): String {
99
"group" {
1010
"a" from { it }
1111
}
12+
group("group1") {
13+
"b" from { it }
14+
}
1215
}
1316

1417
df.group.a
18+
df.group1.b
1519
return "OK"
1620
}

0 commit comments

Comments
 (0)