Skip to content

Commit

Permalink
Add extensions API for DataSchemas
Browse files Browse the repository at this point in the history
We cannot use gradle plugin to generate them because gradle plugin depends on the 'core', and gradle cannot resolve this dependency to a published versions and instead resolves to a local project, which leads to a cyclic dependency between tasks.
  • Loading branch information
koperagen committed Jun 24, 2022
1 parent d2ce34c commit 4ec5020
Show file tree
Hide file tree
Showing 3 changed files with 54 additions and 1 deletion.
Original file line number Diff line number Diff line change
@@ -1,8 +1,10 @@
package org.jetbrains.kotlinx.dataframe.api

import org.jetbrains.kotlinx.dataframe.ColumnsContainer
import org.jetbrains.kotlinx.dataframe.ColumnsSelector
import org.jetbrains.kotlinx.dataframe.DataColumn
import org.jetbrains.kotlinx.dataframe.DataFrame
import org.jetbrains.kotlinx.dataframe.DataRow
import org.jetbrains.kotlinx.dataframe.annotations.DataSchema
import org.jetbrains.kotlinx.dataframe.columns.ColumnPath
import org.jetbrains.kotlinx.dataframe.columns.ColumnReference
Expand All @@ -11,6 +13,7 @@ import org.jetbrains.kotlinx.dataframe.impl.columns.toColumns
import kotlin.reflect.KProperty
import kotlin.reflect.KType

