Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
@@ -1,7 +1,6 @@
package org.jetbrains.kotlinx.dataframe.api

import org.jetbrains.kotlinx.dataframe.AnyColumnReference
import org.jetbrains.kotlinx.dataframe.AnyRow
import org.jetbrains.kotlinx.dataframe.ColumnsContainer
import org.jetbrains.kotlinx.dataframe.DataColumn
import org.jetbrains.kotlinx.dataframe.DataFrame
Expand Down Expand Up @@ -30,13 +29,13 @@ import kotlin.reflect.KProperty
import kotlin.reflect.KType

@Deprecated(MESSAGE_SHORTCUT, ReplaceWith(IS_EMPTY_REPLACE), DeprecationLevel.WARNING)
public fun AnyRow.isEmpty(): Boolean = owner.columns().all { it[index] == null }
public fun DataRow<*>.isEmpty(): Boolean = owner.columns().all { it[index] == null }

@Suppress("DEPRECATION_ERROR")
@Deprecated(MESSAGE_SHORTCUT, ReplaceWith(IS_NOT_EMPTY_REPLACE), DeprecationLevel.WARNING)
public fun AnyRow.isNotEmpty(): Boolean = !isEmpty()
public fun DataRow<*>.isNotEmpty(): Boolean = !isEmpty()

public inline fun <reified R> AnyRow.valuesOf(): List<R> = values().filterIsInstance<R>()
public inline fun <reified R> DataRow<*>.valuesOf(): List<R> = values().filterIsInstance<R>()

// region DataSchema
@DataSchema
Expand All @@ -62,50 +61,50 @@ public val DataRow<NameValuePair<*>>.value: Any?

// endregion

public inline fun <reified R> AnyRow.namedValuesOf(): List<NameValuePair<R>> =
public inline fun <reified R> DataRow<*>.namedValuesOf(): List<NameValuePair<R>> =
values().zip(columnNames()).filter { it.first is R }.map { NameValuePair(it.second, it.first as R) }

@RequiredByIntellijPlugin
public fun AnyRow.namedValues(): List<NameValuePair<Any?>> =
public fun DataRow<*>.namedValues(): List<NameValuePair<Any?>> =
values().zip(columnNames()) { value, name -> NameValuePair(name, value) }

// region getValue

public fun <T> AnyRow.getValue(columnName: String): T = get(columnName) as T
public fun <T> DataRow<*>.getValue(columnName: String): T = get(columnName) as T

@Deprecated(DEPRECATED_ACCESS_API)
@AccessApiOverload
public fun <T> AnyRow.getValue(column: ColumnReference<T>): T = get(column)
public fun <T> DataRow<*>.getValue(column: ColumnReference<T>): T = get(column)

@Deprecated(DEPRECATED_ACCESS_API)
@AccessApiOverload
public fun <T> AnyRow.getValue(column: KProperty<T>): T = get(column)
public fun <T> DataRow<*>.getValue(column: KProperty<T>): T = get(column)

public fun <T> AnyRow.getValueOrNull(columnName: String): T? = getOrNull(columnName) as T?
public fun <T> DataRow<*>.getValueOrNull(columnName: String): T? = getOrNull(columnName) as T?

@Deprecated(DEPRECATED_ACCESS_API)
@AccessApiOverload
public fun <T> AnyRow.getValueOrNull(column: KProperty<T>): T? = getValueOrNull<T>(column.columnName)
public fun <T> DataRow<*>.getValueOrNull(column: KProperty<T>): T? = getValueOrNull<T>(column.columnName)

// endregion

// region contains

public fun AnyRow.containsKey(columnName: String): Boolean = owner.containsColumn(columnName)
public fun DataRow<*>.containsKey(columnName: String): Boolean = owner.containsColumn(columnName)

@Deprecated(DEPRECATED_ACCESS_API)
@AccessApiOverload
public fun AnyRow.containsKey(column: AnyColumnReference): Boolean = owner.containsColumn(column)
public fun DataRow<*>.containsKey(column: AnyColumnReference): Boolean = owner.containsColumn(column)

