Skip to content

Commit 7eac7ce

Browse files
committed
Merge branch 'master' into ktlint-migration
# Conflicts: # core/generated-sources/src/main/kotlin/org/jetbrains/kotlinx/dataframe/api/all.kt # core/generated-sources/src/main/kotlin/org/jetbrains/kotlinx/dataframe/api/cast.kt # core/generated-sources/src/main/kotlin/org/jetbrains/kotlinx/dataframe/api/convert.kt # core/generated-sources/src/main/kotlin/org/jetbrains/kotlinx/dataframe/api/frameCols.kt # core/generated-sources/src/main/kotlin/org/jetbrains/kotlinx/dataframe/codeGen/GeneratedField.kt # core/generated-sources/src/main/kotlin/org/jetbrains/kotlinx/dataframe/codeGen/MarkersExtractor.kt # core/generated-sources/src/main/kotlin/org/jetbrains/kotlinx/dataframe/codeGen/generateCode.kt # core/generated-sources/src/main/kotlin/org/jetbrains/kotlinx/dataframe/impl/api/toDataFrame.kt # core/generated-sources/src/main/kotlin/org/jetbrains/kotlinx/dataframe/impl/codeGen/CodeGeneratorImpl.kt # core/generated-sources/src/main/kotlin/org/jetbrains/kotlinx/dataframe/impl/codeGen/SchemaProcessorImpl.kt # core/generated-sources/src/main/kotlin/org/jetbrains/kotlinx/dataframe/impl/schema/Utils.kt # core/generated-sources/src/main/kotlin/org/jetbrains/kotlinx/dataframe/jupyter/CellRenderer.kt # core/generated-sources/src/test/kotlin/org/jetbrains/kotlinx/dataframe/codeGen/ShortNamesRenderingTest.kt # core/src/main/kotlin/org/jetbrains/kotlinx/dataframe/api/all.kt # core/src/main/kotlin/org/jetbrains/kotlinx/dataframe/api/cast.kt # core/src/main/kotlin/org/jetbrains/kotlinx/dataframe/api/convert.kt # core/src/main/kotlin/org/jetbrains/kotlinx/dataframe/api/frameCols.kt # core/src/main/kotlin/org/jetbrains/kotlinx/dataframe/codeGen/GeneratedField.kt # core/src/main/kotlin/org/jetbrains/kotlinx/dataframe/codeGen/MarkersExtractor.kt # core/src/main/kotlin/org/jetbrains/kotlinx/dataframe/codeGen/generateCode.kt # core/src/main/kotlin/org/jetbrains/kotlinx/dataframe/impl/api/toDataFrame.kt # core/src/main/kotlin/org/jetbrains/kotlinx/dataframe/impl/codeGen/CodeGeneratorImpl.kt # core/src/main/kotlin/org/jetbrains/kotlinx/dataframe/impl/codeGen/SchemaProcessorImpl.kt # core/src/main/kotlin/org/jetbrains/kotlinx/dataframe/impl/schema/Utils.kt # core/src/main/kotlin/org/jetbrains/kotlinx/dataframe/jupyter/CellRenderer.kt # core/src/test/kotlin/org/jetbrains/kotlinx/dataframe/codeGen/ShortNamesRenderingTest.kt # dataframe-openapi/src/main/kotlin/org/jetbrains/kotlinx/dataframe/io/OpenApiType.kt # dataframe-openapi/src/test/kotlin/OpenApiTests.kt # plugins/symbol-processor/src/main/kotlin/org/jetbrains/dataframe/ksp/PropertyRenderer.kt
2 parents ebd84be + 0896fa5 commit 7eac7ce

File tree

100 files changed

+3989
-1892
lines changed

Some content is hidden

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

100 files changed

+3989
-1892
lines changed

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

Lines changed: 367 additions & 216 deletions
Large diffs are not rendered by default.

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

Lines changed: 11 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -26,21 +26,19 @@ import kotlin.reflect.typeOf
2626
@Check
2727
public fun <T> AnyFrame.cast(): DataFrame<T> = this as DataFrame<T>
2828

