Skip to content

Commit 6532ce6

Browse files
authored
Merge pull request #1139 from Kotlin/compiler-plugin-join-support
[Compiler plugin] join operations support
2 parents 94a565c + 9440640 commit 6532ce6

File tree

20 files changed

+677
-79
lines changed

20 files changed

+677
-79
lines changed

core/api/core.api

+14-5
Original file line numberDiff line numberDiff line change
@@ -1186,11 +1186,9 @@ public final class org/jetbrains/kotlinx/dataframe/api/ColumnDescription_Extensi
11861186
public static final fun NullableColumnDescription_unique (Lorg/jetbrains/kotlinx/dataframe/DataRow;)Ljava/lang/Integer;
11871187
}
11881188

1189-
public final class org/jetbrains/kotlinx/dataframe/api/ColumnMatch : org/jetbrains/kotlinx/dataframe/columns/ColumnSet {
1190-
public fun <init> (Lorg/jetbrains/kotlinx/dataframe/columns/ColumnReference;Lorg/jetbrains/kotlinx/dataframe/columns/ColumnReference;)V
1191-
public final fun getLeft ()Lorg/jetbrains/kotlinx/dataframe/columns/ColumnReference;
1192-
public final fun getRight ()Lorg/jetbrains/kotlinx/dataframe/columns/ColumnReference;
1193-
public fun resolve (Lorg/jetbrains/kotlinx/dataframe/columns/ColumnResolutionContext;)Ljava/util/List;
1189+
public abstract interface class org/jetbrains/kotlinx/dataframe/api/ColumnMatch : org/jetbrains/kotlinx/dataframe/columns/ColumnSet {
1190+
public abstract fun getLeft ()Lorg/jetbrains/kotlinx/dataframe/columns/ColumnReference;
1191+
public abstract fun getRight ()Lorg/jetbrains/kotlinx/dataframe/columns/ColumnReference;
11941192
}
11951193

11961194
public abstract interface class org/jetbrains/kotlinx/dataframe/api/ColumnNameFiltersColumnsSelectionDsl {
@@ -2553,6 +2551,7 @@ public final class org/jetbrains/kotlinx/dataframe/api/IsEmptyKt {
25532551
}
25542552

25552553
public abstract interface class org/jetbrains/kotlinx/dataframe/api/JoinDsl : org/jetbrains/kotlinx/dataframe/api/ColumnsSelectionDsl {
2554+
public static final field Companion Lorg/jetbrains/kotlinx/dataframe/api/JoinDsl$Companion;
25562555
public abstract fun getRight ()Lorg/jetbrains/kotlinx/dataframe/DataFrame;
25572556
public fun match (Ljava/lang/String;Ljava/lang/String;)Lorg/jetbrains/kotlinx/dataframe/api/ColumnMatch;
25582557
public fun match (Ljava/lang/String;Lorg/jetbrains/kotlinx/dataframe/columns/ColumnReference;)Lorg/jetbrains/kotlinx/dataframe/api/ColumnMatch;
@@ -2563,7 +2562,13 @@ public abstract interface class org/jetbrains/kotlinx/dataframe/api/JoinDsl : or
25632562
public fun match (Lorg/jetbrains/kotlinx/dataframe/columns/ColumnReference;Lorg/jetbrains/kotlinx/dataframe/columns/ColumnReference;)Lorg/jetbrains/kotlinx/dataframe/api/ColumnMatch;
25642563
}
25652564

2565+
public final class org/jetbrains/kotlinx/dataframe/api/JoinDsl$Companion {
2566+
public final fun defaultJoinColumns (Lorg/jetbrains/kotlinx/dataframe/DataFrame;Lorg/jetbrains/kotlinx/dataframe/DataFrame;)Lkotlin/jvm/functions/Function2;
2567+
public final fun getColumns (Lorg/jetbrains/kotlinx/dataframe/DataFrame;Lorg/jetbrains/kotlinx/dataframe/DataFrame;Lkotlin/jvm/functions/Function2;)Ljava/util/List;
2568+
}
2569+
25662570
public final class org/jetbrains/kotlinx/dataframe/api/JoinKt {
2571+
public static final fun ColumnMatch (Lorg/jetbrains/kotlinx/dataframe/columns/ColumnReference;Lorg/jetbrains/kotlinx/dataframe/columns/ColumnReference;)Lorg/jetbrains/kotlinx/dataframe/api/ColumnMatch;
25672572
public static final fun excludeJoin (Lorg/jetbrains/kotlinx/dataframe/DataFrame;Lorg/jetbrains/kotlinx/dataframe/DataFrame;Lkotlin/jvm/functions/Function2;)Lorg/jetbrains/kotlinx/dataframe/DataFrame;
25682573
public static final fun excludeJoin (Lorg/jetbrains/kotlinx/dataframe/DataFrame;Lorg/jetbrains/kotlinx/dataframe/DataFrame;[Ljava/lang/String;)Lorg/jetbrains/kotlinx/dataframe/DataFrame;
25692574
public static synthetic fun excludeJoin$default (Lorg/jetbrains/kotlinx/dataframe/DataFrame;Lorg/jetbrains/kotlinx/dataframe/DataFrame;Lkotlin/jvm/functions/Function2;ILjava/lang/Object;)Lorg/jetbrains/kotlinx/dataframe/DataFrame;
@@ -5780,6 +5785,10 @@ public final class org/jetbrains/kotlinx/dataframe/impl/codeGen/SchemaReaderKt {
57805785
public static final fun getUrlDfReader (Lorg/jetbrains/kotlinx/dataframe/codeGen/CodeGenerator$Companion;)Lkotlin/jvm/functions/Function2;
57815786
}
57825787

5788+
public abstract interface class org/jetbrains/kotlinx/dataframe/impl/columns/ColumnsList : org/jetbrains/kotlinx/dataframe/columns/ColumnSet {
5789+
public abstract fun getColumns ()Ljava/util/List;
5790+
}
5791+
57835792
public abstract interface class org/jetbrains/kotlinx/dataframe/impl/columns/ColumnsResolverTransformer {
57845793
public abstract fun transform (Lorg/jetbrains/kotlinx/dataframe/columns/ColumnsResolver;)Lorg/jetbrains/kotlinx/dataframe/columns/ColumnsResolver;
57855794
public abstract fun transformSet (Lorg/jetbrains/kotlinx/dataframe/columns/ColumnSet;)Lorg/jetbrains/kotlinx/dataframe/columns/ColumnsResolver;

core/src/main/kotlin/org/jetbrains/kotlinx/dataframe/api/and.kt

+2-2
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@ import org.jetbrains.kotlinx.dataframe.documentation.DoubleIndent
1414
import org.jetbrains.kotlinx.dataframe.documentation.DslGrammarTemplateColumnsSelectionDsl.DslGrammarTemplate
1515
import org.jetbrains.kotlinx.dataframe.documentation.Indent
1616
import org.jetbrains.kotlinx.dataframe.documentation.LineBreak
17-
import org.jetbrains.kotlinx.dataframe.impl.columns.ColumnsList
17+
import org.jetbrains.kotlinx.dataframe.impl.columns.ColumnListImpl
1818
import kotlin.reflect.KProperty
1919

2020
// region ColumnsSelectionDsl
@@ -114,7 +114,7 @@ public interface AndColumnsSelectionDsl {
114114

115115
/** @include [ColumnsResolverAndDocs] {@set [ColumnsResolverAndDocs.Argument] [`colsOf`][SingleColumn.colsOf]`<`[`Int`][Int]`>()`} */
116116
@Interpretable("And0")
117-
public infix fun <C> ColumnsResolver<C>.and(other: ColumnsResolver<C>): ColumnSet<C> = ColumnsList(this, other)
117+
public infix fun <C> ColumnsResolver<C>.and(other: ColumnsResolver<C>): ColumnSet<C> = ColumnListImpl(this, other)
118118

119119
/** @include [ColumnsResolverAndDocs] {@set [ColumnsResolverAndDocs.Argument] `{ colA `[`/`][DataColumn.div]` 2.0 `[`named`][ColumnReference.named]` "half colA" \}`} */
120120
public infix fun <C> ColumnsResolver<C>.and(other: () -> ColumnsResolver<C>): ColumnSet<C> = this and other()

core/src/main/kotlin/org/jetbrains/kotlinx/dataframe/api/join.kt

+47-1
Original file line numberDiff line numberDiff line change
@@ -10,8 +10,12 @@ import org.jetbrains.kotlinx.dataframe.columns.ColumnResolutionContext
1010
import org.jetbrains.kotlinx.dataframe.columns.ColumnSet
1111
import org.jetbrains.kotlinx.dataframe.columns.ColumnWithPath
1212
import org.jetbrains.kotlinx.dataframe.columns.ColumnsResolver
13+
import org.jetbrains.kotlinx.dataframe.columns.UnresolvedColumnsPolicy
1314
import org.jetbrains.kotlinx.dataframe.columns.toColumnSet
15+
import org.jetbrains.kotlinx.dataframe.impl.DataFrameReceiver
16+
import org.jetbrains.kotlinx.dataframe.impl.api.extractJoinColumns
1417
import org.jetbrains.kotlinx.dataframe.impl.api.joinImpl
18+
import org.jetbrains.kotlinx.dataframe.impl.columns.ColumnListImpl
1519
import kotlin.reflect.KProperty
1620

1721
@Refine
@@ -28,6 +32,8 @@ public fun <A, B> DataFrame<A>.join(
2832
type: JoinType = JoinType.Inner,
2933
): DataFrame<A> = join(other, type) { columns.toColumnSet() }
3034

35+
@Refine
36+
@Interpretable("InnerJoin")
3137
public fun <A, B> DataFrame<A>.innerJoin(
3238
other: DataFrame<B>,
3339
selector: JoinColumnsSelector<A, B>? = null,
@@ -36,6 +42,8 @@ public fun <A, B> DataFrame<A>.innerJoin(
3642
public fun <A, B> DataFrame<A>.innerJoin(other: DataFrame<B>, vararg columns: String): DataFrame<A> =
3743
innerJoin(other) { columns.toColumnSet() }
3844

45+
@Refine
46+
@Interpretable("LeftJoin")
3947
public fun <A, B> DataFrame<A>.leftJoin(
4048
other: DataFrame<B>,
4149
selector: JoinColumnsSelector<A, B>? = null,
@@ -44,6 +52,8 @@ public fun <A, B> DataFrame<A>.leftJoin(
4452
public fun <A, B> DataFrame<A>.leftJoin(other: DataFrame<B>, vararg columns: String): DataFrame<A> =
4553
leftJoin(other) { columns.toColumnSet() }
4654

55+
@Refine
56+
@Interpretable("RightJoin")
4757
public fun <A, B> DataFrame<A>.rightJoin(
4858
other: DataFrame<B>,
4959
selector: JoinColumnsSelector<A, B>? = null,
@@ -52,6 +62,8 @@ public fun <A, B> DataFrame<A>.rightJoin(
5262
public fun <A, B> DataFrame<A>.rightJoin(other: DataFrame<B>, vararg columns: String): DataFrame<A> =
5363
rightJoin(other) { columns.toColumnSet() }
5464

65+
@Refine
66+
@Interpretable("FullJoin")
5567
public fun <A, B> DataFrame<A>.fullJoin(
5668
other: DataFrame<B>,
5769
selector: JoinColumnsSelector<A, B>? = null,
@@ -60,6 +72,8 @@ public fun <A, B> DataFrame<A>.fullJoin(
6072
public fun <A, B> DataFrame<A>.fullJoin(other: DataFrame<B>, vararg columns: String): DataFrame<A> =
6173
fullJoin(other) { columns.toColumnSet() }
6274

75+
@Refine
76+
@Interpretable("FilterJoin")
6377
public fun <A, B> DataFrame<A>.filterJoin(
6478
other: DataFrame<B>,
6579
selector: JoinColumnsSelector<A, B>? = null,
@@ -68,6 +82,8 @@ public fun <A, B> DataFrame<A>.filterJoin(
6882
public fun <A, B> DataFrame<A>.filterJoin(other: DataFrame<B>, vararg columns: String): DataFrame<A> =
6983
filterJoin(other) { columns.toColumnSet() }
7084

85+
@Refine
86+
@Interpretable("ExcludeJoin")
7187
public fun <A, B> DataFrame<A>.excludeJoin(
7288
other: DataFrame<B>,
7389
selector: JoinColumnsSelector<A, B>? = null,
@@ -107,14 +123,44 @@ public interface JoinDsl<out A, out B> : ColumnsSelectionDsl<A> {
107123
@AccessApiOverload
108124
public infix fun <C> KProperty<C>.match(other: ColumnReference<C>): ColumnMatch<C> =
109125
ColumnMatch(toColumnAccessor(), other)
126+
127+
public companion object {
128+
public fun <A, B> defaultJoinColumns(left: DataFrame<A>, right: DataFrame<B>): JoinColumnsSelector<A, B> =
129+
{
130+
left.columnNames().intersect(right.columnNames().toSet())
131+
.map { it.toColumnAccessor() }
132+
.let { ColumnListImpl(it) }
133+
}
134+
135+
public fun <A, B> getColumns(
136+
left: DataFrame<A>,
137+
other: DataFrame<B>,
138+
selector: JoinColumnsSelector<A, B>,
139+
): List<ColumnMatch<Any?>> {
140+
val receiver = object : DataFrameReceiver<A>(left, UnresolvedColumnsPolicy.Fail), JoinDsl<A, B> {
141+
override val right: DataFrame<B> = DataFrameReceiver(other, UnresolvedColumnsPolicy.Fail)
142+
}
143+
val columns = selector(receiver, left)
144+
return columns.extractJoinColumns()
145+
}
146+
}
110147
}
111148

112-
public class ColumnMatch<C>(public val left: ColumnReference<C>, public val right: ColumnReference<C>) : ColumnSet<C> {
149+
public interface ColumnMatch<C> : ColumnSet<C> {
150+
public val left: ColumnReference<C>
151+
public val right: ColumnReference<C>
152+
}
153+
154+
internal class ColumnMatchImpl<C>(override val left: ColumnReference<C>, override val right: ColumnReference<C>) :
155+
ColumnMatch<C> {
113156

114157
override fun resolve(context: ColumnResolutionContext): List<ColumnWithPath<C>> =
115158
throw UnsupportedOperationException()
116159
}
117160

161+
public fun <C> ColumnMatch(left: ColumnReference<C>, right: ColumnReference<C>): ColumnMatch<C> =
162+
ColumnMatchImpl(left, right)
163+
118164
public typealias JoinColumnsSelector<A, B> = JoinDsl<A, B>.(ColumnsContainer<A>) -> ColumnsResolver<*>
119165

120166
public enum class JoinType {

core/src/main/kotlin/org/jetbrains/kotlinx/dataframe/api/joinWith.kt

+16
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,8 @@ package org.jetbrains.kotlinx.dataframe.api
33
import org.jetbrains.kotlinx.dataframe.DataFrame
44
import org.jetbrains.kotlinx.dataframe.DataRow
55
import org.jetbrains.kotlinx.dataframe.Selector
6+
import org.jetbrains.kotlinx.dataframe.annotations.Interpretable
7+
import org.jetbrains.kotlinx.dataframe.annotations.Refine
68
import org.jetbrains.kotlinx.dataframe.impl.api.joinWithImpl
79

810
public interface JoinedDataRow<out A, out B> : DataRow<A> {
@@ -11,27 +13,41 @@ public interface JoinedDataRow<out A, out B> : DataRow<A> {
1113

1214
public typealias JoinExpression<A, B> = Selector<JoinedDataRow<A, B>, Boolean>
1315

16+
@Refine
17+
@Interpretable("JoinWith")
1418
public fun <A, B> DataFrame<A>.joinWith(
1519
right: DataFrame<B>,
1620
type: JoinType = JoinType.Inner,
1721
joinExpression: JoinExpression<A, B>,
1822
): DataFrame<A> = joinWithImpl(right, type, addNewColumns = type.addNewColumns, joinExpression)
1923

24+
@Refine
25+
@Interpretable("InnerJoinWith")
2026
public fun <A, B> DataFrame<A>.innerJoinWith(right: DataFrame<B>, joinExpression: JoinExpression<A, B>): DataFrame<A> =
2127
joinWith(right, JoinType.Inner, joinExpression)
2228

29+
@Refine
30+
@Interpretable("LeftJoinWith")
2331
public fun <A, B> DataFrame<A>.leftJoinWith(right: DataFrame<B>, joinExpression: JoinExpression<A, B>): DataFrame<A> =
2432
joinWith(right, JoinType.Left, joinExpression)
2533

34+
@Refine
35+
@Interpretable("RightJoinWith")
2636
public fun <A, B> DataFrame<A>.rightJoinWith(right: DataFrame<B>, joinExpression: JoinExpression<A, B>): DataFrame<A> =
2737
joinWith(right, JoinType.Right, joinExpression)
2838

39+
@Refine
40+
@Interpretable("FullJoinWith")
2941
public fun <A, B> DataFrame<A>.fullJoinWith(right: DataFrame<B>, joinExpression: JoinExpression<A, B>): DataFrame<A> =
3042
joinWith(right, JoinType.Full, joinExpression)
3143

44+
@Refine
45+
@Interpretable("FilterJoinWith")
3246
public fun <A, B> DataFrame<A>.filterJoinWith(right: DataFrame<B>, joinExpression: JoinExpression<A, B>): DataFrame<A> =
3347
joinWithImpl(right, JoinType.Inner, addNewColumns = false, joinExpression)
3448

49+
@Refine
50+
@Interpretable("ExcludeJoinWith")
3551
public fun <A, B> DataFrame<A>.excludeJoinWith(
3652
right: DataFrame<B>,
3753
joinExpression: JoinExpression<A, B>,

core/src/main/kotlin/org/jetbrains/kotlinx/dataframe/api/none.kt

+2-2
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@ import org.jetbrains.kotlinx.dataframe.DataFrame
44
import org.jetbrains.kotlinx.dataframe.columns.ColumnSet
55
import org.jetbrains.kotlinx.dataframe.columns.ColumnsResolver
66
import org.jetbrains.kotlinx.dataframe.documentation.DslGrammarTemplateColumnsSelectionDsl.DslGrammarTemplate
7-
import org.jetbrains.kotlinx.dataframe.impl.columns.ColumnsList
7+
import org.jetbrains.kotlinx.dataframe.impl.columns.ColumnListImpl
88

99
// region ColumnsSelectionDsl
1010

@@ -48,7 +48,7 @@ public interface NoneColumnsSelectionDsl {
4848
*
4949
* @return An empty [ColumnsResolver].
5050
*/
51-
public fun none(): ColumnsResolver<*> = ColumnsList<Any?>(emptyList())
51+
public fun none(): ColumnsResolver<*> = ColumnListImpl<Any?>(emptyList())
5252
}
5353

5454
// endregion

core/src/main/kotlin/org/jetbrains/kotlinx/dataframe/columns/constructors.kt

+6-6
Original file line numberDiff line numberDiff line change
@@ -2,14 +2,14 @@ package org.jetbrains.kotlinx.dataframe.columns
22

33
import org.jetbrains.kotlinx.dataframe.api.toColumnAccessor
44
import org.jetbrains.kotlinx.dataframe.impl.asList
5-
import org.jetbrains.kotlinx.dataframe.impl.columns.ColumnsList
5+
import org.jetbrains.kotlinx.dataframe.impl.columns.ColumnListImpl
66
import kotlin.reflect.KProperty
77

88
// region toColumnSet
99

1010
// region Array
1111

12-
public fun Array<out ColumnsResolver<*>>.toColumnSet(): ColumnSet<Any?> = ColumnsList(asList())
12+
public fun Array<out ColumnsResolver<*>>.toColumnSet(): ColumnSet<Any?> = ColumnListImpl(asList())
1313

1414
@JvmName("toColumnSetString")
1515
public fun Array<out String>.toColumnSet(): ColumnSet<Any?> = map { it.toColumnAccessor() }.toColumnSet()
@@ -20,15 +20,15 @@ public fun Array<out ColumnPath>.toColumnSet(): ColumnSet<Any?> = map { it.toCol
2020
public fun <C> Array<out KProperty<C>>.toColumnSet(): ColumnSet<C> = map { it.toColumnAccessor() }.toColumnSet()
2121

2222
@JvmName("toColumnSetC")
23-
public fun <C> Array<out ColumnsResolver<C>>.toColumnSet(): ColumnSet<C> = ColumnsList(asList())
23+
public fun <C> Array<out ColumnsResolver<C>>.toColumnSet(): ColumnSet<C> = ColumnListImpl(asList())
2424

2525
public fun <C> Array<out ColumnReference<C>>.toColumnSet(): ColumnSet<C> = asIterable().toColumnSet()
2626

2727
// endregion
2828

2929
// region Iterable
3030

31-
public fun Iterable<ColumnsResolver<*>>.toColumnSet(): ColumnSet<Any?> = ColumnsList(asList())
31+
public fun Iterable<ColumnsResolver<*>>.toColumnSet(): ColumnSet<Any?> = ColumnListImpl(asList())
3232

3333
@JvmName("toColumnSetString")
3434
public fun Iterable<String>.toColumnSet(): ColumnSet<Any?> = map { it.toColumnAccessor() }.toColumnSet()
@@ -40,10 +40,10 @@ public fun Iterable<ColumnPath>.toColumnSet(): ColumnSet<Any?> = map { it.toColu
4040
public fun <C> Iterable<KProperty<C>>.toColumnSet(): ColumnSet<C> = map { it.toColumnAccessor() }.toColumnSet()
4141

4242
@JvmName("toColumnSetC")
43-
public fun <C> Iterable<ColumnsResolver<C>>.toColumnSet(): ColumnSet<C> = ColumnsList(toList())
43+
public fun <C> Iterable<ColumnsResolver<C>>.toColumnSet(): ColumnSet<C> = ColumnListImpl(toList())
4444

4545
@JvmName("toColumnSetColumnReference")
46-
public fun <C> Iterable<ColumnReference<C>>.toColumnSet(): ColumnSet<C> = ColumnsList(toList())
46+
public fun <C> Iterable<ColumnReference<C>>.toColumnSet(): ColumnSet<C> = ColumnListImpl(toList())
4747

4848
// endregion
4949

core/src/main/kotlin/org/jetbrains/kotlinx/dataframe/impl/api/join.kt

+3-22
Original file line numberDiff line numberDiff line change
@@ -18,31 +18,23 @@ import org.jetbrains.kotlinx.dataframe.columns.ColumnKind
1818
import org.jetbrains.kotlinx.dataframe.columns.ColumnReference
1919
import org.jetbrains.kotlinx.dataframe.columns.ColumnWithPath
2020
import org.jetbrains.kotlinx.dataframe.columns.ColumnsResolver
21-
import org.jetbrains.kotlinx.dataframe.columns.UnresolvedColumnsPolicy
2221
import org.jetbrains.kotlinx.dataframe.columns.toColumnSet
23-
import org.jetbrains.kotlinx.dataframe.impl.DataFrameReceiver
22+
import org.jetbrains.kotlinx.dataframe.impl.columns.ColumnListImpl
2423
import org.jetbrains.kotlinx.dataframe.impl.columns.ColumnsList
2524
import org.jetbrains.kotlinx.dataframe.indices
2625
import org.jetbrains.kotlinx.dataframe.kind
2726
import org.jetbrains.kotlinx.dataframe.nrow
2827
import org.jetbrains.kotlinx.dataframe.type
2928
import kotlin.reflect.full.withNullability
3029

31-
internal fun <A, B> defaultJoinColumns(left: DataFrame<A>, right: DataFrame<B>): JoinColumnsSelector<A, B> =
32-
{
33-
left.columnNames().intersect(right.columnNames().toSet())
34-
.map { it.toColumnAccessor() }
35-
.let { ColumnsList(it) }
36-
}
37-
3830
internal fun <T> defaultJoinColumns(dataFrames: Iterable<DataFrame<T>>): JoinColumnsSelector<T, T> =
3931
{
4032
dataFrames.map { it.columnNames() }
4133
.fold<List<String>, Set<String>?>(null) { set, names ->
4234
set?.intersect(names.toSet()) ?: names.toSet()
4335
}.orEmpty()
4436
.map { it.toColumnAccessor() }
45-
.let { ColumnsList(it) }
37+
.let { ColumnListImpl(it) }
4638
}
4739

4840
internal fun <C> ColumnsResolver<C>.extractJoinColumns(): List<ColumnMatch<C>> =
@@ -53,24 +45,13 @@ internal fun <C> ColumnsResolver<C>.extractJoinColumns(): List<ColumnMatch<C>> =
5345
else -> throw Exception()
5446
}
5547

56-
internal fun <A, B> DataFrame<A>.getColumns(
57-
other: DataFrame<B>,
58-
selector: JoinColumnsSelector<A, B>,
59-
): List<ColumnMatch<Any?>> {
60-
val receiver = object : DataFrameReceiver<A>(this, UnresolvedColumnsPolicy.Fail), JoinDsl<A, B> {
61-
override val right: DataFrame<B> = DataFrameReceiver(other, UnresolvedColumnsPolicy.Fail)
62-
}
63-
val columns = selector(receiver, this)
64-
return columns.extractJoinColumns()
65-
}
66-
6748
internal fun <A, B> DataFrame<A>.joinImpl(
6849
other: DataFrame<B>,
6950
joinType: JoinType = JoinType.Inner,
7051
addNewColumns: Boolean = true,
7152
selector: JoinColumnsSelector<A, B>?,
7253
): DataFrame<A> {
73-
val joinColumns = getColumns(other, selector ?: defaultJoinColumns(this, other))
54+
val joinColumns = JoinDsl.getColumns(this, other, selector ?: JoinDsl.defaultJoinColumns<A, B>(this, other))
7455

7556
val leftJoinColumns = getColumnsWithPaths { joinColumns.map { it.left }.toColumnSet() }
7657
val rightJoinColumns = other.getColumnsWithPaths { joinColumns.map { it.right }.toColumnSet() }

core/src/main/kotlin/org/jetbrains/kotlinx/dataframe/impl/columns/ColumnsList.kt

+7-1
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,13 @@ import org.jetbrains.kotlinx.dataframe.columns.ColumnResolutionContext
44
import org.jetbrains.kotlinx.dataframe.columns.ColumnSet
55
import org.jetbrains.kotlinx.dataframe.columns.ColumnsResolver
66

7-
internal class ColumnsList<C>(val columns: List<ColumnsResolver<C>>) : ColumnSet<C> {
7+
public interface ColumnsList<C> : ColumnSet<C> {
8+
public val columns: List<ColumnsResolver<C>>
9+
}
10+
11+
internal class ColumnListImpl<C>(override val columns: List<ColumnsResolver<C>>) :
12+
ColumnSet<C>,
13+
ColumnsList<C> {
814
constructor(vararg columns: ColumnsResolver<C>) : this(columns.toList())
915

1016
override fun resolve(context: ColumnResolutionContext) = columns.flatMap { it.resolve(context) }

0 commit comments

Comments
 (0)