diff --git a/core/src/main/kotlin/org/jetbrains/kotlinx/dataframe/api/valueCounts.kt b/core/src/main/kotlin/org/jetbrains/kotlinx/dataframe/api/valueCounts.kt index 9b9a5d4bf8..7cb52a9cc0 100644 --- a/core/src/main/kotlin/org/jetbrains/kotlinx/dataframe/api/valueCounts.kt +++ b/core/src/main/kotlin/org/jetbrains/kotlinx/dataframe/api/valueCounts.kt @@ -5,6 +5,8 @@ import org.jetbrains.kotlinx.dataframe.ColumnsSelector import org.jetbrains.kotlinx.dataframe.DataColumn import org.jetbrains.kotlinx.dataframe.DataFrame import org.jetbrains.kotlinx.dataframe.annotations.DataSchema +import org.jetbrains.kotlinx.dataframe.annotations.Interpretable +import org.jetbrains.kotlinx.dataframe.annotations.Refine import org.jetbrains.kotlinx.dataframe.columns.toColumnSet import org.jetbrains.kotlinx.dataframe.impl.nameGenerator import kotlin.reflect.KProperty @@ -50,6 +52,8 @@ public fun DataColumn.valueCounts( // region DataFrame +@Refine +@Interpretable("ValueCounts") public fun DataFrame.valueCounts( sort: Boolean = true, ascending: Boolean = false, diff --git a/plugins/kotlin-dataframe/src/org/jetbrains/kotlinx/dataframe/plugin/impl/ExpectedArgumentDelegates.kt b/plugins/kotlin-dataframe/src/org/jetbrains/kotlinx/dataframe/plugin/impl/ExpectedArgumentDelegates.kt index 483f3a4b7f..2fcc616f92 100644 --- a/plugins/kotlin-dataframe/src/org/jetbrains/kotlinx/dataframe/plugin/impl/ExpectedArgumentDelegates.kt +++ b/plugins/kotlin-dataframe/src/org/jetbrains/kotlinx/dataframe/plugin/impl/ExpectedArgumentDelegates.kt @@ -1,14 +1,8 @@ package org.jetbrains.kotlinx.dataframe.plugin.impl -import org.jetbrains.kotlinx.dataframe.plugin.impl.api.RenameClauseApproximation import org.jetbrains.kotlinx.dataframe.plugin.impl.AbstractInterpreter.* import org.jetbrains.kotlinx.dataframe.plugin.impl.api.TypeApproximation -import org.jetbrains.kotlinx.dataframe.plugin.impl.data.ColumnAccessorApproximation -import org.jetbrains.kotlinx.dataframe.plugin.impl.data.ColumnPathApproximation -import org.jetbrains.kotlinx.dataframe.plugin.impl.data.ColumnWithPathApproximation import org.jetbrains.kotlinx.dataframe.plugin.impl.data.DataFrameCallableId -import org.jetbrains.kotlinx.dataframe.plugin.impl.data.InsertClauseApproximation -import org.jetbrains.kotlinx.dataframe.plugin.impl.data.KPropertyApproximation import kotlin.properties.PropertyDelegateProvider import kotlin.properties.ReadOnlyProperty @@ -18,19 +12,6 @@ fun AbstractInterpreter.dataFrame( name: ArgumentName? = null ): ExpectedArgumentProvider = arg(name, lens = Interpreter.Schema) -fun AbstractInterpreter.varargString( - name: ArgumentName? = null, - defaultValue: DefaultValue> = Absent -): ExpectedArgumentProvider> = arg(name, lens = Interpreter.Value, defaultValue = defaultValue) - -fun AbstractInterpreter.renameClause( - name: ArgumentName? = null -): ExpectedArgumentProvider = arg(name, lens = Interpreter.Value) - -fun AbstractInterpreter.columnsSelector( - name: ArgumentName? = null -): ExpectedArgumentProvider> = arg(name, lens = Interpreter.Value) - fun AbstractInterpreter.type( name: ArgumentName? = null ): ExpectedArgumentProvider = arg(name, lens = Interpreter.ReturnType) @@ -38,43 +19,19 @@ fun AbstractInterpreter.type( fun > AbstractInterpreter.enum( name: ArgumentName? = null, defaultValue: DefaultValue = Absent -): ExpectedArgumentProvider = argConvert(name = name, lens = Interpreter.Value, defaultValue = defaultValue) { it: DataFrameCallableId -> +): ExpectedArgumentProvider = argConvert(name = name, defaultValue = defaultValue) { it: DataFrameCallableId -> val forName: Class<*> = Class.forName("${it.packageName}.${it.className}") @Suppress("UNCHECKED_CAST") java.lang.Enum.valueOf(forName as Class>, it.callableName) as E } -fun AbstractInterpreter.columnAccessor( - name: ArgumentName? = null -): ExpectedArgumentProvider = arg(name, lens = Interpreter.Value) - -fun AbstractInterpreter.dataColumn( - name: ArgumentName? = null -): ExpectedArgumentProvider = arg(name, lens = Interpreter.Value) - -fun AbstractInterpreter.insertClause( - name: ArgumentName? = null -): ExpectedArgumentProvider = arg(name, lens = Interpreter.Value) - -internal fun AbstractInterpreter.columnPath( - name: ArgumentName? = null -): ExpectedArgumentProvider = arg(name, lens = Interpreter.Value) - -internal fun AbstractInterpreter.columnWithPath( - name: ArgumentName? = null -): ExpectedArgumentProvider = arg(name, lens = Interpreter.Value) - -fun AbstractInterpreter.kproperty( - name: ArgumentName? = null -): ExpectedArgumentProvider = arg(name, lens = Interpreter.Value) - -internal fun AbstractInterpreter.string( - name: ArgumentName? = null -): ExpectedArgumentProvider = - arg(name, lens = Interpreter.Value) - internal fun AbstractInterpreter.dsl( name: ArgumentName? = null ): ExpectedArgumentProvider<(Any, Map>) -> Unit> = arg(name, lens = Interpreter.Dsl, defaultValue = Present(value = {_, _ -> })) +internal fun AbstractInterpreter.ignore( + name: ArgumentName? = null +): ExpectedArgumentProvider = + arg(name, lens = Interpreter.Id, defaultValue = Present(null)) + diff --git a/plugins/kotlin-dataframe/src/org/jetbrains/kotlinx/dataframe/plugin/impl/api/add.kt b/plugins/kotlin-dataframe/src/org/jetbrains/kotlinx/dataframe/plugin/impl/api/add.kt index 8c073fecd7..9b908edc59 100644 --- a/plugins/kotlin-dataframe/src/org/jetbrains/kotlinx/dataframe/plugin/impl/api/add.kt +++ b/plugins/kotlin-dataframe/src/org/jetbrains/kotlinx/dataframe/plugin/impl/api/add.kt @@ -4,21 +4,19 @@ import org.jetbrains.kotlinx.dataframe.plugin.extensions.Marker import org.jetbrains.kotlinx.dataframe.plugin.impl.AbstractInterpreter import org.jetbrains.kotlinx.dataframe.plugin.impl.AbstractSchemaModificationInterpreter import org.jetbrains.kotlinx.dataframe.plugin.impl.Arguments -import org.jetbrains.kotlinx.dataframe.plugin.impl.Interpreter import org.jetbrains.kotlinx.dataframe.plugin.impl.PluginDataFrameSchema import org.jetbrains.kotlinx.dataframe.plugin.impl.SimpleCol import org.jetbrains.kotlinx.dataframe.plugin.impl.SimpleColumnGroup import org.jetbrains.kotlinx.dataframe.plugin.impl.dataFrame import org.jetbrains.kotlinx.dataframe.plugin.impl.simpleColumnOf import org.jetbrains.kotlinx.dataframe.plugin.impl.dsl -import org.jetbrains.kotlinx.dataframe.plugin.impl.string import org.jetbrains.kotlinx.dataframe.plugin.impl.type typealias TypeApproximation = Marker class Add : AbstractSchemaModificationInterpreter() { val Arguments.receiver: PluginDataFrameSchema by dataFrame() - val Arguments.name: String by string() + val Arguments.name: String by arg() val Arguments.type: TypeApproximation by type(name("expression")) override fun Arguments.interpret(): PluginDataFrameSchema { @@ -27,8 +25,8 @@ class Add : AbstractSchemaModificationInterpreter() { } class From : AbstractInterpreter() { - val Arguments.dsl: AddDslApproximation by arg(lens = Interpreter.Value) - val Arguments.receiver: String by string() + val Arguments.dsl: AddDslApproximation by arg() + val Arguments.receiver: String by arg() val Arguments.type: TypeApproximation by type(name("expression")) override fun Arguments.interpret() { @@ -37,9 +35,9 @@ class From : AbstractInterpreter() { } class Into : AbstractInterpreter() { - val Arguments.dsl: AddDslApproximation by arg(lens = Interpreter.Value) + val Arguments.dsl: AddDslApproximation by arg() val Arguments.receiver: TypeApproximation by type() - val Arguments.name: String by string() + val Arguments.name: String by arg() override fun Arguments.interpret() { dsl.columns += simpleColumnOf(name, receiver.type) @@ -60,8 +58,8 @@ class AddWithDsl : AbstractSchemaModificationInterpreter() { } class AddDslStringInvoke : AbstractInterpreter() { - val Arguments.dsl: AddDslApproximation by arg(lens = Interpreter.Value) - val Arguments.receiver: String by string() + val Arguments.dsl: AddDslApproximation by arg() + val Arguments.receiver: String by arg() val Arguments.body by dsl() override fun Arguments.interpret() { diff --git a/plugins/kotlin-dataframe/src/org/jetbrains/kotlinx/dataframe/plugin/impl/api/convert.kt b/plugins/kotlin-dataframe/src/org/jetbrains/kotlinx/dataframe/plugin/impl/api/convert.kt index ed6bf251db..e8971ab9bd 100644 --- a/plugins/kotlin-dataframe/src/org/jetbrains/kotlinx/dataframe/plugin/impl/api/convert.kt +++ b/plugins/kotlin-dataframe/src/org/jetbrains/kotlinx/dataframe/plugin/impl/api/convert.kt @@ -2,6 +2,7 @@ package org.jetbrains.kotlinx.dataframe.plugin.impl.api import org.jetbrains.kotlinx.dataframe.api.Infer import org.jetbrains.kotlinx.dataframe.plugin.extensions.KotlinTypeFacade +import org.jetbrains.kotlinx.dataframe.plugin.impl.Absent import org.jetbrains.kotlinx.dataframe.plugin.impl.AbstractInterpreter import org.jetbrains.kotlinx.dataframe.plugin.impl.AbstractSchemaModificationInterpreter import org.jetbrains.kotlinx.dataframe.plugin.impl.Arguments @@ -11,13 +12,10 @@ import org.jetbrains.kotlinx.dataframe.plugin.impl.SimpleCol import org.jetbrains.kotlinx.dataframe.plugin.impl.SimpleColumnGroup import org.jetbrains.kotlinx.dataframe.plugin.impl.SimpleDataColumn import org.jetbrains.kotlinx.dataframe.plugin.impl.SimpleFrameColumn -import org.jetbrains.kotlinx.dataframe.plugin.impl.data.ColumnWithPathApproximation import org.jetbrains.kotlinx.dataframe.plugin.impl.dataFrame import org.jetbrains.kotlinx.dataframe.plugin.impl.enum import org.jetbrains.kotlinx.dataframe.plugin.impl.simpleColumnOf -import org.jetbrains.kotlinx.dataframe.plugin.impl.string import org.jetbrains.kotlinx.dataframe.plugin.impl.type -import org.jetbrains.kotlinx.dataframe.plugin.impl.varargString internal class Convert0 : AbstractInterpreter() { val Arguments.columns: ColumnsResolver by arg() @@ -31,7 +29,7 @@ internal class Convert0 : AbstractInterpreter() { class Convert2 : AbstractInterpreter() { val Arguments.receiver: PluginDataFrameSchema by dataFrame() - val Arguments.columns: List by varargString() + val Arguments.columns: List by arg(defaultValue = Absent) override fun Arguments.interpret(): ConvertApproximation { return ConvertApproximation(receiver, columns.map { listOf(it) }) @@ -41,8 +39,8 @@ class Convert2 : AbstractInterpreter() { class ConvertApproximation(val schema: PluginDataFrameSchema, val columns: List>) internal class Convert6 : AbstractInterpreter() { - val Arguments.firstCol: String by string() - val Arguments.cols: List by varargString(defaultValue = Present(emptyList())) + val Arguments.firstCol: String by arg() + val Arguments.cols: List by arg(defaultValue = Present(emptyList())) val Arguments.infer: Infer by enum(defaultValue = Present(Infer.Nulls)) val Arguments.expression: TypeApproximation by type() val Arguments.receiver: PluginDataFrameSchema by dataFrame() diff --git a/plugins/kotlin-dataframe/src/org/jetbrains/kotlinx/dataframe/plugin/impl/api/dataFrameOf.kt b/plugins/kotlin-dataframe/src/org/jetbrains/kotlinx/dataframe/plugin/impl/api/dataFrameOf.kt index bc92706237..1eeeca8c83 100644 --- a/plugins/kotlin-dataframe/src/org/jetbrains/kotlinx/dataframe/plugin/impl/api/dataFrameOf.kt +++ b/plugins/kotlin-dataframe/src/org/jetbrains/kotlinx/dataframe/plugin/impl/api/dataFrameOf.kt @@ -14,11 +14,10 @@ import org.jetbrains.kotlinx.dataframe.plugin.impl.Arguments import org.jetbrains.kotlinx.dataframe.plugin.impl.Interpreter import org.jetbrains.kotlinx.dataframe.plugin.impl.PluginDataFrameSchema import org.jetbrains.kotlinx.dataframe.plugin.impl.simpleColumnOf -import org.jetbrains.kotlinx.dataframe.plugin.impl.varargString import org.jetbrains.kotlinx.dataframe.impl.api.withValuesImpl class DataFrameOf0 : AbstractInterpreter() { - val Arguments.header: List by varargString() + val Arguments.header: List by arg() override fun Arguments.interpret(): DataFrameBuilderApproximation { return DataFrameBuilderApproximation(header) diff --git a/plugins/kotlin-dataframe/src/org/jetbrains/kotlinx/dataframe/plugin/impl/api/insert.kt b/plugins/kotlin-dataframe/src/org/jetbrains/kotlinx/dataframe/plugin/impl/api/insert.kt index 301824d681..ae2e16de60 100644 --- a/plugins/kotlin-dataframe/src/org/jetbrains/kotlinx/dataframe/plugin/impl/api/insert.kt +++ b/plugins/kotlin-dataframe/src/org/jetbrains/kotlinx/dataframe/plugin/impl/api/insert.kt @@ -14,19 +14,13 @@ import org.jetbrains.kotlinx.dataframe.plugin.impl.Present import org.jetbrains.kotlinx.dataframe.plugin.impl.SimpleCol import org.jetbrains.kotlinx.dataframe.plugin.impl.asDataColumn import org.jetbrains.kotlinx.dataframe.plugin.impl.asDataFrame -import org.jetbrains.kotlinx.dataframe.plugin.impl.columnAccessor -import org.jetbrains.kotlinx.dataframe.plugin.impl.columnPath import org.jetbrains.kotlinx.dataframe.plugin.impl.data.ColumnAccessorApproximation import org.jetbrains.kotlinx.dataframe.plugin.impl.data.ColumnPathApproximation import org.jetbrains.kotlinx.dataframe.plugin.impl.data.InsertClauseApproximation import org.jetbrains.kotlinx.dataframe.plugin.impl.data.KPropertyApproximation -import org.jetbrains.kotlinx.dataframe.plugin.impl.dataColumn import org.jetbrains.kotlinx.dataframe.plugin.impl.dataFrame import org.jetbrains.kotlinx.dataframe.plugin.impl.enum -import org.jetbrains.kotlinx.dataframe.plugin.impl.insertClause -import org.jetbrains.kotlinx.dataframe.plugin.impl.kproperty import org.jetbrains.kotlinx.dataframe.plugin.impl.simpleColumnOf -import org.jetbrains.kotlinx.dataframe.plugin.impl.string import org.jetbrains.kotlinx.dataframe.plugin.impl.toPluginDataFrameSchema import org.jetbrains.kotlinx.dataframe.plugin.impl.type @@ -34,7 +28,7 @@ import org.jetbrains.kotlinx.dataframe.plugin.impl.type * @see DataFrame.insert */ internal class Insert0 : AbstractInterpreter() { - val Arguments.column: SimpleCol by dataColumn() + val Arguments.column: SimpleCol by arg() val Arguments.receiver: PluginDataFrameSchema by dataFrame() override fun Arguments.interpret(): InsertClauseApproximation { @@ -43,7 +37,7 @@ internal class Insert0 : AbstractInterpreter() { } internal class Insert1 : AbstractInterpreter() { - val Arguments.name: String by string() + val Arguments.name: String by arg() val Arguments.infer: Infer by enum(defaultValue = Present(Infer.Nulls)) val Arguments.expression: TypeApproximation by type() val Arguments.receiver: PluginDataFrameSchema by dataFrame() @@ -54,7 +48,7 @@ internal class Insert1 : AbstractInterpreter() { } internal class Insert2 : AbstractInterpreter() { - val Arguments.column: ColumnAccessorApproximation by columnAccessor() + val Arguments.column: ColumnAccessorApproximation by arg() val Arguments.infer: Infer by enum(defaultValue = Present(Infer.Nulls)) val Arguments.expression: TypeApproximation by type() val Arguments.receiver: PluginDataFrameSchema by dataFrame() @@ -65,7 +59,7 @@ internal class Insert2 : AbstractInterpreter() { } internal class Insert3 : AbstractInterpreter() { - val Arguments.column: KPropertyApproximation by kproperty() + val Arguments.column: KPropertyApproximation by arg() val Arguments.infer: Infer by enum(defaultValue = Present(Infer.Nulls)) val Arguments.expression: TypeApproximation by type() val Arguments.receiver: PluginDataFrameSchema by dataFrame() @@ -77,7 +71,7 @@ internal class Insert3 : AbstractInterpreter() { internal class Under0 : AbstractInterpreter() { val Arguments.column: SingleColumnApproximation by arg() - val Arguments.receiver: InsertClauseApproximation by insertClause() + val Arguments.receiver: InsertClauseApproximation by arg() override fun Arguments.interpret(): PluginDataFrameSchema { val path = column.resolve(receiver.df).single().path @@ -88,8 +82,8 @@ internal class Under0 : AbstractInterpreter() { } internal class Under1 : AbstractInterpreter() { - val Arguments.columnPath: ColumnPathApproximation by columnPath() - val Arguments.receiver: InsertClauseApproximation by insertClause() + val Arguments.columnPath: ColumnPathApproximation by arg() + val Arguments.receiver: InsertClauseApproximation by arg() override fun Arguments.interpret(): PluginDataFrameSchema { return receiver.df.asDataFrame() @@ -99,8 +93,8 @@ internal class Under1 : AbstractInterpreter() { } internal class Under2 : AbstractInterpreter() { - val Arguments.column: ColumnAccessorApproximation by columnAccessor() - val Arguments.receiver: InsertClauseApproximation by insertClause() + val Arguments.column: ColumnAccessorApproximation by arg() + val Arguments.receiver: InsertClauseApproximation by arg() override fun Arguments.interpret(): PluginDataFrameSchema { return receiver.df.asDataFrame() @@ -110,8 +104,8 @@ internal class Under2 : AbstractInterpreter() { } internal class Under3 : AbstractInterpreter() { - val Arguments.column: KPropertyApproximation by kproperty() - val Arguments.receiver: InsertClauseApproximation by insertClause() + val Arguments.column: KPropertyApproximation by arg() + val Arguments.receiver: InsertClauseApproximation by arg() override fun Arguments.interpret(): PluginDataFrameSchema { return receiver.df.asDataFrame() @@ -121,8 +115,8 @@ internal class Under3 : AbstractInterpreter() { } internal class Under4 : AbstractInterpreter() { - val Arguments.column: String by string() - val Arguments.receiver: InsertClauseApproximation by insertClause() + val Arguments.column: String by arg() + val Arguments.receiver: InsertClauseApproximation by arg() override fun Arguments.interpret(): PluginDataFrameSchema { return receiver.df.asDataFrame() diff --git a/plugins/kotlin-dataframe/src/org/jetbrains/kotlinx/dataframe/plugin/impl/api/read.kt b/plugins/kotlin-dataframe/src/org/jetbrains/kotlinx/dataframe/plugin/impl/api/read.kt index 7a70e7208b..fc8ee62023 100644 --- a/plugins/kotlin-dataframe/src/org/jetbrains/kotlinx/dataframe/plugin/impl/api/read.kt +++ b/plugins/kotlin-dataframe/src/org/jetbrains/kotlinx/dataframe/plugin/impl/api/read.kt @@ -1,6 +1,5 @@ package org.jetbrains.kotlinx.dataframe.plugin.impl.api -import kotlinx.serialization.decodeFromString import kotlinx.serialization.json.Json import org.jetbrains.kotlinx.dataframe.DataFrame import org.jetbrains.kotlinx.dataframe.DataRow @@ -22,12 +21,11 @@ import org.jetbrains.kotlinx.dataframe.plugin.impl.AbstractSchemaModificationInt import org.jetbrains.kotlinx.dataframe.plugin.impl.PluginDataFrameSchema import org.jetbrains.kotlinx.dataframe.plugin.impl.data.IoSchema import org.jetbrains.kotlinx.dataframe.plugin.impl.data.deserializeToPluginDataFrameSchema -import org.jetbrains.kotlinx.dataframe.plugin.impl.string import org.jetbrains.kotlinx.dataframe.plugin.impl.data.toPluginDataFrameSchema import java.io.File internal class Read0 : AbstractInterpreter() { - val Arguments.path by string() + val Arguments.path: String by arg() val Arguments.header: List by arg(defaultValue = Present(listOf())) override fun Arguments.interpret(): PluginDataFrameSchema { diff --git a/plugins/kotlin-dataframe/src/org/jetbrains/kotlinx/dataframe/plugin/impl/api/rename.kt b/plugins/kotlin-dataframe/src/org/jetbrains/kotlinx/dataframe/plugin/impl/api/rename.kt index 04aae32e14..7c224265c9 100644 --- a/plugins/kotlin-dataframe/src/org/jetbrains/kotlinx/dataframe/plugin/impl/api/rename.kt +++ b/plugins/kotlin-dataframe/src/org/jetbrains/kotlinx/dataframe/plugin/impl/api/rename.kt @@ -8,9 +8,7 @@ import org.jetbrains.kotlinx.dataframe.plugin.impl.SimpleCol import org.jetbrains.kotlinx.dataframe.plugin.impl.SimpleDataColumn import org.jetbrains.kotlinx.dataframe.plugin.impl.SimpleColumnGroup import org.jetbrains.kotlinx.dataframe.plugin.impl.SimpleFrameColumn -import org.jetbrains.kotlinx.dataframe.plugin.impl.data.ColumnWithPathApproximation import org.jetbrains.kotlinx.dataframe.plugin.impl.dataFrame -import org.jetbrains.kotlinx.dataframe.plugin.impl.varargString class Rename : AbstractInterpreter() { private val Arguments.receiver by dataFrame() @@ -24,7 +22,7 @@ class RenameClauseApproximation(val schema: PluginDataFrameSchema, val columns: class RenameInto : AbstractSchemaModificationInterpreter() { val Arguments.receiver: RenameClauseApproximation by arg() - val Arguments.newNames: List by varargString() + val Arguments.newNames: List by arg() override fun Arguments.interpret(): PluginDataFrameSchema { val columns = receiver.columns.resolve(receiver.schema) diff --git a/plugins/kotlin-dataframe/src/org/jetbrains/kotlinx/dataframe/plugin/impl/api/stdlib.kt b/plugins/kotlin-dataframe/src/org/jetbrains/kotlinx/dataframe/plugin/impl/api/stdlib.kt index 5462fd86e4..8b11dd5d3d 100644 --- a/plugins/kotlin-dataframe/src/org/jetbrains/kotlinx/dataframe/plugin/impl/api/stdlib.kt +++ b/plugins/kotlin-dataframe/src/org/jetbrains/kotlinx/dataframe/plugin/impl/api/stdlib.kt @@ -22,8 +22,8 @@ class PairConstructor : AbstractInterpreter>() { } class TrimMargin : AbstractInterpreter() { - val Arguments.receiver: String by arg(lens = Interpreter.Value) - val Arguments.marginPrefix: String by arg(lens = Interpreter.Value, defaultValue = Present("|")) + val Arguments.receiver: String by arg() + val Arguments.marginPrefix: String by arg(defaultValue = Present("|")) override fun Arguments.interpret(): String { return receiver.trimMargin(marginPrefix) @@ -31,7 +31,7 @@ class TrimMargin : AbstractInterpreter() { } class TrimIndent : AbstractInterpreter() { - val Arguments.receiver: String by arg(lens = Interpreter.Value) + val Arguments.receiver: String by arg() override fun Arguments.interpret(): String { return receiver.trimIndent() diff --git a/plugins/kotlin-dataframe/src/org/jetbrains/kotlinx/dataframe/plugin/impl/api/valueCounts.kt b/plugins/kotlin-dataframe/src/org/jetbrains/kotlinx/dataframe/plugin/impl/api/valueCounts.kt new file mode 100644 index 0000000000..0dd9b2a2de --- /dev/null +++ b/plugins/kotlin-dataframe/src/org/jetbrains/kotlinx/dataframe/plugin/impl/api/valueCounts.kt @@ -0,0 +1,29 @@ +@file:Suppress("INVISIBLE_REFERENCE", "INVISIBLE_MEMBER") + +package org.jetbrains.kotlinx.dataframe.plugin.impl.api + +import org.jetbrains.kotlinx.dataframe.api.ValueCount +import org.jetbrains.kotlinx.dataframe.plugin.extensions.wrap +import org.jetbrains.kotlinx.dataframe.plugin.impl.AbstractSchemaModificationInterpreter +import org.jetbrains.kotlinx.dataframe.plugin.impl.Arguments +import org.jetbrains.kotlinx.dataframe.plugin.impl.PluginDataFrameSchema +import org.jetbrains.kotlinx.dataframe.plugin.impl.Present +import org.jetbrains.kotlinx.dataframe.plugin.impl.SimpleDataColumn +import org.jetbrains.kotlinx.dataframe.plugin.impl.dataFrame +import org.jetbrains.kotlinx.dataframe.plugin.impl.ignore + +class ValueCounts : AbstractSchemaModificationInterpreter() { + val Arguments.receiver by dataFrame() + val Arguments.dropNA by ignore() + val Arguments.ascending by ignore() + val Arguments.sort by ignore() + val Arguments.resultColumn: String by arg(defaultValue = Present(ValueCount::count.name)) + val Arguments.columns: ColumnsResolver? by arg(defaultValue = Present(null)) + + override fun Arguments.interpret(): PluginDataFrameSchema { + val res = columns?.resolve(receiver)?.map { it.column } ?: receiver.columns() + val generator = org.jetbrains.kotlinx.dataframe.impl.ColumnNameGenerator(res.map { it.name }) + val count = SimpleDataColumn(generator.addUnique(resultColumn), session.builtinTypes.intType.type.wrap()) + return PluginDataFrameSchema(res + count) + } +} diff --git a/plugins/kotlin-dataframe/src/org/jetbrains/kotlinx/dataframe/plugin/loadInterpreter.kt b/plugins/kotlin-dataframe/src/org/jetbrains/kotlinx/dataframe/plugin/loadInterpreter.kt index 07871bbd0c..5ddd9816ae 100644 --- a/plugins/kotlin-dataframe/src/org/jetbrains/kotlinx/dataframe/plugin/loadInterpreter.kt +++ b/plugins/kotlin-dataframe/src/org/jetbrains/kotlinx/dataframe/plugin/loadInterpreter.kt @@ -100,6 +100,7 @@ import org.jetbrains.kotlinx.dataframe.plugin.impl.api.ToTop import org.jetbrains.kotlinx.dataframe.plugin.impl.api.TrimMargin import org.jetbrains.kotlinx.dataframe.plugin.impl.api.Update0 import org.jetbrains.kotlinx.dataframe.plugin.impl.api.UpdateWith0 +import org.jetbrains.kotlinx.dataframe.plugin.impl.api.ValueCounts import org.jetbrains.kotlinx.dataframe.plugin.utils.Names internal fun FirFunctionCall.loadInterpreter(session: FirSession): Interpreter<*>? { @@ -248,6 +249,7 @@ internal inline fun String.load(): T { "Update0" -> Update0() "Aggregate" -> Aggregate() "DataFrameOf3" -> DataFrameOf3() + "ValueCounts" -> ValueCounts() else -> error("$this") } as T } diff --git a/plugins/kotlin-dataframe/testData/box/valueCounts.kt b/plugins/kotlin-dataframe/testData/box/valueCounts.kt new file mode 100644 index 0000000000..1c06e3c30b --- /dev/null +++ b/plugins/kotlin-dataframe/testData/box/valueCounts.kt @@ -0,0 +1,16 @@ +import org.jetbrains.kotlinx.dataframe.* +import org.jetbrains.kotlinx.dataframe.annotations.* +import org.jetbrains.kotlinx.dataframe.api.* +import org.jetbrains.kotlinx.dataframe.io.* + +fun box(): String { + val df = dataFrameOf("a" to listOf("1", "1", "2", "3", "1", "4", "1")) + val counts = df.valueCounts(ascending = true, sort = false, dropNA = false) { a } + counts.a + counts.count + + val counts1 = df.valueCounts(resultColumn = "a") { a } + val col: DataColumn = counts1.a + val col1: DataColumn counts1.a1 + return "OK" +} diff --git a/plugins/kotlin-dataframe/tests-gen/org/jetbrains/kotlin/fir/dataframe/DataFrameBlackBoxCodegenTestGenerated.java b/plugins/kotlin-dataframe/tests-gen/org/jetbrains/kotlin/fir/dataframe/DataFrameBlackBoxCodegenTestGenerated.java index 6fd265778a..912cec8933 100644 --- a/plugins/kotlin-dataframe/tests-gen/org/jetbrains/kotlin/fir/dataframe/DataFrameBlackBoxCodegenTestGenerated.java +++ b/plugins/kotlin-dataframe/tests-gen/org/jetbrains/kotlin/fir/dataframe/DataFrameBlackBoxCodegenTestGenerated.java @@ -514,6 +514,12 @@ public void testUpdate() { runTest("testData/box/update.kt"); } + @Test + @TestMetadata("valueCounts.kt") + public void testValueCounts() { + runTest("testData/box/valueCounts.kt"); + } + @Test @TestMetadata("wrongReceiver.kt") public void testWrongReceiver() {