Skip to content

Commit e6e1a41

Browse files
committed
Merge branch 'refs/heads/master' into keywords-generator
2 parents 933636b + 04d3653 commit e6e1a41

File tree

127 files changed

+1021
-106
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

127 files changed

+1021
-106
lines changed

core/api/core.api

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -192,7 +192,7 @@ public final class org/jetbrains/dataframe/keywords/SoftKeywords$Companion {
192192
public final fun getVALUES ()Ljava/util/List;
193193
}
194194

195-
public abstract interface class org/jetbrains/kotlinx/dataframe/ColumnsContainer {
195+
public abstract interface class org/jetbrains/kotlinx/dataframe/ColumnsContainer : org/jetbrains/kotlinx/dataframe/ColumnsScope {
196196
public abstract fun columns ()Ljava/util/List;
197197
public abstract fun columnsCount ()I
198198
public abstract fun containsColumn (Ljava/lang/String;)Z
@@ -234,6 +234,10 @@ public final class org/jetbrains/kotlinx/dataframe/ColumnsContainer$DefaultImpls
234234
public static fun get (Lorg/jetbrains/kotlinx/dataframe/ColumnsContainer;Lorg/jetbrains/kotlinx/dataframe/columns/ColumnReference;)Lorg/jetbrains/kotlinx/dataframe/columns/FrameColumn;
235235
}
236236

237+
public abstract interface class org/jetbrains/kotlinx/dataframe/ColumnsScope {
238+
public abstract fun get (Ljava/lang/String;)Lorg/jetbrains/kotlinx/dataframe/DataColumn;
239+
}
240+
237241
public abstract interface class org/jetbrains/kotlinx/dataframe/DataColumn : org/jetbrains/kotlinx/dataframe/columns/BaseColumn {
238242
public static final field Companion Lorg/jetbrains/kotlinx/dataframe/DataColumn$Companion;
239243
public abstract fun distinct ()Lorg/jetbrains/kotlinx/dataframe/DataColumn;
@@ -4222,6 +4226,7 @@ public final class org/jetbrains/kotlinx/dataframe/api/DataFrameGetKt {
42224226
public static final fun getOrNull (Lorg/jetbrains/kotlinx/dataframe/DataFrame;I)Lorg/jetbrains/kotlinx/dataframe/DataRow;
42234227
public static final fun getRows (Lorg/jetbrains/kotlinx/dataframe/DataFrame;Ljava/lang/Iterable;)Lorg/jetbrains/kotlinx/dataframe/DataFrame;
42244228
public static final fun getRows (Lorg/jetbrains/kotlinx/dataframe/DataFrame;Lkotlin/ranges/IntRange;)Lorg/jetbrains/kotlinx/dataframe/DataFrame;
4229+
public static final fun properties (Lorg/jetbrains/kotlinx/dataframe/DataFrame;)Lorg/jetbrains/kotlinx/dataframe/ColumnsScope;
42254230
public static final fun rows (Lorg/jetbrains/kotlinx/dataframe/DataFrame;)Ljava/lang/Iterable;
42264231
public static final fun rowsReversed (Lorg/jetbrains/kotlinx/dataframe/DataFrame;)Ljava/lang/Iterable;
42274232
}
@@ -10398,6 +10403,7 @@ public final class org/jetbrains/kotlinx/dataframe/io/DataFrameHtmlData {
1039810403
public fun toString ()Ljava/lang/String;
1039910404
public final fun withTableDefinitions ()Lorg/jetbrains/kotlinx/dataframe/io/DataFrameHtmlData;
1040010405
public final fun writeHTML (Ljava/io/File;)V
10406+
public final fun writeHTML (Ljava/lang/String;)V
1040110407
public final fun writeHTML (Ljava/nio/file/Path;)V
1040210408
}
1040310409

core/generated-sources/src/main/kotlin/org/jetbrains/kotlinx/dataframe/ColumnsContainer.kt

Lines changed: 15 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
package org.jetbrains.kotlinx.dataframe
22

3+
import org.jetbrains.kotlinx.dataframe.annotations.AccessApiOverload
34
import org.jetbrains.kotlinx.dataframe.api.ColumnSelectionDsl
45
import org.jetbrains.kotlinx.dataframe.api.asColumnGroup
56
import org.jetbrains.kotlinx.dataframe.api.cast
@@ -18,9 +19,9 @@ import kotlin.reflect.KProperty
1819
*
1920
* Base interface for [DataFrame] and [ColumnSelectionDsl]
2021
*
21-
* @param T Schema marker. Used to generate extension properties for typed column access.
22+
* @param T Schema marker. Used to resolve generated extension properties for typed column access.
2223
*/
23-
public interface ColumnsContainer<out T> {
24+
public interface ColumnsContainer<out T> : ColumnsScope<T> {
2425

2526
// region columns
2627

@@ -42,8 +43,10 @@ public interface ColumnsContainer<out T> {
4243

4344
public fun getColumnOrNull(index: Int): AnyCol?
4445

46+
@AccessApiOverload
4547
public fun <R> getColumnOrNull(column: ColumnReference<R>): DataColumn<R>?
4648

49+
@AccessApiOverload
4750
public fun <R> getColumnOrNull(column: KProperty<R>): DataColumn<R>?
4851

4952
public fun getColumnOrNull(path: ColumnPath): AnyCol?
@@ -54,27 +57,36 @@ public interface ColumnsContainer<out T> {
5457

5558
// region get
5659

57-
public operator fun get(columnName: String): AnyCol = getColumn(columnName)
60+
public override operator fun get(columnName: String): AnyCol = getColumn(columnName)
5861

5962
public operator fun get(columnPath: ColumnPath): AnyCol = getColumn(columnPath)
6063

64+
@AccessApiOverload
6165
public operator fun <R> get(column: DataColumn<R>): DataColumn<R> = getColumn(column.name()).cast()
6266

67+
@AccessApiOverload
6368
public operator fun <R> get(column: DataColumn<DataRow<R>>): ColumnGroup<R> = getColumn(column)
6469

70+
@AccessApiOverload
6571
public operator fun <R> get(column: DataColumn<DataFrame<R>>): FrameColumn<R> = getColumn(column)
6672

73+
@AccessApiOverload
6774
public operator fun <R> get(column: ColumnReference<R>): DataColumn<R> = getColumn(column)
6875

76+
@AccessApiOverload
6977
public operator fun <R> get(column: ColumnReference<DataRow<R>>): ColumnGroup<R> = getColumn(column)
7078

79+
@AccessApiOverload
7180
public operator fun <R> get(column: ColumnReference<DataFrame<R>>): FrameColumn<R> = getColumn(column)
7281

82+
@AccessApiOverload
7383
public operator fun <R> get(column: KProperty<R>): DataColumn<R> = get(column.columnName).cast()
7484

85+
@AccessApiOverload
7586
public operator fun <R> get(column: KProperty<DataRow<R>>): ColumnGroup<R> =
7687
get(column.columnName).asColumnGroup().cast()
7788

89+
@AccessApiOverload
7890
public operator fun <R> get(column: KProperty<DataFrame<R>>): FrameColumn<R> =
7991
get(column.columnName).asAnyFrameColumn().castFrameColumn()
8092

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
package org.jetbrains.kotlinx.dataframe
2+
3+
/**
4+
* Provides minimal API required for generated column properties:
5+
*
6+
* `val ColumnsScope<Schema marker>.column: DataColumn<String> get() = this["column"] as DataColumn<String>`
7+
*
8+
* @param T Schema marker. Used to resolve generated extension properties for typed column access.
9+
*/
10+
public interface ColumnsScope<out T> {
11+
public operator fun get(columnName: String): AnyCol
12+
}

core/generated-sources/src/main/kotlin/org/jetbrains/kotlinx/dataframe/DataFrame.kt

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

33
import org.jetbrains.kotlinx.dataframe.aggregation.Aggregatable
44
import org.jetbrains.kotlinx.dataframe.aggregation.AggregateGroupedBody
5+
import org.jetbrains.kotlinx.dataframe.annotations.AccessApiOverload
56
import org.jetbrains.kotlinx.dataframe.annotations.HasSchema
67
import org.jetbrains.kotlinx.dataframe.api.ColumnsSelectionDsl
78
import org.jetbrains.kotlinx.dataframe.api.add
@@ -116,6 +117,7 @@ public interface DataFrame<out T> :
116117
*/
117118
public operator fun <T, C> DataFrame<T>.get(columns: ColumnsSelector<T, C>): List<DataColumn<C>> = this.get(columns)
118119

120+
@AccessApiOverload
119121
public operator fun <T> DataFrame<T>.get(first: AnyColumnReference, vararg other: AnyColumnReference): DataFrame<T> =
120122
select { (listOf(first) + other).toColumnSet() }
121123

core/generated-sources/src/main/kotlin/org/jetbrains/kotlinx/dataframe/DataRow.kt

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
package org.jetbrains.kotlinx.dataframe
22

3+
import org.jetbrains.kotlinx.dataframe.annotations.AccessApiOverload
34
import org.jetbrains.kotlinx.dataframe.api.next
45
import org.jetbrains.kotlinx.dataframe.api.prev
56
import org.jetbrains.kotlinx.dataframe.columns.ColumnKind
@@ -31,6 +32,7 @@ public interface DataRow<out T> {
3132

3233
public operator fun <R> get(columns: List<ColumnReference<R>>): List<R> = columns.map { get(it) }
3334

35+
@AccessApiOverload
3436
public operator fun <R> get(property: KProperty<R>): R = get(property.columnName) as R
3537

3638
public operator fun get(first: AnyColumnReference, vararg other: AnyColumnReference): DataRow<T> =
@@ -66,6 +68,7 @@ public interface DataRow<out T> {
6668

6769
public fun getOrNull(name: String): Any?
6870

71+
@AccessApiOverload
6972
public fun <R> getValueOrNull(column: ColumnReference<R>): R?
7073

7174
// endregion
@@ -74,6 +77,7 @@ public interface DataRow<out T> {
7477

7578
public operator fun String.get(vararg path: String): ColumnPath = ColumnPath(listOf(this) + path)
7679

80+
@AccessApiOverload
7781
public operator fun <R> ColumnReference<R>.invoke(): R = get(this)
7882

7983
public operator fun <R> String.invoke(): R = this@DataRow[this@invoke] as R

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

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -43,3 +43,12 @@ public annotation class ScopeProperty
4343

4444
@Target(AnnotationTarget.FUNCTION)
4545
internal annotation class Check
46+
47+
/**
48+
* One of the design goals of the library is typed access to columns.
49+
* That's why all operations that have "column" parameters have 4 overloads: https://kotlin.github.io/dataframe/apilevels.html
50+
* In Kotlin Notebook and in Gradle project with the compiler plugin, Column Accessors API and KProperties API become redundant and
51+
* clutter API scope of DataFrame. This annotation indicates such functions so that they can be excluded from public API
52+
*/
53+
@Target(AnnotationTarget.FUNCTION)
54+
internal annotation class AccessApiOverload

core/generated-sources/src/main/kotlin/org/jetbrains/kotlinx/dataframe/api/DataFrameGet.kt

Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,10 +4,12 @@ import org.jetbrains.kotlinx.dataframe.AnyCol
44
import org.jetbrains.kotlinx.dataframe.AnyColumnReference
55
import org.jetbrains.kotlinx.dataframe.ColumnSelector
66
import org.jetbrains.kotlinx.dataframe.ColumnsContainer
7+
import org.jetbrains.kotlinx.dataframe.ColumnsScope
78
import org.jetbrains.kotlinx.dataframe.ColumnsSelector
89
import org.jetbrains.kotlinx.dataframe.DataColumn
910
import org.jetbrains.kotlinx.dataframe.DataFrame
1011
import org.jetbrains.kotlinx.dataframe.DataRow
12+
import org.jetbrains.kotlinx.dataframe.annotations.AccessApiOverload
1113
import org.jetbrains.kotlinx.dataframe.columns.ColumnGroup
1214
import org.jetbrains.kotlinx.dataframe.columns.ColumnPath
1315
import org.jetbrains.kotlinx.dataframe.columns.ColumnReference
@@ -58,17 +60,42 @@ public fun <T> ColumnsContainer<T>.getFrameColumn(columnName: String): FrameColu
5860
public fun <T> ColumnsContainer<T>.getColumnGroup(columnPath: ColumnPath): ColumnGroup<*> =
5961
get(columnPath).asColumnGroup()
6062

63+
/**
64+
* Utility property to access scope with only dataframe column properties for code completion,
65+
* filtering out DataFrame API.
66+
*
67+
* It's a quick way to check that code generation in notebooks or compiler plugin
68+
* worked as expected or find columns you're interested in.
69+
*
70+
* In notebooks:
71+
* ```
72+
* val df = DataFrame.read("file.csv")
73+
* ==== next code cell
74+
* df. // column properties are mixed together with methods, not easy to find unless you already know names
75+
* df.properties(). // easy to overview available columns
76+
* ```
77+
* In compiler plugin:
78+
* ```
79+
* val df = @Import DataFrame.read("file.csv")
80+
* df.properties().
81+
* ```
82+
*/
83+
public fun <T> DataFrame<T>.properties(): ColumnsScope<T> = this
84+
6185
// region getColumn
6286

6387
public fun <T> ColumnsContainer<T>.getColumn(name: String): AnyCol =
6488
getColumnOrNull(name) ?: throw IllegalArgumentException("Column not found: '$name'")
6589

90+
@AccessApiOverload
6691
public fun <T, R> ColumnsContainer<T>.getColumn(column: ColumnReference<DataFrame<R>>): FrameColumn<R> =
6792
getColumnOrNull(column)?.asFrameColumn() ?: throw IllegalArgumentException("FrameColumn not found: '$column'")
6893

94+
@AccessApiOverload
6995
public fun <T, R> ColumnsContainer<T>.getColumn(column: ColumnReference<DataRow<R>>): ColumnGroup<R> =
7096
getColumnOrNull(column)?.asColumnGroup() ?: throw IllegalArgumentException("ColumnGroup not found: '$column'")
7197

98+
@AccessApiOverload
7299
public fun <T, R> ColumnsContainer<T>.getColumn(column: ColumnReference<R>): DataColumn<R> =
73100
getColumnOrNull(column) ?: throw IllegalArgumentException("Column not found: '$column'")
74101

@@ -89,9 +116,11 @@ public fun <T> ColumnsContainer<T>.getColumnGroup(index: Int): ColumnGroup<*> =
89116

90117
public fun <T> ColumnsContainer<T>.getColumnGroup(name: String): ColumnGroup<*> = getColumn(name).asColumnGroup()
91118

119+
@AccessApiOverload
92120
public fun <T> ColumnsContainer<T>.getColumnGroup(column: KProperty<*>): ColumnGroup<*> =
93121
getColumnGroup(column.columnName)
94122

123+
@AccessApiOverload
95124
public fun <T, C> ColumnsContainer<T>.getColumnGroup(column: ColumnReference<DataRow<C>>): ColumnGroup<C> =
96125
getColumn(column)
97126

@@ -105,19 +134,24 @@ public fun <T, C> ColumnsContainer<T>.getColumnGroup(column: ColumnSelector<T, D
105134
public fun <T> ColumnsContainer<T>.getColumnGroupOrNull(name: String): ColumnGroup<*>? =
106135
getColumnOrNull(name)?.asColumnGroup()
107136

137+
@AccessApiOverload
108138
public fun <T> ColumnsContainer<T>.getColumnGroupOrNull(column: KProperty<*>): ColumnGroup<*>? =
109139
getColumnGroupOrNull(column.columnName)
110140

111141
// endregion
112142

113143
// region containsColumn
114144

145+
@AccessApiOverload
115146
public fun <C> ColumnsContainer<*>.containsColumn(column: ColumnReference<C>): Boolean = getColumnOrNull(column) != null
116147

148+
@AccessApiOverload
117149
public fun ColumnsContainer<*>.containsColumn(column: KProperty<*>): Boolean = containsColumn(column.columnName)
118150

151+
@AccessApiOverload
119152
public operator fun ColumnsContainer<*>.contains(column: AnyColumnReference): Boolean = containsColumn(column)
120153

154+
@AccessApiOverload
121155
public operator fun ColumnsContainer<*>.contains(column: KProperty<*>): Boolean = containsColumn(column)
122156

123157
// region rows

core/generated-sources/src/main/kotlin/org/jetbrains/kotlinx/dataframe/api/DataRowApi.kt

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@ import org.jetbrains.kotlinx.dataframe.DataColumn
77
import org.jetbrains.kotlinx.dataframe.DataFrame
88
import org.jetbrains.kotlinx.dataframe.DataRow
99
import org.jetbrains.kotlinx.dataframe.RowExpression
10+
import org.jetbrains.kotlinx.dataframe.annotations.AccessApiOverload
1011
import org.jetbrains.kotlinx.dataframe.annotations.DataSchema
1112
import org.jetbrains.kotlinx.dataframe.columns.ColumnReference
1213
import org.jetbrains.kotlinx.dataframe.impl.columnName
@@ -60,10 +61,12 @@ public fun <T> AnyRow.getValue(columnName: String): T = get(columnName) as T
6061

6162
public fun <T> AnyRow.getValue(column: ColumnReference<T>): T = get(column)
6263

64+
@AccessApiOverload
6365
public fun <T> AnyRow.getValue(column: KProperty<T>): T = get(column)
6466

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

69+
@AccessApiOverload
6770
public fun <T> AnyRow.getValueOrNull(column: KProperty<T>): T? = getValueOrNull<T>(column.columnName)
6871

6972
// endregion
@@ -74,10 +77,12 @@ public fun AnyRow.containsKey(columnName: String): Boolean = owner.containsColum
7477

7578
public fun AnyRow.containsKey(column: AnyColumnReference): Boolean = owner.containsColumn(column)
7679

80+
@AccessApiOverload
7781
public fun AnyRow.containsKey(column: KProperty<*>): Boolean = owner.containsColumn(column)
7882

7983
public operator fun AnyRow.contains(column: AnyColumnReference): Boolean = containsKey(column)
8084

85+
@AccessApiOverload
8186
public operator fun AnyRow.contains(column: KProperty<*>): Boolean = containsKey(column)
8287

8388
// endregion

0 commit comments

Comments
 (0)