Skip to content

Commit 13404d2

Browse files
committed
Merge branch 'master' into 0.14-post-release
# Conflicts: # README.md # docs/StardustDocs/v.list
2 parents d68caea + 096a86a commit 13404d2

File tree

28 files changed

+106
-84
lines changed

28 files changed

+106
-84
lines changed

.github/workflows/main.yml

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -89,9 +89,9 @@ jobs:
8989
container:
9090
image: registry.jetbrains.team/p/writerside/builder/algolia-publisher:2.0.32-2
9191

92-
steps:
93-
- uses: actions/checkout@v4
94-
- uses: actions/download-artifact@v4
92+
steps: # Using v3 for compatibility with algolia-indexes
93+
- uses: actions/checkout@v3
94+
- uses: actions/download-artifact@v3
9595
with:
9696
name: algolia-indexes
9797
- uses: montudor/action-zip@v1

README.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -38,7 +38,7 @@ You could find the following articles there:
3838
* [Rendering to HTML](https://kotlin.github.io/dataframe/tohtml.html#jupyter-notebooks)
3939

4040
### What's new
41-
Check out this [notebook with new features](examples/notebooks/feature_overviews/0.14.1/new_features.ipynb) in development for the next release.
41+
Check out this [notebook with new features](examples/notebooks/feature_overviews/0.14.0/new_features.ipynb) in development for the next release.
4242

4343
The DataFrame compiler plugin has reached public preview!
4444
Here's a [compiler plugin demo project](https://github.com/koperagen/df-plugin-demo) that works with [IntelliJ IDEA](https://www.jetbrains.com/idea/) 2024.2.

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

Lines changed: 19 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,23 +1,39 @@
1+
@file:OptIn(ExperimentalContracts::class)
2+
13
package org.jetbrains.kotlinx.dataframe.api
24

35
import org.jetbrains.kotlinx.dataframe.AnyCol
6+
import org.jetbrains.kotlinx.dataframe.columns.ColumnGroup
47
import org.jetbrains.kotlinx.dataframe.columns.ColumnKind
8+
import org.jetbrains.kotlinx.dataframe.columns.FrameColumn
9+
import org.jetbrains.kotlinx.dataframe.columns.ValueColumn
510
import org.jetbrains.kotlinx.dataframe.impl.isNothing
611
import org.jetbrains.kotlinx.dataframe.impl.projectTo
712
import org.jetbrains.kotlinx.dataframe.type
813
import org.jetbrains.kotlinx.dataframe.typeClass
14+
import kotlin.contracts.ExperimentalContracts
15+
import kotlin.contracts.contract
916
import kotlin.reflect.KClass
1017
import kotlin.reflect.KType
1118
import kotlin.reflect.KTypeProjection
1219
import kotlin.reflect.full.isSubclassOf
1320
import kotlin.reflect.full.isSubtypeOf
1421
import kotlin.reflect.typeOf
1522

16-
public fun AnyCol.isColumnGroup(): Boolean = kind() == ColumnKind.Group
23+
public fun AnyCol.isColumnGroup(): Boolean {
24+
contract { returns(true) implies (this@isColumnGroup is ColumnGroup<*>) }
25+
return kind() == ColumnKind.Group
26+
}
1727

18-
public fun AnyCol.isFrameColumn(): Boolean = kind() == ColumnKind.Frame
28+
public fun AnyCol.isFrameColumn(): Boolean {
29+
contract { returns(true) implies (this@isFrameColumn is FrameColumn<*>) }
30+
return kind() == ColumnKind.Frame
31+
}
1932

20-
public fun AnyCol.isValueColumn(): Boolean = kind() == ColumnKind.Value
33+
public fun AnyCol.isValueColumn(): Boolean {
34+
contract { returns(true) implies (this@isValueColumn is ValueColumn<*>) }
35+
return kind() == ColumnKind.Value
36+
}
2137

2238
public fun AnyCol.isSubtypeOf(type: KType): Boolean =
2339
this.type.isSubtypeOf(type) && (!this.type.isMarkedNullable || type.isMarkedNullable)

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

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -390,7 +390,6 @@ public interface ColGroupsColumnsSelectionDsl {
390390
@Suppress("UNCHECKED_CAST")
391391
internal fun ColumnsResolver<*>.columnGroupsInternal(
392392
filter: (ColumnGroup<*>) -> Boolean,
393-
): TransformableColumnSet<AnyRow> =
394-
colsInternal { it.isColumnGroup() && filter(it.asColumnGroup()) } as TransformableColumnSet<AnyRow>
393+
): TransformableColumnSet<AnyRow> = colsInternal { it.isColumnGroup() && filter(it) } as TransformableColumnSet<AnyRow>
395394

396395
// endregion

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

Lines changed: 4 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,6 @@ import org.jetbrains.kotlinx.dataframe.annotations.Interpretable
1111
import org.jetbrains.kotlinx.dataframe.annotations.Refine
1212
import org.jetbrains.kotlinx.dataframe.columns.FrameColumn
1313
import org.jetbrains.kotlinx.dataframe.columns.toColumnSet
14-
import org.jetbrains.kotlinx.dataframe.impl.GroupByImpl
1514
import org.jetbrains.kotlinx.dataframe.impl.aggregation.PivotImpl
1615
import org.jetbrains.kotlinx.dataframe.impl.api.getPivotColumnPaths
1716
import org.jetbrains.kotlinx.dataframe.impl.api.groupByImpl
@@ -85,24 +84,17 @@ public interface GroupBy<out T, out G> : Grouped<G> {
8584

8685
public fun filter(predicate: GroupedRowFilter<T, G>): GroupBy<T, G>
8786

87+
@Refine
88+
@Interpretable("GroupByToDataFrame")
89+
public fun toDataFrame(groupedColumnName: String? = null): DataFrame<T>
90+
8891
public data class Entry<T, G>(val key: DataRow<T>, val group: DataFrame<G>)
8992

9093
public companion object {
9194
internal val groupedColumnAccessor = column<AnyFrame>("group")
9295
}
9396
}
9497

95-
@Refine
96-
@Interpretable("GroupByToDataFrame")
97-
public fun <T, G> GroupBy<T, G>.toDataFrame(groupedColumnName: String? = null): DataFrame<T> =
98-
if (groupedColumnName == null || groupedColumnName == groups.name()) {
99-
internal().df
100-
} else {
101-
internal().df.rename(groups).into(groupedColumnName)
102-
}
103-
104-
internal fun <T, G> GroupBy<T, G>.internal(): GroupByImpl<T, G> = this as GroupByImpl<T, G>
105-
10698
public interface Grouped<out T> : Aggregatable<T>
10799

108100
public class ReducedGroupBy<T, G>(

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

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -546,8 +546,7 @@ internal fun <C, R> SingleColumn<DataRow<C>>.selectInternal(selector: ColumnsSel
546546
"Column ${col.path} is not a ColumnGroup and can thus not be selected from."
547547
}
548548

549-
col.asColumnGroup()
550-
.getColumnsWithPaths(selector as ColumnsSelector<*, R>)
549+
col.getColumnsWithPaths(selector as ColumnsSelector<*, R>)
551550
.map { it.changePath(col.path + it.path) }
552551
} ?: emptyList()
553552
}

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -357,6 +357,6 @@ public interface ValueColsColumnsSelectionDsl {
357357
* @return A [TransformableColumnSet] containing the value columns that satisfy the filter.
358358
*/
359359
internal fun ColumnsResolver<*>.valueColumnsInternal(filter: (ValueColumn<*>) -> Boolean): TransformableColumnSet<*> =
360-
colsInternal { it.isValueColumn() && filter(it.asValueColumn()) }
360+
colsInternal { it.isValueColumn() && filter(it) }
361361

362362
// endregion

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

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,6 @@ import org.jetbrains.kotlinx.dataframe.ColumnSelector
44
import org.jetbrains.kotlinx.dataframe.DataColumn
55
import org.jetbrains.kotlinx.dataframe.DataFrame
66
import org.jetbrains.kotlinx.dataframe.DataRow
7-
import org.jetbrains.kotlinx.dataframe.api.asColumnGroup
87
import org.jetbrains.kotlinx.dataframe.api.asDataColumn
98
import org.jetbrains.kotlinx.dataframe.api.cast
109
import org.jetbrains.kotlinx.dataframe.api.isColumnGroup
@@ -78,7 +77,9 @@ internal open class DataFrameReceiver<T>(
7877
DataColumn.createColumnGroup("", df).addPath(emptyPath())
7978

8079
override fun columns() =
81-
df.columns().map { if (it.isColumnGroup()) ColumnGroupWithParent(null, it.asColumnGroup()) else it }
80+
df.columns().map {
81+
if (it.isColumnGroup()) ColumnGroupWithParent(null, it) else it
82+
}
8283

8384
override fun columnNames() = df.columnNames()
8485

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

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,9 +13,11 @@ import org.jetbrains.kotlinx.dataframe.api.concat
1313
import org.jetbrains.kotlinx.dataframe.api.convert
1414
import org.jetbrains.kotlinx.dataframe.api.getColumn
1515
import org.jetbrains.kotlinx.dataframe.api.getColumnsWithPaths
16+
import org.jetbrains.kotlinx.dataframe.api.into
1617
import org.jetbrains.kotlinx.dataframe.api.isColumnGroup
1718
import org.jetbrains.kotlinx.dataframe.api.minus
1819
import org.jetbrains.kotlinx.dataframe.api.pathOf
20+
import org.jetbrains.kotlinx.dataframe.api.rename
1921
import org.jetbrains.kotlinx.dataframe.columns.FrameColumn
2022
import org.jetbrains.kotlinx.dataframe.impl.aggregation.AggregatableInternal
2123
import org.jetbrains.kotlinx.dataframe.impl.aggregation.GroupByReceiverImpl
@@ -56,6 +58,13 @@ internal class GroupByImpl<T, G>(
5658
}
5759
return df[indices].asGroupBy(groups)
5860
}
61+
62+
override fun toDataFrame(groupedColumnName: String?): DataFrame<T> =
63+
if (groupedColumnName == null || groupedColumnName == groups.name()) {
64+
df
65+
} else {
66+
df.rename(groups).into(groupedColumnName)
67+
}
5968
}
6069