@Deprecated(DEPRECATED_ACCESS_API)
@AccessApiOverload
public fun AnyRow.containsKey(column: KProperty<*>): Boolean = owner.containsColumn(column)
public fun DataRow<*>.containsKey(column: KProperty<*>): Boolean = owner.containsColumn(column)

public operator fun AnyRow.contains(column: AnyColumnReference): Boolean = containsKey(column)
public operator fun DataRow<*>.contains(column: AnyColumnReference): Boolean = containsKey(column)

@Deprecated(DEPRECATED_ACCESS_API)
@AccessApiOverload
public operator fun AnyRow.contains(column: KProperty<*>): Boolean = containsKey(column)
public operator fun DataRow<*>.contains(column: KProperty<*>): Boolean = containsKey(column)

// endregion

Expand Down Expand Up @@ -183,11 +182,11 @@ public inline fun <T> DataRow<T>.diffOrNull(expression: RowExpression<T, Float>)
prev()?.let { p -> expression(this, this) - expression(p, p) }

@RequiredByIntellijPlugin
public fun AnyRow.columnsCount(): Int = df().ncol
public fun DataRow<*>.columnsCount(): Int = df().ncol

public fun AnyRow.columnNames(): List<String> = df().columnNames()
public fun DataRow<*>.columnNames(): List<String> = df().columnNames()

public fun AnyRow.columnTypes(): List<KType> = df().columnTypes()
public fun DataRow<*>.columnTypes(): List<KType> = df().columnTypes()

@Suppress("DEPRECATION_ERROR")
@Deprecated(MESSAGE_SHORTCUT, ReplaceWith(GET_ROW_REPLACE), DeprecationLevel.WARNING)
Expand Down
17 changes: 7 additions & 10 deletions core/src/main/kotlin/org/jetbrains/kotlinx/dataframe/api/add.kt
Original file line number Diff line number Diff line change
@@ -1,11 +1,8 @@
package org.jetbrains.kotlinx.dataframe.api
Copy link
Copy Markdown
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I've also encountered:

  • AnyCol
  • Predicate
  • ColumnFilter
  • AnyColumnReference
  • AnyColumnGroupAccessor
  • StringCol
  • ColumnGroupReference
  • ColumnGroupAccessor

Should we inline them/some of them as well?

ColumnFilter, ColumnGroupAccessor, and maybe Predicate are probably fine as they are, but it seems logical to me to inline AnyCol, AnyColumnReference, AnyColumnGroupAccessor, StringCol, ColumnGroupReference for the same reasons as AnyFrame, AnyRow, and AnyBaseCol.

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Sure, feel free to create an issue to continue this task. I only choose these 3 because they're have most usages


import org.jetbrains.kotlinx.dataframe.AnyBaseCol
import org.jetbrains.kotlinx.dataframe.AnyCol
import org.jetbrains.kotlinx.dataframe.AnyColumnGroupAccessor
import org.jetbrains.kotlinx.dataframe.AnyColumnReference
import org.jetbrains.kotlinx.dataframe.AnyFrame
import org.jetbrains.kotlinx.dataframe.AnyRow
import org.jetbrains.kotlinx.dataframe.ColumnsContainer
import org.jetbrains.kotlinx.dataframe.DataColumn
import org.jetbrains.kotlinx.dataframe.DataFrame
Expand Down Expand Up @@ -51,7 +48,7 @@ import kotlin.reflect.KProperty
replaceWith = ReplaceWith(ADD_VARARG_COLUMNS_REPLACE),
level = DeprecationLevel.WARNING,
)
public fun <T> DataFrame<T>.add(vararg columns: AnyBaseCol): DataFrame<T> = addAll(columns.asIterable())
public fun <T> DataFrame<T>.add(vararg columns: BaseColumn<*>): DataFrame<T> = addAll(columns.asIterable())

/**
* Adds new [columns] to the end of this [DataFrame] (at the top level).
Expand All @@ -65,7 +62,7 @@ public fun <T> DataFrame<T>.add(vararg columns: AnyBaseCol): DataFrame<T> = addA
* @throws [UnequalColumnSizesException] if columns in an expected result have different sizes.
* @return new [DataFrame] with added columns.
*/
public fun <T> DataFrame<T>.addAll(vararg columns: AnyBaseCol): DataFrame<T> = addAll(columns.asIterable())
public fun <T> DataFrame<T>.addAll(vararg columns: BaseColumn<*>): DataFrame<T> = addAll(columns.asIterable())

