Skip to content

Commit 874abff

Browse files
committed
[Compiler plugin] Support more parameters in read* functions
1 parent 7e6825d commit 874abff

File tree

5 files changed

+52
-7
lines changed

5 files changed

+52
-7
lines changed

core/src/main/kotlin/org/jetbrains/kotlinx/dataframe/annotations/Plugin.kt

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -8,12 +8,12 @@ public annotation class HasSchema(val schemaArg: Int)
88
* Needed because some function calls only serve as a part of overall compile time DataSchema evaluation
99
* There's no need to update return type of such calls
1010
*/
11-
internal annotation class Interpretable(val interpreter: String)
11+
public annotation class Interpretable(val interpreter: String)
1212

1313
/**
1414
* Compiler plugin will replace return type of calls to the annotated function
1515
*/
16-
internal annotation class Refine
16+
public annotation class Refine
1717

1818
internal annotation class OptInRefine
1919

dataframe-excel/src/main/kotlin/org/jetbrains/kotlinx/dataframe/io/xlsx.kt

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,8 @@ import org.jetbrains.kotlinx.dataframe.AnyRow
2424
import org.jetbrains.kotlinx.dataframe.ColumnsSelector
2525
import org.jetbrains.kotlinx.dataframe.DataColumn
2626
import org.jetbrains.kotlinx.dataframe.DataFrame
27+
import org.jetbrains.kotlinx.dataframe.annotations.Interpretable
28+
import org.jetbrains.kotlinx.dataframe.annotations.Refine
2729
import org.jetbrains.kotlinx.dataframe.api.dataFrameOf
2830
import org.jetbrains.kotlinx.dataframe.api.forEach
2931
import org.jetbrains.kotlinx.dataframe.api.select
@@ -143,6 +145,8 @@ public fun DataFrame.Companion.readExcel(
143145
* @param nameRepairStrategy handling of column names.
144146
* The default behavior is [NameRepairStrategy.CHECK_UNIQUE]
145147
*/
148+
@Refine
149+
@Interpretable("ReadExcel")
146150
public fun DataFrame.Companion.readExcel(
147151
fileOrUrl: String,
148152
sheetName: String? = null,
@@ -209,7 +213,9 @@ public fun DataFrame.Companion.readExcel(
209213
* @param range comma separated list of Excel column letters and column ranges (e.g. “A:E” or “A,C,E:F”)
210214
*/
211215
@JvmInline
212-
public value class StringColumns(public val range: String)
216+
public value class StringColumns
217+
@Interpretable("StringColumns")
218+
constructor(public val range: String)
213219

214220
public fun StringColumns.toFormattingOptions(formatter: DataFormatter = DataFormatter()): FormattingOptions =
215221
FormattingOptions(range, formatter)

plugins/kotlin-dataframe/build.gradle.kts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,7 @@ dependencies {
3737
testRuntimeOnly("org.jetbrains.kotlin:kotlin-annotations-jvm:$kotlinVersion")
3838

3939
implementation(project(":core"))
40+
implementation(project(":dataframe-excel"))
4041
api(libs.kotlinLogging)
4142
api("org.jetbrains.kotlinx:kotlinx-serialization-json:1.4.0-RC")
4243

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

Lines changed: 39 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -7,11 +7,17 @@ import org.jetbrains.kotlinx.dataframe.plugin.impl.AbstractInterpreter
77
import org.jetbrains.kotlinx.dataframe.plugin.impl.Arguments
88
import org.jetbrains.kotlinx.dataframe.plugin.impl.Present
99
import org.jetbrains.kotlinx.dataframe.api.schema
10+
import org.jetbrains.kotlinx.dataframe.io.JSON
11+
import org.jetbrains.kotlinx.dataframe.io.JSON.TypeClashTactic.ARRAY_AND_VALUE_COLUMNS
12+
import org.jetbrains.kotlinx.dataframe.io.NameRepairStrategy
13+
import org.jetbrains.kotlinx.dataframe.io.StringColumns
1014
import org.jetbrains.kotlinx.dataframe.io.read
1115
import org.jetbrains.kotlinx.dataframe.io.readCSV
1216
import org.jetbrains.kotlinx.dataframe.io.readDelimStr
17+
import org.jetbrains.kotlinx.dataframe.io.readExcel
1318
import org.jetbrains.kotlinx.dataframe.io.readJson
1419
import org.jetbrains.kotlinx.dataframe.io.readJsonStr
20+
import org.jetbrains.kotlinx.dataframe.plugin.impl.AbstractSchemaModificationInterpreter
1521
import org.jetbrains.kotlinx.dataframe.plugin.impl.PluginDataFrameSchema
1622
import org.jetbrains.kotlinx.dataframe.plugin.impl.data.IoSchema
1723
import org.jetbrains.kotlinx.dataframe.plugin.impl.data.deserializeToPluginDataFrameSchema
@@ -30,13 +36,17 @@ internal class Read0 : AbstractInterpreter<PluginDataFrameSchema>() {
3036

3137
internal class ReadCSV0 : AbstractInterpreter<PluginDataFrameSchema>() {
3238
val Arguments.fileOrUrl: String by arg()
39+
val Arguments.delimiter: Char by arg(defaultValue = Present(','))
40+
val Arguments.skipLines: Int by arg(defaultValue = Present(0))
41+
val Arguments.readLines: Int? by arg(defaultValue = Present(null))
42+
val Arguments.duplicate: Boolean by arg(defaultValue = Present(true))
3343

3444
override fun Arguments.interpret(): PluginDataFrameSchema {
3545
val file = resolveFile(resolutionPath, fileOrUrl)
3646
val df = if (file != null && file.exists()) {
37-
DataFrame.readCSV(file)
47+
DataFrame.readCSV(file, delimiter, skipLines = skipLines, readLines = readLines, duplicate = duplicate)
3848
} else {
39-
DataFrame.readCSV(fileOrUrl)
49+
DataFrame.readCSV(fileOrUrl, delimiter, skipLines = skipLines, readLines = readLines, duplicate = duplicate)
4050
}
4151
return df.schema().toPluginDataFrameSchema()
4252
}
@@ -91,17 +101,42 @@ private fun resolveFile(resolutionPath: String?, path: String): File? {
91101
internal class ReadDelimStr : AbstractInterpreter<PluginDataFrameSchema>() {
92102
val Arguments.text: String by arg()
93103
val Arguments.delimiter: Char by arg(defaultValue = Present(','))
104+
val Arguments.skipLines: Int by arg(defaultValue = Present(0))
105+
val Arguments.readLines: Int? by arg(defaultValue = Present(null))
94106

95107
override fun Arguments.interpret(): PluginDataFrameSchema {
96-
return DataFrame.readDelimStr(text, delimiter).schema().toPluginDataFrameSchema()
108+
return DataFrame.readDelimStr(text, delimiter, skipLines = skipLines, readLines = readLines).schema().toPluginDataFrameSchema()
97109
}
98110
}
99111

100112
internal class ReadJsonStr : AbstractInterpreter<PluginDataFrameSchema>() {
101113
val Arguments.text: String by arg()
114+
val Arguments.typeClashTactic: JSON.TypeClashTactic by arg(defaultValue = Present(ARRAY_AND_VALUE_COLUMNS))
102115

103116
override fun Arguments.interpret(): PluginDataFrameSchema {
104-
return DataFrame.readJsonStr(text).schema().toPluginDataFrameSchema()
117+
return DataFrame.readJsonStr(text, typeClashTactic = typeClashTactic).schema().toPluginDataFrameSchema()
105118
}
106119
}
107120

121+
internal class ReadExcel : AbstractSchemaModificationInterpreter() {
122+
val Arguments.fileOrUrl: String by arg()
123+
val Arguments.sheetName: String? by arg(defaultValue = Present(null))
124+
val Arguments.skipRows: Int by arg(defaultValue = Present(0))
125+
val Arguments.columns: String? by arg(defaultValue = Present(null))
126+
val Arguments.stringColumns: StringColumns? by arg(defaultValue = Present(null))
127+
val Arguments.rowsCount: Int? by arg(defaultValue = Present(null))
128+
val Arguments.nameRepairStrategy: NameRepairStrategy by arg(defaultValue = Present(NameRepairStrategy.CHECK_UNIQUE))
129+
130+
override fun Arguments.interpret(): PluginDataFrameSchema {
131+
val df = DataFrame.readExcel(fileOrUrl, sheetName, skipRows, columns, stringColumns, rowsCount, nameRepairStrategy)
132+
return df.schema().toPluginDataFrameSchema()
133+
}
134+
}
135+
136+
internal class StringColumnsConstructor : AbstractInterpreter<StringColumns>() {
137+
val Arguments.range: String by arg()
138+
139+
override fun Arguments.interpret(): StringColumns {
140+
return StringColumns(range)
141+
}
142+
}

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

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -74,6 +74,7 @@ import org.jetbrains.kotlinx.dataframe.plugin.impl.api.ColsOf1
7474
import org.jetbrains.kotlinx.dataframe.plugin.impl.api.DataFrameBuilderInvoke0
7575
import org.jetbrains.kotlinx.dataframe.plugin.impl.api.DataFrameOf0
7676
import org.jetbrains.kotlinx.dataframe.plugin.impl.api.FrameCols0
77+
import org.jetbrains.kotlinx.dataframe.plugin.impl.api.ReadExcel
7778
import org.jetbrains.kotlinx.dataframe.plugin.impl.api.ToDataFrame
7879
import org.jetbrains.kotlinx.dataframe.plugin.impl.api.ToDataFrameColumn
7980
import org.jetbrains.kotlinx.dataframe.plugin.impl.api.ToDataFrameDefault
@@ -183,6 +184,8 @@ internal inline fun <reified T> String.load(): T {
183184
"DataFrameOf0" -> DataFrameOf0()
184185
"DataFrameBuilderInvoke0" -> DataFrameBuilderInvoke0()
185186
"ToDataFrameColumn" -> ToDataFrameColumn()
187+
"StringColumns" -> ToDataFrameColumn()
188+
"ReadExcel" -> ReadExcel()
186189
else -> error("$this")
187190
} as T
188191
}

0 commit comments

Comments
 (0)