29-
public inline fun <reified T> AnyFrame.cast(verify: Boolean = true): DataFrame<T> =
30-
if (verify) {
31-
convertToImpl(
32-
typeOf<T>(),
33-
allowConversion = false,
34-
ExcessiveColumns.Keep,
35-
).cast()
36-
} else {
37-
cast()
38-
}
29+
public inline fun <reified T> AnyFrame.cast(verify: Boolean = true): DataFrame<T> = if (verify) convertToImpl(
30+
typeOf<T>(),
31+
allowConversion = false,
32+
ExcessiveColumns.Keep
33+
).cast()
34+
else cast()
3935

4036
public inline fun <reified T> AnyFrame.castTo(
41-
@Suppress("UNUSED_PARAMETER") df: DataFrame<T>,
42-
verify: Boolean = true,
43-
): DataFrame<T> = cast<T>(verify = verify)
37+
@Suppress("UNUSED_PARAMETER") schemaFrom: DataFrame<T>,
38+
verify: Boolean = true
39+
): DataFrame<T> {
40+
return cast<T>(verify = verify)
41+
}
4442

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

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

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ import org.jetbrains.kotlinx.dataframe.ColumnFilter
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.annotations.Interpretable
78
import org.jetbrains.kotlinx.dataframe.api.ColsAtAnyDepthColumnsSelectionDsl.Grammar
89
import org.jetbrains.kotlinx.dataframe.columns.ColumnGroup
910
import org.jetbrains.kotlinx.dataframe.columns.ColumnPath
@@ -272,6 +273,7 @@ public interface ColsAtAnyDepthColumnsSelectionDsl {
272273
* @see [DataFrame.flatten]
273274
* @see [ColumnsSelectionDsl.simplify]
274275
*/
276+
@Interpretable("ColsAtAnyDepth0")
275277
public fun ColumnsSelectionDsl<*>.colsAtAnyDepth(predicate: ColumnFilter<*> = { true }): ColumnSet<*> =
276278
asSingleColumn().colsAtAnyDepthInternal(predicate)
277279

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

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ import org.jetbrains.kotlinx.dataframe.ColumnFilter
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.annotations.Interpretable
78
import org.jetbrains.kotlinx.dataframe.api.ColsOfColumnsSelectionDsl.Grammar
89
import org.jetbrains.kotlinx.dataframe.columns.ColumnPath
910
import org.jetbrains.kotlinx.dataframe.columns.ColumnSet
@@ -412,6 +413,7 @@ public fun <C> ColumnSet<*>.colsOf(type: KType, filter: ColumnFilter<C> = { true
412413
* @param [filter] an optional filter function that takes a column of type [C] and returns `true` if the column should be included.
413414
* @return A [ColumnSet][org.jetbrains.kotlinx.dataframe.columns.ColumnSet] containing the columns of given type that were included by [filter].
414415
*/
416+
@Interpretable("ColsOf1")
415417
public inline fun <reified C> ColumnSet<*>.colsOf(
416418
noinline filter: ColumnFilter<C> = { true },
417419
): TransformableColumnSet<C> = colsOf(typeOf<C>(), filter)
@@ -507,6 +509,7 @@ public fun <C> ColumnsSelectionDsl<*>.colsOf(
507509
* @param [filter] an optional filter function that takes a column of type [C] and returns `true` if the column should be included.
508510
* @return A [ColumnSet][org.jetbrains.kotlinx.dataframe.columns.ColumnSet] containing the columns of given type that were included by [filter].
509511
*/
512+
@Interpretable("ColsOf0")
510513
public inline fun <reified C> ColumnsSelectionDsl<*>.colsOf(
511514
noinline filter: ColumnFilter<C> = { true },
512515
): TransformableColumnSet<C> = asSingleColumn().colsOf(typeOf<C>(), filter)

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

Lines changed: 44 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -8,14 +8,15 @@ import kotlinx.datetime.toLocalDateTime
88
import org.jetbrains.kotlinx.dataframe.AnyBaseCol
99
import org.jetbrains.kotlinx.dataframe.AnyCol
1010
import org.jetbrains.kotlinx.dataframe.AnyFrame
11+
import org.jetbrains.kotlinx.dataframe.ColumnsContainer
1112
import org.jetbrains.kotlinx.dataframe.ColumnsSelector
1213
import org.jetbrains.kotlinx.dataframe.DataColumn
1314
import org.jetbrains.kotlinx.dataframe.DataFrame
15+
import org.jetbrains.kotlinx.dataframe.DataRow
1416
import org.jetbrains.kotlinx.dataframe.RowColumnExpression
1517
import org.jetbrains.kotlinx.dataframe.RowValueExpression
16-
import org.jetbrains.kotlinx.dataframe.annotations.HasSchema
17-
import org.jetbrains.kotlinx.dataframe.annotations.Interpretable
18-
import org.jetbrains.kotlinx.dataframe.annotations.Refine
18+
import org.jetbrains.kotlinx.dataframe.annotations.*
19+
import org.jetbrains.kotlinx.dataframe.columns.ColumnGroup
1920
import org.jetbrains.kotlinx.dataframe.columns.ColumnReference
2021
import org.jetbrains.kotlinx.dataframe.columns.toColumnSet
2122
import org.jetbrains.kotlinx.dataframe.dataTypes.IFRAME
@@ -36,17 +37,19 @@ import org.jetbrains.kotlinx.dataframe.path
3637
import java.math.BigDecimal
3738
import java.net.URL
3839
import java.time.LocalTime
39-
import java.util.Locale
40+
import java.util.*
4041
import kotlin.reflect.KProperty
4142
import kotlin.reflect.KType
4243
import kotlin.reflect.full.isSubtypeOf
4344
import kotlin.reflect.full.withNullability
4445
import kotlin.reflect.typeOf
4546

4647
@Interpretable("Convert0")
47-
public fun <T, C> DataFrame<T>.convert(columns: ColumnsSelector<T, C>): Convert<T, C> = Convert(this, columns)
48+
public fun <T, C> DataFrame<T>.convert(columns: ColumnsSelector<T, C>): Convert<T, C> =
49+
Convert(this, columns)
4850

49-
public fun <T, C> DataFrame<T>.convert(vararg columns: KProperty<C>): Convert<T, C> = convert { columns.toColumnSet() }
51+
public fun <T, C> DataFrame<T>.convert(vararg columns: KProperty<C>): Convert<T, C> =
52+
convert { columns.toColumnSet() }
5053

5154
@Interpretable("Convert2")
5255
public fun <T> DataFrame<T>.convert(vararg columns: String): Convert<T, Any?> = convert { columns.toColumnSet() }
@@ -59,32 +62,30 @@ public inline fun <T, C, reified R> DataFrame<T>.convert(
5962
vararg cols: ColumnReference<C>,
6063
infer: Infer = Infer.Nulls,
6164
noinline expression: RowValueExpression<T, C, R>,
62-
): DataFrame<T> = convert(*headPlusArray(firstCol, cols)).with(infer, expression)
65+
): DataFrame<T> =
66+
convert(*headPlusArray(firstCol, cols)).with(infer, expression)
6367

6468
public inline fun <T, C, reified R> DataFrame<T>.convert(
6569
firstCol: KProperty<C>,
6670
vararg cols: KProperty<C>,
6771
infer: Infer = Infer.Nulls,
6872
noinline expression: RowValueExpression<T, C, R>,
69-
): DataFrame<T> = convert(*headPlusArray(firstCol, cols)).with(infer, expression)
73+
): DataFrame<T> =
74+
convert(*headPlusArray(firstCol, cols)).with(infer, expression)
7075

7176
@Interpretable("Convert6")
7277
public inline fun <T, reified R> DataFrame<T>.convert(
7378
firstCol: String,
7479
vararg cols: String,
7580
infer: Infer = Infer.Nulls,
7681
noinline expression: RowValueExpression<T, Any?, R>,
77-
): DataFrame<T> = convert(*headPlusArray(firstCol, cols)).with(infer, expression)
78-
79-
public inline fun <T, C, reified R> Convert<T, C?>.notNull(
80-
crossinline expression: RowValueExpression<T, C, R>,
8182
): DataFrame<T> =
83+
convert(*headPlusArray(firstCol, cols)).with(infer, expression)
84+
85+
public inline fun <T, C, reified R> Convert<T, C?>.notNull(crossinline expression: RowValueExpression<T, C, R>): DataFrame<T> =
8286
with {
83-
if (it == null) {
84-
null
85-
} else {
86-
expression(this, it)
87-
}
87+
if (it == null) null
88+
else expression(this, it)
8889
}
8990

9091
@HasSchema(schemaArg = 0)
@@ -104,25 +105,29 @@ public fun <T, C> Convert<T, C>.to(columnConverter: DataFrame<T>.(DataColumn<C>)
104105
public inline fun <T, C, reified R> Convert<T, C>.with(
105106
infer: Infer = Infer.Nulls,
106107
noinline rowConverter: RowValueExpression<T, C, R>,
107-
): DataFrame<T> = withRowCellImpl(typeOf<R>(), infer, rowConverter)
108+
): DataFrame<T> =
109+
withRowCellImpl(typeOf<R>(), infer, rowConverter)
108110

109111
@Refine
110112
@Interpretable("With0")
111113
public inline fun <T, C, reified R> Convert<T, C>.with(
112-
noinline rowConverter: RowValueExpression<T, C, R>,
114+
noinline rowConverter: RowValueExpression<T, C, R>
113115
): DataFrame<T> = with(Infer.Nulls, rowConverter)
114116

117+
public fun <T, C, R> Convert<T, DataRow<C>>.asFrame(body: ColumnsContainer<T>.(ColumnGroup<C>) -> DataFrame<R>): DataFrame<T> =
118+
to { body(this, it.asColumnGroup()).asColumnGroup(it.name()) }
119+
115120
public inline fun <T, C, reified R> Convert<T, C>.perRowCol(
116121
infer: Infer = Infer.Nulls,
117122
noinline expression: RowColumnExpression<T, C, R>,
118-
): DataFrame<T> = convertRowColumnImpl(typeOf<R>(), infer, expression)
123+
): DataFrame<T> =
124+
convertRowColumnImpl(typeOf<R>(), infer, expression)
119125

120126
public inline fun <reified C> AnyCol.convertTo(): DataColumn<C> = convertTo(typeOf<C>()) as DataColumn<C>
121127

122128
public fun AnyCol.convertTo(newType: KType): AnyCol {
123-
val isTypesAreCorrect =
124-
this.type().withNullability(true).isSubtypeOf(typeOf<String?>()) &&
125-
newType.withNullability(true) == typeOf<Double?>()
129+
val isTypesAreCorrect = this.type().withNullability(true)
130+
.isSubtypeOf(typeOf<String?>()) && newType.withNullability(true) == typeOf<Double?>()
126131

127132
if (isTypesAreCorrect) {
128133
return (this as DataColumn<String?>).convertToDouble().setNullable(newType.isMarkedNullable)
@@ -181,8 +186,9 @@ public fun <T : Any> DataColumn<T?>.convertToDouble(): DataColumn<Double?> = con
181186
* If [locale] parameter is null, the current system locale is used. If column can not be parsed, then POSIX format is used.
182187
*/
183188
@JvmName("convertToDoubleFromString")
184-
public fun DataColumn<String>.convertToDouble(locale: Locale? = null): DataColumn<Double> =
185-
this.castToNullable().convertToDouble(locale).castToNotNullable()
189+
public fun DataColumn<String>.convertToDouble(locale: Locale? = null): DataColumn<Double> {
190+
return this.castToNullable().convertToDouble(locale).castToNotNullable()
191+
}
186192

187193
/**
188194
* Parse String column to Double considering locale (number format).
@@ -201,7 +207,7 @@ public fun DataColumn<String?>.convertToDouble(locale: Locale? = null): DataColu
201207
value = value,
202208
from = typeOf<String>(),
203209
to = typeOf<Double>(),
204-
column = path,
210+
column = path
205211
)
206212
}
207213
}
@@ -254,21 +260,29 @@ public fun <T, R : URL?> Convert<T, R>.toImg(width: Int? = null, height: Int? =
254260

255261
// region toURL
256262

257-
public fun DataColumn<String>.convertToURL(): DataColumn<URL> = map { URL(it) }
263+
public fun DataColumn<String>.convertToURL(): DataColumn<URL> {
264+
return map { URL(it) }
265+
}
258266

259267
@JvmName("convertToURLFromStringNullable")
260-
public fun DataColumn<String?>.convertToURL(): DataColumn<URL?> = map { it?.let { URL(it) } }
268+
public fun DataColumn<String?>.convertToURL(): DataColumn<URL?> {
269+
return map { it?.let { URL(it) } }
270+
}
261271

262272
public fun <T, R : String?> Convert<T, R>.toURL(): DataFrame<T> = to { it.convertToURL() }
263273

264274
// endregion
265275

266276
// region toInstant
267277

268-
public fun DataColumn<String>.convertToInstant(): DataColumn<Instant> = map { Instant.parse(it) }
278+
public fun DataColumn<String>.convertToInstant(): DataColumn<Instant> {
279+
return map { Instant.parse(it) }
280+
}
269281

270282
@JvmName("convertToInstantFromStringNullable")
271-
public fun DataColumn<String?>.convertToInstant(): DataColumn<Instant?> = map { it?.let { Instant.parse(it) } }
283+
public fun DataColumn<String?>.convertToInstant(): DataColumn<Instant?> {
284+
return map { it?.let { Instant.parse(it) } }
285+
}
272286

273287
public fun <T, R : String?> Convert<T, R>.toInstant(): DataFrame<T> = to { it.convertToInstant() }
274288

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

Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -160,6 +160,43 @@ public inline fun <reified T : Any> AnyFrame.convertTo(
160160
noinline body: ConvertSchemaDsl<T>.() -> Unit = {},
161161
): DataFrame<T> = convertToImpl(typeOf<T>(), true, excessiveColumnsBehavior, body).cast()
162162

163+
/**
164+
* Converts values in [DataFrame] to match given column schema [T].
165+
*
166+
* Original columns are mapped to destination columns by column [path][DataColumn.path].
167+
*
168+
* Type converters for every column are selected automatically. See [convert] operation for details.
169+
*
170+
* To specify custom type converters for the particular types use [ConvertSchemaDsl].
171+
*
172+
* Example of Dsl:
173+
* ```kotlin
174+
* df.convertTo(schemaFrom = sample) {
175+
* // defines how to convert Int? -> String
176+
* convert<Int?>().with { it?.toString() ?: "No input given" }
177+
* // defines how to convert String -> SomeType
178+
* parser { SomeType(it) }
179+
* // fill missing column `sum` with expression `a + b`
180+
* fill { sum }.with { a + b }
181+
* }
182+
* ```
183+
*
184+
* @param [T] class that defines target schema for conversion.
185+
* @param [schemaFrom] dataframe which type [T] will be used.
186+
* @param [excessiveColumnsBehavior] how to handle excessive columns in the original [DataFrame].
187+
* @param [body] optional dsl to define custom type converters.
188+
* @throws [ColumnNotFoundException] if [DataFrame] doesn't contain columns that are required by destination schema.
189+
* @throws [ExcessiveColumnsException] if [DataFrame] contains columns that are not required by destination schema and [excessiveColumnsBehavior] is set to [ExcessiveColumns.Fail].
190+
* @throws [TypeConverterNotFoundException] if suitable type converter for some column was not found.
191+
* @throws [TypeConversionException] if type converter failed to convert column values.
192+
* @return converted [DataFrame].
193+
*/
194+
public inline fun <reified T : Any> AnyFrame.convertTo(
195+
@Suppress("UNUSED_PARAMETER") schemaFrom: DataFrame<T>,
196+
excessiveColumnsBehavior: ExcessiveColumns = ExcessiveColumns.Keep,
197+
noinline body: ConvertSchemaDsl<T>.() -> Unit = {}
198+
): DataFrame<T> = convertToImpl(typeOf<T>(), true, excessiveColumnsBehavior, body).cast()
199+
163200
/**
164201
* Converts values in [DataFrame] to match given column schema [schemaType].
165202
*

0 commit comments

Comments
 (0)