Skip to content

Commit 356f5a0

Browse files
committed
[Compiler plugin] Support move to and insert at
1 parent 7990082 commit 356f5a0

File tree

9 files changed

+79
-0
lines changed

9 files changed

+79
-0
lines changed

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

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -94,6 +94,8 @@ public fun <T> InsertClause<T>.after(columnPath: ColumnPath): DataFrame<T> {
9494

9595
// region at
9696

97+
@Refine
98+
@Interpretable("InsertAt")
9799
public fun <T> InsertClause<T>.at(position: Int): DataFrame<T> = df.add(column).move(column).to(position)
98100

99101
// endregion

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

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -520,6 +520,8 @@ public fun <T, C> MoveClause<T, C>.under(
520520
* @param [columnIndex] The index specifying the position in the [DataFrame] columns
521521
* * where the selected columns will be moved.
522522
*/
523+
@Refine
524+
@Interpretable("MoveTo")
523525
public fun <T, C> MoveClause<T, C>.to(columnIndex: Int): DataFrame<T> = moveTo(columnIndex)
524526

525527
/**

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

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2340,6 +2340,18 @@ class DataFrameTests : BaseTest() {
23402340
.move { city }.to(1)
23412341
}
23422342

2343+
@Test
2344+
fun `move beyond range of existing column indices`() {
2345+
val res = typed.move { city }.to(11)
2346+
res.columnNames() shouldBe listOf("name", "age", "weight", "city")
2347+
}
2348+
2349+
@Test
2350+
fun `move multiple columns beyond range of existing column indices`() {
2351+
val res = typed.move { city and name }.to(11)
2352+
res.columnNames() shouldBe listOf("age", "weight", "city", "name")
2353+
}
2354+
23432355
@Test
23442356
fun splitIntoThisAndNewColumn() {
23452357
val split = typed.split { name }.by { listOf(it.dropLast(1), it.last()) }.into("name", "lastChar")

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

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@ package org.jetbrains.kotlinx.dataframe.plugin.impl.api
22

33
import org.jetbrains.kotlinx.dataframe.DataFrame
44
import org.jetbrains.kotlinx.dataframe.api.after
5+
import org.jetbrains.kotlinx.dataframe.api.at
56
import org.jetbrains.kotlinx.dataframe.api.insert
67
import org.jetbrains.kotlinx.dataframe.api.pathOf
78
import org.jetbrains.kotlinx.dataframe.api.under
@@ -86,3 +87,14 @@ internal class InsertAfter0 : AbstractInterpreter<PluginDataFrameSchema>() {
8687
.toPluginDataFrameSchema()
8788
}
8889
}
90+
91+
internal class InsertAt : AbstractInterpreter<PluginDataFrameSchema>() {
92+
val Arguments.receiver: InsertClauseApproximation by arg()
93+
val Arguments.position: Int by arg()
94+
95+
override fun Arguments.interpret(): PluginDataFrameSchema {
96+
return receiver.df.asDataFrame()
97+
.insert(receiver.column.asDataColumn()).at(position)
98+
.toPluginDataFrameSchema()
99+
}
100+
}

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

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ import org.jetbrains.kotlinx.dataframe.api.after
44
import org.jetbrains.kotlinx.dataframe.api.into
55
import org.jetbrains.kotlinx.dataframe.api.move
66
import org.jetbrains.kotlinx.dataframe.api.moveToStart
7+
import org.jetbrains.kotlinx.dataframe.api.to
78
import org.jetbrains.kotlinx.dataframe.api.toStart
89
import org.jetbrains.kotlinx.dataframe.api.toEnd
910
import org.jetbrains.kotlinx.dataframe.api.toTop
@@ -104,5 +105,13 @@ class MoveAfter0 : AbstractSchemaModificationInterpreter() {
104105
}
105106
}
106107

108+
class MoveTo : AbstractSchemaModificationInterpreter() {
109+
val Arguments.receiver: MoveClauseApproximation by arg()
110+
val Arguments.columnIndex: Int by arg()
111+
112+
override fun Arguments.interpret(): PluginDataFrameSchema {
113+
return receiver.df.asDataFrame().move { receiver.columns }.to(columnIndex).toPluginDataFrameSchema()
114+
}
115+
}
107116

108117
class MoveClauseApproximation(val df: PluginDataFrameSchema, val columns: ColumnsResolver)

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

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -148,6 +148,7 @@ import org.jetbrains.kotlinx.dataframe.plugin.impl.api.GroupByStdOf
148148
import org.jetbrains.kotlinx.dataframe.plugin.impl.api.GroupBySum0
149149
import org.jetbrains.kotlinx.dataframe.plugin.impl.api.GroupBySum1
150150
import org.jetbrains.kotlinx.dataframe.plugin.impl.api.GroupBySumOf
151+
import org.jetbrains.kotlinx.dataframe.plugin.impl.api.InsertAt
151152
import org.jetbrains.kotlinx.dataframe.plugin.impl.api.MapToFrame
152153
import org.jetbrains.kotlinx.dataframe.plugin.impl.api.Merge0
153154
import org.jetbrains.kotlinx.dataframe.plugin.impl.api.MergeId
@@ -157,6 +158,7 @@ import org.jetbrains.kotlinx.dataframe.plugin.impl.api.MergeInto0
157158
import org.jetbrains.kotlinx.dataframe.plugin.impl.api.Move0
158159
import org.jetbrains.kotlinx.dataframe.plugin.impl.api.MoveAfter0
159160
import org.jetbrains.kotlinx.dataframe.plugin.impl.api.MoveInto0
161+
import org.jetbrains.kotlinx.dataframe.plugin.impl.api.MoveTo
160162
import org.jetbrains.kotlinx.dataframe.plugin.impl.api.MoveToStart0
161163
import org.jetbrains.kotlinx.dataframe.plugin.impl.api.MoveToStart1
162164
import org.jetbrains.kotlinx.dataframe.plugin.impl.api.MoveToEnd0
@@ -307,6 +309,7 @@ internal inline fun <reified T> String.load(): T {
307309
"Under1" -> Under1()
308310
"Under4" -> Under4()
309311
"InsertAfter0" -> InsertAfter0()
312+
"InsertAt" -> InsertAt()
310313
"Join0" -> Join0()
311314
"Match0" -> Match0()
312315
"Rename" -> Rename()
@@ -431,6 +434,7 @@ internal inline fun <reified T> String.load(): T {
431434
"MoveToStart1" -> MoveToStart1()
432435
"MoveToEnd0" -> MoveToEnd0()
433436
"MoveAfter0" -> MoveAfter0()
437+
"MoveTo" -> MoveTo()
434438
"GroupByAdd" -> GroupByAdd()
435439
"Merge0" -> Merge0()
436440
"MergeInto0" -> MergeInto0()
Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
import org.jetbrains.kotlinx.dataframe.*
2+
import org.jetbrains.kotlinx.dataframe.annotations.*
3+
import org.jetbrains.kotlinx.dataframe.api.*
4+
import org.jetbrains.kotlinx.dataframe.io.*
5+
6+
fun box(): String {
7+
val df = dataFrameOf("a", "b", "c")(1, 2, 3, 4, 5, 6)
8+
val dCol: DataColumn<String> = df.insert("d") { (b * c).toString() }.at(2)
9+
// weird way to check order, but ok?..
10+
.select { drop(2) }
11+
.select { take(1) }
12+
.select { d }.d
13+
14+
return "OK"
15+
}
Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
import org.jetbrains.kotlinx.dataframe.*
2+
import org.jetbrains.kotlinx.dataframe.annotations.*
3+
import org.jetbrains.kotlinx.dataframe.api.*
4+
import org.jetbrains.kotlinx.dataframe.io.*
5+
6+
fun box(): String {
7+
val df = dataFrameOf("a", "b", "c")(1, 2, 3, 4, 5, 6)
8+
val res = df.move { c and a }.to(3).select { drop(1) }
9+
res.compareSchemas(strict = true)
10+
return "OK"
11+
}

plugins/kotlin-dataframe/tests-gen/org/jetbrains/kotlin/fir/dataframe/DataFrameBlackBoxCodegenTestGenerated.java

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -352,6 +352,12 @@ public void testInsertAfterNested() {
352352
runTest("testData/box/insertAfterNested.kt");
353353
}
354354

355+
@Test
356+
@TestMetadata("insertAt.kt")
357+
public void testInsertAt() {
358+
runTest("testData/box/insertAt.kt");
359+
}
360+
355361
@Test
356362
@TestMetadata("inventNamesForLocalClasses.kt")
357363
public void testInventNamesForLocalClasses() {
@@ -424,6 +430,12 @@ public void testMoveInto() {
424430
runTest("testData/box/moveInto.kt");
425431
}
426432

433+
@Test
434+
@TestMetadata("moveTo.kt")
435+
public void testMoveTo() {
436+
runTest("testData/box/moveTo.kt");
437+
}
438+
427439
@Test
428440
@TestMetadata("moveToEnd.kt")
429441
public void testMoveToEnd() {

0 commit comments

Comments
 (0)