/**
* Adds new [columns] to the end of this [DataFrame] (at the top level).
Expand All @@ -79,7 +76,7 @@ public fun <T> DataFrame<T>.addAll(vararg columns: AnyBaseCol): DataFrame<T> = a
* @throws [UnequalColumnSizesException] if columns in an expected result have different sizes.
* @return new [DataFrame] with added columns.
*/
public fun <T> DataFrame<T>.addAll(columns: Iterable<AnyBaseCol>): DataFrame<T> =
public fun <T> DataFrame<T>.addAll(columns: Iterable<BaseColumn<*>>): DataFrame<T> =
dataFrameOf(columns() + columns).cast()

/**
Expand All @@ -100,7 +97,7 @@ public fun <T> DataFrame<T>.addAll(columns: Iterable<AnyBaseCol>): DataFrame<T>
replaceWith = ReplaceWith(ADD_VARARG_FRAMES_REPLACE),
level = DeprecationLevel.WARNING,
)
public fun <T> DataFrame<T>.add(vararg dataFrames: AnyFrame): DataFrame<T> = addAll(dataFrames.asIterable())
public fun <T> DataFrame<T>.add(vararg dataFrames: DataFrame<*>): DataFrame<T> = addAll(dataFrames.asIterable())

/**
* Adds all columns from the given [dataFrames] to the end of this [DataFrame] (at the top level).
Expand All @@ -117,7 +114,7 @@ public fun <T> DataFrame<T>.add(vararg dataFrames: AnyFrame): DataFrame<T> = add
*/
@Refine
@Interpretable("DataFrameAddAll")
public fun <T> DataFrame<T>.addAll(vararg dataFrames: AnyFrame): DataFrame<T> = addAll(dataFrames.asIterable())
public fun <T> DataFrame<T>.addAll(vararg dataFrames: DataFrame<*>): DataFrame<T> = addAll(dataFrames.asIterable())

/**
* Adds all columns from the given [dataFrames] to the end of this [DataFrame] (at the top level).
Expand All @@ -133,7 +130,7 @@ public fun <T> DataFrame<T>.addAll(vararg dataFrames: AnyFrame): DataFrame<T> =
* @return new [DataFrame] with added columns.
*/
@JvmName("addAllFrames")
public fun <T> DataFrame<T>.addAll(dataFrames: Iterable<AnyFrame>): DataFrame<T> =
public fun <T> DataFrame<T>.addAll(dataFrames: Iterable<DataFrame<*>>): DataFrame<T> =
addAll(dataFrames.flatMap { it.columns() })

// endregion
Expand All @@ -154,7 +151,7 @@ public interface AddDataRow<out T> : DataRow<T> {
*
* @throws IndexOutOfBoundsException when called on a successive row that doesn't have new value yet
*/
public fun <C> AnyRow.newValue(): C
public fun <C> DataRow<*>.newValue(): C
}

