Skip to content

Commit a0a3f44

Browse files
committed
Provide filter overload to replace colGroups(predicate<ColumnGroup>)
I prefer composition to inheritance here because changing ColumnWithPath hierarchy seems difficult, a lot of code assumes only one possible implementation. So for the sake of only one `filter` implementation, let's introduce a simple new class
1 parent d5dd6b9 commit a0a3f44

File tree

4 files changed

+50
-0
lines changed

4 files changed

+50
-0
lines changed

core/api/core.api

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2128,6 +2128,7 @@ public abstract interface class org/jetbrains/kotlinx/dataframe/api/ExprColumnsS
21282128

21292129
public abstract interface class org/jetbrains/kotlinx/dataframe/api/FilterColumnsSelectionDsl {
21302130
public fun filter (Lorg/jetbrains/kotlinx/dataframe/columns/ColumnSet;Lkotlin/jvm/functions/Function1;)Lorg/jetbrains/kotlinx/dataframe/columns/ColumnSet;
2131+
public fun filterColumnGroups (Lorg/jetbrains/kotlinx/dataframe/columns/ColumnSet;Lkotlin/jvm/functions/Function1;)Lorg/jetbrains/kotlinx/dataframe/columns/ColumnSet;
21312132
}
21322133

21332134
public abstract interface class org/jetbrains/kotlinx/dataframe/api/FilterColumnsSelectionDsl$Grammar {
@@ -5058,6 +5059,16 @@ public abstract interface class org/jetbrains/kotlinx/dataframe/columns/ColumnGr
50585059
public abstract fun rename (Ljava/lang/String;)Lorg/jetbrains/kotlinx/dataframe/columns/ColumnGroup;
50595060
}
50605061

5062+
public final class org/jetbrains/kotlinx/dataframe/columns/ColumnGroupWithPath {
5063+
public fun <init> (Lorg/jetbrains/kotlinx/dataframe/columns/ColumnGroup;Lorg/jetbrains/kotlinx/dataframe/columns/ColumnPath;)V
5064+
public final fun depth ()I
5065+
public final fun getData ()Lorg/jetbrains/kotlinx/dataframe/columns/ColumnGroup;
5066+
public final fun getDepth ()I
5067+
public final fun getName ()Ljava/lang/String;
5068+
public final fun getParentName ()Ljava/lang/String;
5069+
public final fun getPath ()Lorg/jetbrains/kotlinx/dataframe/columns/ColumnPath;
5070+
}
5071+
50615072
public class org/jetbrains/kotlinx/dataframe/columns/ColumnKind : java/lang/Enum {
50625073
public static final field Frame Lorg/jetbrains/kotlinx/dataframe/columns/ColumnKind;
50635074
public static final field Group Lorg/jetbrains/kotlinx/dataframe/columns/ColumnKind;

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

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

3+
import org.jetbrains.kotlinx.dataframe.AnyRow
34
import org.jetbrains.kotlinx.dataframe.ColumnFilter
45
import org.jetbrains.kotlinx.dataframe.ColumnSelector
56
import org.jetbrains.kotlinx.dataframe.ColumnsSelector
@@ -8,6 +9,7 @@ import org.jetbrains.kotlinx.dataframe.DataFrame
89
import org.jetbrains.kotlinx.dataframe.Predicate
910
import org.jetbrains.kotlinx.dataframe.RowFilter
1011
import org.jetbrains.kotlinx.dataframe.annotations.AccessApiOverload
12+
import org.jetbrains.kotlinx.dataframe.columns.ColumnGroupWithPath
1113
import org.jetbrains.kotlinx.dataframe.columns.ColumnPath
1214
import org.jetbrains.kotlinx.dataframe.columns.ColumnReference
1315
import org.jetbrains.kotlinx.dataframe.columns.ColumnSet
@@ -159,6 +161,25 @@ public interface FilterColumnsSelectionDsl {
159161
@Suppress("UNCHECKED_CAST")
160162
public fun <C> ColumnSet<C>.filter(predicate: ColumnFilter<C>): ColumnSet<C> =
161163
colsInternal(predicate as ColumnFilter<*>).cast()
164+
165+
/**
166+
* ## Filter [ColumnSet]
167+
*
168+
* #### For example:
169+
* ```kotlin
170+
* df.convert {
171+
* colsAtAnyDepth().colGroups()
172+
* .filter { it.data.containsColumn("myCol")
173+
* }.with { ... }
174+
* ```
175+
*/
176+
@Suppress("INAPPLICABLE_JVM_NAME")
177+
@JvmName("filterColumnGroups")
178+
public fun ColumnSet<AnyRow>.filter(predicate: Predicate<ColumnGroupWithPath<*>>): ColumnSet<*> =
179+
colsInternal { columnWithPath ->
180+
columnWithPath.isColumnGroup() &&
181+
predicate(ColumnGroupWithPath(columnWithPath, columnWithPath.path))
182+
}
162183
}
163184

164185
// endregion

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

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -63,3 +63,13 @@ public interface ColumnWithPath<out T> : DataColumn<T> {
6363
public val <T> ColumnWithPath<T>.depth: Int get() = path.depth()
6464

6565
public fun ColumnWithPath(column: DataColumn<*>, path: ColumnPath): ColumnWithPath<*> = column.addPath(path)
66+
67+
public class ColumnGroupWithPath<T>(public val data: ColumnGroup<T>, public val path: ColumnPath) {
68+
public val name: String get() = data.name()
69+
70+
public val parentName: String? get() = path.parentName
71+
72+
public fun depth(): Int = path.depth()
73+
74+
public val depth: Int get() = path.depth()
75+
}

core/src/test/kotlin/org/jetbrains/kotlinx/dataframe/api/filter.kt

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,4 +19,12 @@ class FilterTests : ColumnsSelectionDslTests() {
1919
df.select { all().filter { true } } shouldBe df.select { all() }
2020
df.select { all().filter { false } } shouldBe df.select { none() }
2121
}
22+
23+
@Test
24+
fun `filter column group`() {
25+
listOf(
26+
df.select { name },
27+
df.select { colsAtAnyDepth().colGroups().filter { it.data.containsColumn("firstName") } },
28+
)
29+
}
2230
}

0 commit comments

Comments
 (0)