6170
internal fun <T, G, R> aggregateGroupBy(

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

Lines changed: 3 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -15,10 +15,10 @@ import org.jetbrains.kotlinx.dataframe.api.Infer
1515
import org.jetbrains.kotlinx.dataframe.api.add
1616
import org.jetbrains.kotlinx.dataframe.api.all
1717
import org.jetbrains.kotlinx.dataframe.api.allNulls
18-
import org.jetbrains.kotlinx.dataframe.api.asColumnGroup
1918
import org.jetbrains.kotlinx.dataframe.api.concat
2019
import org.jetbrains.kotlinx.dataframe.api.convertTo
2120
import org.jetbrains.kotlinx.dataframe.api.emptyDataFrame
21+
import org.jetbrains.kotlinx.dataframe.api.isColumnGroup
2222
import org.jetbrains.kotlinx.dataframe.api.isEmpty
2323
import org.jetbrains.kotlinx.dataframe.api.map
2424
import org.jetbrains.kotlinx.dataframe.api.name
@@ -197,14 +197,12 @@ internal fun AnyFrame.convertToImpl(
197197

198198
else -> originalColumn
199199
}
200-
require(column.kind == ColumnKind.Group) {
200+
require(column.isColumnGroup()) {
201201
"Column `${column.name}` is ${column.kind} and can not be converted to `ColumnGroup`"
202202
}
203-
val columnGroup = column.asColumnGroup()
204-
205203
DataColumn.createColumnGroup(
206204
name = column.name(),
207-
df = columnGroup.convertToSchema(
205+
df = column.convertToSchema(
208206
schema = (targetSchema as ColumnSchema.Group).schema,
209207
path = columnPath,
210208
),

0 commit comments

Comments
 (0)