1
1
package org.jetbrains.kotlinx.dataframe.impl.api
2
2
3
+ import kotlinx.coroutines.async
4
+ import kotlinx.coroutines.awaitAll
5
+ import kotlinx.coroutines.coroutineScope
6
+ import kotlinx.coroutines.runBlocking
3
7
import kotlinx.datetime.Instant
4
8
import kotlinx.datetime.LocalDate
5
9
import kotlinx.datetime.LocalDateTime
@@ -18,13 +22,16 @@ import org.jetbrains.kotlinx.dataframe.DataRow
18
22
import org.jetbrains.kotlinx.dataframe.api.GlobalParserOptions
19
23
import org.jetbrains.kotlinx.dataframe.api.ParserOptions
20
24
import org.jetbrains.kotlinx.dataframe.api.asColumnGroup
25
+ import org.jetbrains.kotlinx.dataframe.api.asComparable
21
26
import org.jetbrains.kotlinx.dataframe.api.asDataColumn
27
+ import org.jetbrains.kotlinx.dataframe.api.asFrameColumn
22
28
import org.jetbrains.kotlinx.dataframe.api.cast
23
- import org.jetbrains.kotlinx.dataframe.api.convert
29
+ import org.jetbrains.kotlinx.dataframe.api.getColumns
24
30
import org.jetbrains.kotlinx.dataframe.api.isColumnGroup
25
31
import org.jetbrains.kotlinx.dataframe.api.isFrameColumn
26
- import org.jetbrains.kotlinx.dataframe.api.parse
27
- import org.jetbrains.kotlinx.dataframe.api.to
32
+ import org.jetbrains.kotlinx.dataframe.api.name
33
+ import org.jetbrains.kotlinx.dataframe.api.toColumn
34
+ import org.jetbrains.kotlinx.dataframe.api.toDataFrame
28
35
import org.jetbrains.kotlinx.dataframe.api.tryParse
29
36
import org.jetbrains.kotlinx.dataframe.columns.size
30
37
import org.jetbrains.kotlinx.dataframe.columns.values
@@ -37,6 +44,7 @@ import org.jetbrains.kotlinx.dataframe.impl.javaDurationCanParse
37
44
import org.jetbrains.kotlinx.dataframe.io.isURL
38
45
import org.jetbrains.kotlinx.dataframe.io.readJsonStr
39
46
import org.jetbrains.kotlinx.dataframe.typeClass
47
+ import org.jetbrains.kotlinx.dataframe.values
40
48
import java.math.BigDecimal
41
49
import java.net.URL
42
50
import java.text.NumberFormat
@@ -541,19 +549,39 @@ internal fun <T> DataColumn<String?>.parse(parser: StringParser<T>, options: Par
541
549
return DataColumn .createValueColumn(name(), parsedValues, parser.type.withNullability(hasNulls)) as DataColumn <T ?>
542
550
}
543
551
544
- internal fun <T > DataFrame<T>.parseImpl (options : ParserOptions ? , columns : ColumnsSelector <T , Any ?>) =
545
- convert(columns).to {
546
- when {
547
- it.isFrameColumn() -> it.cast<AnyFrame ?>().parse(options)
548
-
549
- it.isColumnGroup() ->
550
- it.asColumnGroup()
551
- .parse(options) { all() }
552
- .asColumnGroup(it.name())
553
- .asDataColumn()
554
-
555
- it.typeClass == String ::class -> it.cast<String ?>().tryParse(options)
556
-
557
- else -> it
558
- }
552
+ internal fun <T > DataFrame<T>.parseImpl (options : ParserOptions ? , columns : ColumnsSelector <T , Any ?>): DataFrame <T > =
553
+ runBlocking { parseParallel(options, columns) }
554
+
555
+ private suspend fun <T > DataFrame<T>.parseParallel (
556
+ options : ParserOptions ? ,
557
+ columns : ColumnsSelector <T , Any ?>,
558
+ ): DataFrame <T > =
559
+ coroutineScope {
560
+ getColumns(columns).map {
561
+ async {
562
+ when {
563
+ it.isFrameColumn() ->
564
+ it.asFrameColumn().values.map {
565
+ async {
566
+ it.parseParallel(options) {
567
+ colsAtAnyDepth { ! it.isColumnGroup() }
568
+ }
569
+ }
570
+ }.awaitAll()
571
+ .toColumn(it.name)
572
+
573
+
574
+ it.isColumnGroup() ->
575
+ it.asColumnGroup().parseParallel(options) { all() }
576
+ .asColumnGroup(it.name())
577
+ .asDataColumn()
578
+
579
+ it.typeClass == String ::class -> it.cast<String ?>().tryParse(options)
580
+
581
+ else -> it
582
+ }
583
+ }
584
+ }.awaitAll()
585
+ .toDataFrame()
586
+ .cast()
559
587
}
0 commit comments