/**
Expand Down
Original file line number Diff line number Diff line change
@@ -1,7 +1,6 @@
package org.jetbrains.kotlinx.dataframe.api

import org.jetbrains.kotlinx.dataframe.AnyCol
import org.jetbrains.kotlinx.dataframe.AnyFrame
import org.jetbrains.kotlinx.dataframe.DataFrame
import org.jetbrains.kotlinx.dataframe.annotations.AccessApiOverload
import org.jetbrains.kotlinx.dataframe.annotations.Interpretable
Expand All @@ -11,7 +10,7 @@ import org.jetbrains.kotlinx.dataframe.util.DEPRECATED_ACCESS_API

// region DataColumn

public fun AnyCol.addId(columnName: String = "id"): AnyFrame = toDataFrame().addId(columnName)
public fun AnyCol.addId(columnName: String = "id"): DataFrame<*> = toDataFrame().addId(columnName)

// endregion

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -50,7 +50,7 @@ public fun <C> DataColumn<C>.allNulls(): Boolean =

// region DataRow

public fun AnyRow.allNA(): Boolean = owner.columns().all { it[index()].isNA }
public fun DataRow<*>.allNA(): Boolean = owner.columns().all { it[index()].isNA }

// endregion

Expand Down
14 changes: 6 additions & 8 deletions core/src/main/kotlin/org/jetbrains/kotlinx/dataframe/api/cast.kt
Original file line number Diff line number Diff line change
Expand Up @@ -3,8 +3,6 @@
package org.jetbrains.kotlinx.dataframe.api

import org.jetbrains.kotlinx.dataframe.AnyCol
import org.jetbrains.kotlinx.dataframe.AnyFrame
import org.jetbrains.kotlinx.dataframe.AnyRow
import org.jetbrains.kotlinx.dataframe.DataColumn
import org.jetbrains.kotlinx.dataframe.DataFrame
import org.jetbrains.kotlinx.dataframe.DataRow
Expand All @@ -23,9 +21,9 @@ import org.jetbrains.kotlinx.dataframe.impl.api.convertToImpl
import kotlin.reflect.typeOf

@Check
public fun <T> AnyFrame.cast(): DataFrame<T> = this as DataFrame<T>
public fun <T> DataFrame<*>.cast(): DataFrame<T> = this as DataFrame<T>

public inline fun <reified T> AnyFrame.cast(verify: Boolean = true): DataFrame<T> =
public inline fun <reified T> DataFrame<*>.cast(verify: Boolean = true): DataFrame<T> =
if (verify) {
convertToImpl(
typeOf<T>(),
Expand All @@ -36,7 +34,7 @@ public inline fun <reified T> AnyFrame.cast(verify: Boolean = true): DataFrame<T
cast()
}

public inline fun <reified T> AnyFrame.castTo(
public inline fun <reified T> DataFrame<*>.castTo(
@Suppress("UNUSED_PARAMETER") schemaFrom: DataFrame<T>,
verify: Boolean = true,
): DataFrame<T> = cast<T>(verify = verify)
Expand Down Expand Up @@ -66,14 +64,14 @@ public inline fun <reified T> AnyFrame.castTo(
* }
* ```
*/
public inline fun <reified T> AnyFrame.castTo(
public inline fun <reified T> DataFrame<*>.castTo(
@Suppress("UNUSED_PARAMETER") schemaFrom: Function<DataFrame<T>>,
verify: Boolean = true,
): DataFrame<T> = cast<T>(verify = verify)

public fun <T> AnyRow.cast(): DataRow<T> = this as DataRow<T>
public fun <T> DataRow<*>.cast(): DataRow<T> = this as DataRow<T>

public inline fun <reified T> AnyRow.cast(verify: Boolean = true): DataRow<T> = df().cast<T>(verify)[0]
public inline fun <reified T> DataRow<*>.cast(verify: Boolean = true): DataRow<T> = df().cast<T>(verify)[0]

@Interpretable("AnyColCast")
public fun <T> AnyCol.cast(): DataColumn<T> = this as DataColumn<T>
Expand Down
Original file line number Diff line number Diff line change
@@ -1,6 +1,5 @@
package org.jetbrains.kotlinx.dataframe.api

import org.jetbrains.kotlinx.dataframe.AnyRow
import org.jetbrains.kotlinx.dataframe.DataFrame
import org.jetbrains.kotlinx.dataframe.DataRow
import org.jetbrains.kotlinx.dataframe.Predicate
Expand Down Expand Up @@ -109,7 +108,7 @@ public interface ColGroupsColumnsSelectionDsl {
* `df.`[select][DataFrame.select]` { `[colGroups][ColumnsSelectionDsl.colGroups]` { it.`[name][ColumnReference.name]`.`[startsWith][String.startsWith]`("my") } }`
*/
@Interpretable("ColGroups0")
public fun ColumnSet<*>.colGroups(filter: Predicate<ColumnGroup<*>> = { true }): ColumnSet<AnyRow> =
public fun ColumnSet<*>.colGroups(filter: Predicate<ColumnGroup<*>> = { true }): ColumnSet<DataRow<*>> =
columnGroupsInternal(filter)

/**
Expand All @@ -121,7 +120,7 @@ public interface ColGroupsColumnsSelectionDsl {
* `df.`[select][DataFrame.select]` { `[colGroups][ColumnsSelectionDsl.colGroups]` { it.`[name][ColumnReference.name]`.`[startsWith][String.startsWith]`("my") } }`
*/
@Interpretable("ColGroups1")
public fun ColumnsSelectionDsl<*>.colGroups(filter: Predicate<ColumnGroup<*>> = { true }): ColumnSet<AnyRow> =
public fun ColumnsSelectionDsl<*>.colGroups(filter: Predicate<ColumnGroup<*>> = { true }): ColumnSet<DataRow<*>> =
asSingleColumn().columnGroupsInternal(filter)

/**
Expand All @@ -133,7 +132,7 @@ public interface ColGroupsColumnsSelectionDsl {
* `df.`[select][DataFrame.select]` { myColGroup.`[colGroups][SingleColumn.colGroups]` { it.`[name][ColumnReference.name]`.`[startsWith][String.startsWith]`("my") } }`
*/
@Interpretable("ColGroups2")
public fun SingleColumn<DataRow<*>>.colGroups(filter: Predicate<ColumnGroup<*>> = { true }): ColumnSet<AnyRow> =
public fun SingleColumn<DataRow<*>>.colGroups(filter: Predicate<ColumnGroup<*>> = { true }): ColumnSet<DataRow<*>> =
this.ensureIsColumnGroup().columnGroupsInternal(filter)

/**
Expand All @@ -144,7 +143,7 @@ public interface ColGroupsColumnsSelectionDsl {
*
* `df.`[select][DataFrame.select]` { "myColGroup".`[colGroups][String.colGroups]`() }`
*/
public fun String.colGroups(filter: Predicate<ColumnGroup<*>> = { true }): ColumnSet<AnyRow> =
public fun String.colGroups(filter: Predicate<ColumnGroup<*>> = { true }): ColumnSet<DataRow<*>> =
columnGroup(this).colGroups(filter)

/**
Expand All @@ -155,7 +154,7 @@ public interface ColGroupsColumnsSelectionDsl {
*
* `df.`[select][DataFrame.select]` { DataSchemaType::myColGroup.`[colGroups][KProperty.colGroups]`() }`
*/
public fun KProperty<*>.colGroups(filter: Predicate<ColumnGroup<*>> = { true }): ColumnSet<AnyRow> =
public fun KProperty<*>.colGroups(filter: Predicate<ColumnGroup<*>> = { true }): ColumnSet<DataRow<*>> =
columnGroup(this).colGroups(filter)

/**
Expand All @@ -164,7 +163,7 @@ public interface ColGroupsColumnsSelectionDsl {
*
* `df.`[select][DataFrame.select]` { "pathTo"["myGroupCol"].`[colGroups][ColumnPath.colGroups]`() }`
*/
public fun ColumnPath.colGroups(filter: Predicate<ColumnGroup<*>> = { true }): ColumnSet<AnyRow> =
public fun ColumnPath.colGroups(filter: Predicate<ColumnGroup<*>> = { true }): ColumnSet<DataRow<*>> =
columnGroup(this).colGroups(filter)
}

Expand All @@ -177,6 +176,6 @@ public interface ColGroupsColumnsSelectionDsl {
@Suppress("UNCHECKED_CAST")
internal inline fun ColumnsResolver<*>.columnGroupsInternal(
crossinline filter: (ColumnGroup<*>) -> Boolean,
): ColumnSet<AnyRow> = colsInternal { it.isColumnGroup() && filter(it) }.cast()
): ColumnSet<DataRow<*>> = colsInternal { it.isColumnGroup() && filter(it) }.cast()

// endregion
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,6 @@ import org.jetbrains.kotlinx.dataframe.columns.ColumnPath
import org.jetbrains.kotlinx.dataframe.columns.ColumnSet
import org.jetbrains.kotlinx.dataframe.columns.ColumnsResolver
import org.jetbrains.kotlinx.dataframe.columns.SingleColumn
import org.jetbrains.kotlinx.dataframe.columns.size
import org.jetbrains.kotlinx.dataframe.documentation.DslGrammarTemplateColumnsSelectionDsl.DslGrammarTemplate
import org.jetbrains.kotlinx.dataframe.documentation.Indent
import org.jetbrains.kotlinx.dataframe.documentation.LineBreak
Expand Down
Loading
Loading