// region DataSchema
@DataSchema
public interface ColumnDescription {
public val name: String
Expand All @@ -28,6 +31,35 @@ public interface ColumnDescription {
public val max: Any
}

public val ColumnsContainer<ColumnDescription>.count: DataColumn<Int> @JvmName("ColumnDescription_count") get() = this["count"] as DataColumn<Int>
public val DataRow<ColumnDescription>.count: Int @JvmName("ColumnDescription_count") get() = this["count"] as Int
public val ColumnsContainer<ColumnDescription>.freq: DataColumn<Int> @JvmName("ColumnDescription_freq") get() = this["freq"] as DataColumn<Int>
public val DataRow<ColumnDescription>.freq: Int @JvmName("ColumnDescription_freq") get() = this["freq"] as Int
public val ColumnsContainer<ColumnDescription>.max: DataColumn<Any> @JvmName("ColumnDescription_max") get() = this["max"] as DataColumn<Any>
public val DataRow<ColumnDescription>.max: Any @JvmName("ColumnDescription_max") get() = this["max"] as Any
public val ColumnsContainer<ColumnDescription>.mean: DataColumn<Double> @JvmName("ColumnDescription_mean") get() = this["mean"] as DataColumn<Double>
public val DataRow<ColumnDescription>.mean: Double @JvmName("ColumnDescription_mean") get() = this["mean"] as Double
public val ColumnsContainer<ColumnDescription>.median: DataColumn<Any> @JvmName("ColumnDescription_median") get() = this["median"] as DataColumn<Any>
public val DataRow<ColumnDescription>.median: Any @JvmName("ColumnDescription_median") get() = this["median"] as Any
public val ColumnsContainer<ColumnDescription>.min: DataColumn<Any> @JvmName("ColumnDescription_min") get() = this["min"] as DataColumn<Any>
public val DataRow<ColumnDescription>.min: Any @JvmName("ColumnDescription_min") get() = this["min"] as Any
public val ColumnsContainer<ColumnDescription>.name: DataColumn<String> @JvmName("ColumnDescription_name") get() = this["name"] as DataColumn<String>
public val DataRow<ColumnDescription>.name: String @JvmName("ColumnDescription_name") get() = this["name"] as String
public val ColumnsContainer<ColumnDescription>.nulls: DataColumn<Int> @JvmName("ColumnDescription_nulls") get() = this["nulls"] as DataColumn<Int>
public val DataRow<ColumnDescription>.nulls: Int @JvmName("ColumnDescription_nulls") get() = this["nulls"] as Int
public val ColumnsContainer<ColumnDescription>.path: DataColumn<ColumnPath> @JvmName("ColumnDescription_path") get() = this["path"] as DataColumn<ColumnPath>
public val DataRow<ColumnDescription>.path: ColumnPath @JvmName("ColumnDescription_path") get() = this["path"] as ColumnPath
public val ColumnsContainer<ColumnDescription>.std: DataColumn<Double> @JvmName("ColumnDescription_std") get() = this["std"] as DataColumn<Double>
public val DataRow<ColumnDescription>.std: Double @JvmName("ColumnDescription_std") get() = this["std"] as Double
public val ColumnsContainer<ColumnDescription>.top: DataColumn<Any> @JvmName("ColumnDescription_top") get() = this["top"] as DataColumn<Any>
public val DataRow<ColumnDescription>.top: Any @JvmName("ColumnDescription_top") get() = this["top"] as Any
public val ColumnsContainer<ColumnDescription>.type: DataColumn<KType> @JvmName("ColumnDescription_type") get() = this["type"] as DataColumn<KType>
public val DataRow<ColumnDescription>.type: KType @JvmName("ColumnDescription_type") get() = this["type"] as KType
public val ColumnsContainer<ColumnDescription>.unique: DataColumn<Int> @JvmName("ColumnDescription_unique") get() = this["unique"] as DataColumn<Int>
public val DataRow<ColumnDescription>.unique: Int @JvmName("ColumnDescription_unique") get() = this["unique"] as Int

// endregion

// region DataColumn

public fun <T> DataColumn<T>.describe(): DataFrame<ColumnDescription> = describeImpl(listOf(this))
Expand Down
Original file line number Diff line number Diff line change
@@ -1,23 +1,32 @@
package org.jetbrains.kotlinx.dataframe.api

import org.jetbrains.kotlinx.dataframe.Column
import org.jetbrains.kotlinx.dataframe.ColumnsContainer
import org.jetbrains.kotlinx.dataframe.ColumnsSelector
import org.jetbrains.kotlinx.dataframe.DataColumn
import org.jetbrains.kotlinx.dataframe.DataFrame
import org.jetbrains.kotlinx.dataframe.DataRow
import org.jetbrains.kotlinx.dataframe.annotations.DataSchema
import org.jetbrains.kotlinx.dataframe.impl.columns.toColumns
import org.jetbrains.kotlinx.dataframe.impl.nameGenerator
import kotlin.reflect.KProperty
import kotlin.reflect.full.withNullability
import kotlin.reflect.typeOf

// region DataColumn
// region DataSchema

@DataSchema
public interface ValueCount {
public val count: Int
}

public val ColumnsContainer<ValueCount>.count: DataColumn<Int> @JvmName("ValueCount_count") get() = this["count"] as DataColumn<Int>
public val DataRow<ValueCount>.count: Int @JvmName("ValueCount_count") get() = this["count"] as Int

// endregion

// region DataColumn

internal val defaultCountColumnName: String = ValueCount::count.name

public fun <T> DataColumn<T>.valueCounts(
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,8 @@ import org.jetbrains.kotlinx.dataframe.AnyRow
import org.jetbrains.kotlinx.dataframe.ColumnsContainer
import org.jetbrains.kotlinx.dataframe.DataColumn
import org.jetbrains.kotlinx.dataframe.DataRow
import org.jetbrains.kotlinx.dataframe.api.ColumnDescription
import org.jetbrains.kotlinx.dataframe.api.ValueCount
import org.jetbrains.kotlinx.dataframe.api.dataFrameOf
import org.jetbrains.kotlinx.dataframe.api.dropNulls
import org.jetbrains.kotlinx.dataframe.api.move
Expand Down Expand Up @@ -252,6 +254,16 @@ class CodeGenerationTests : BaseTest() {
}
}

@Test
fun generateApi() {
val generator = CodeGenerator.create()
val valueCount = generator.generate<ValueCount>(InterfaceGenerationMode.None, extensionProperties = true)
println(valueCount.declarations)
println()
val describe = generator.generate<ColumnDescription>(InterfaceGenerationMode.None, extensionProperties = true)
println(describe.declarations)
}

@Test
fun patterns() {
"""^[\d]""".toRegex().matches("3fds")
Expand Down

0 comments on commit 4ec5020

Please sign in to comment.