@@ -14,7 +14,6 @@ import org.jetbrains.kotlinx.dataframe.Predicate
1414import org.jetbrains.kotlinx.dataframe.columns.*
1515import org.jetbrains.kotlinx.dataframe.documentation.AccessApi
1616import org.jetbrains.kotlinx.dataframe.hasNulls
17- import org.jetbrains.kotlinx.dataframe.impl.aggregation.toColumns
1817import org.jetbrains.kotlinx.dataframe.impl.columnName
1918import org.jetbrains.kotlinx.dataframe.impl.columns.*
2019import org.jetbrains.kotlinx.dataframe.impl.columns.tree.dfs
@@ -43,6 +42,18 @@ public interface ColumnSelectionDsl<out T> : ColumnsContainer<T> {
4342
4443 public operator fun <C > ColumnPath.invoke (): DataColumn <C > = getColumn(this ).cast()
4544
45+ public operator fun <T > KProperty<T>.invoke (): DataColumn <T > = this @ColumnSelectionDsl[this ]
46+
47+ public operator fun <T > KProperty<DataRow<T>>.invoke (): ColumnGroup <T > = this @ColumnSelectionDsl[this ]
48+
49+ public operator fun <T > KProperty<DataFrame<T>>.invoke (): FrameColumn <T > = this @ColumnSelectionDsl[this ]
50+
51+ public operator fun <T , R > KProperty<DataRow<T>>.get (column : KProperty <R >): DataColumn <R > = invoke()[column]
52+
53+ public operator fun <T , R > KProperty<DataRow<T>>.get (column : KProperty <DataRow <R >>): ColumnGroup <R > = invoke()[column]
54+
55+ public operator fun <T , R > KProperty<DataRow<T>>.get (column : KProperty <DataFrame <R >>): FrameColumn <R > = invoke()[column]
56+
4657 public operator fun <C > String.invoke (): DataColumn <C > = getColumn(this ).cast()
4758
4859 public operator fun String.get (column : String ): ColumnPath = pathOf(this , column)
@@ -69,6 +80,8 @@ public interface ColumnsSelectionDsl<out T> : ColumnSelectionDsl<T>, SingleColum
6980 public operator fun String.rangeTo (endInclusive : String ): ColumnSet <* > =
7081 toColumnAccessor().rangeTo(endInclusive.toColumnAccessor())
7182
83+ public operator fun KProperty <* >.rangeTo (endInclusive : KProperty <* >): ColumnSet <* > = toColumnAccessor().rangeTo(endInclusive.toColumnAccessor())
84+
7285 public operator fun AnyColumnReference.rangeTo (endInclusive : AnyColumnReference ): ColumnSet <* > =
7386 object : ColumnSet <Any ?> {
7487 override fun resolve (context : ColumnResolutionContext ): List <ColumnWithPath <Any ?>> {
@@ -103,19 +116,19 @@ public interface ColumnsSelectionDsl<out T> : ColumnSelectionDsl<T>, SingleColum
103116 transform { it.flatMap { col -> names.mapNotNull { col.getChild(it) } } }
104117 }
105118
119+ public fun <C > ColumnSet <* >.cols (firstCol : KProperty <C >, vararg otherCols : KProperty <C >): ColumnSet <C > =
120+ (listOf (firstCol) + otherCols).let { names ->
121+ transform { it.flatMap { col -> names.mapNotNull { col.getChild(it) } } }
122+ }
123+
106124 public fun ColumnSet <* >.cols (vararg indices : Int ): ColumnSet <Any ?> =
107125 transform { it.flatMap { it.children().let { children -> indices.map { children[it] } } } }
108126
109127 public fun ColumnSet <* >.cols (range : IntRange ): ColumnSet <Any ?> =
110- transform { it.flatMap { it.children().subList(range.start , range.endInclusive + 1 ) } }
128+ transform { it.flatMap { it.children().subList(range.first , range.last + 1 ) } }
111129
112130 // region select
113131
114- public fun <C > ColumnSet<DataRow<C>>.select (vararg columns : String ): ColumnSet <* > = select { columns.toColumnSet() }
115-
116- public fun <C , R > ColumnSet<DataRow<C>>.select (vararg columns : KProperty <R >): ColumnSet <R > =
117- select { columns.toColumnSet() }
118-
119132 public fun <C , R > ColumnSet<DataRow<C>>.select (selector : ColumnsSelector <C , R >): ColumnSet <R > = createColumnSet {
120133 this @select.resolve(it).flatMap { group ->
121134 group.asColumnGroup().getColumnsWithPaths(selector).map {
@@ -124,6 +137,12 @@ public interface ColumnsSelectionDsl<out T> : ColumnSelectionDsl<T>, SingleColum
124137 }
125138 }
126139
140+ public fun <C > ColumnSet<DataRow<C>>.select (vararg columns : String ): ColumnSet <* > = select { columns.toColumnSet() }
141+
142+ public fun <C , R > ColumnSet<DataRow<C>>.select (vararg columns : ColumnReference <R >): ColumnSet <R > = select { columns.toColumnSet() }
143+
144+ public fun <C , R > ColumnSet<DataRow<C>>.select (vararg columns : KProperty <R >): ColumnSet <R > = select { columns.toColumnSet() }
145+
127146 // endregion
128147
129148 // endregion
@@ -134,6 +153,8 @@ public interface ColumnsSelectionDsl<out T> : ColumnSelectionDsl<T>, SingleColum
134153
135154 public fun String.dfs (predicate : (ColumnWithPath <* >) -> Boolean ): ColumnSet <* > = toColumnAccessor().dfs(predicate)
136155
156+ public fun <C > KProperty<C>.dfs (predicate : (ColumnWithPath <* >) -> Boolean ): ColumnSet <* > = toColumnAccessor().dfs(predicate)
157+
137158 // endregion
138159
139160 // region all
@@ -142,13 +163,17 @@ public interface ColumnsSelectionDsl<out T> : ColumnSelectionDsl<T>, SingleColum
142163
143164 public fun String.all (): ColumnSet <* > = toColumnAccessor().transformSingle { it.children() }
144165
166+ public fun KProperty <* >.all (): ColumnSet <* > = toColumnAccessor().transformSingle { it.children() }
167+
145168 // region allDfs
146169
147170 public fun ColumnSet <* >.allDfs (includeGroups : Boolean = false): ColumnSet <Any ?> =
148171 if (includeGroups) dfs { true } else dfs { ! it.isColumnGroup() }
149172
150173 public fun String.allDfs (includeGroups : Boolean = false): ColumnSet <Any ?> = toColumnAccessor().allDfs(includeGroups)
151174
175+ public fun KProperty <* >.allDfs (includeGroups : Boolean = false): ColumnSet <Any ?> = toColumnAccessor().allDfs(includeGroups)
176+
152177 // endregion
153178
154179 // region allAfter
@@ -167,13 +192,24 @@ public interface ColumnsSelectionDsl<out T> : ColumnSelectionDsl<T>, SingleColum
167192
168193 public fun SingleColumn <* >.allAfter (colName : String ): ColumnSet <Any ?> = allAfter(pathOf(colName))
169194 public fun SingleColumn <* >.allAfter (column : AnyColumnReference ): ColumnSet <Any ?> = allAfter(column.path())
195+ public fun SingleColumn <* >.allAfter (column : KProperty <* >): ColumnSet <Any ?> = allAfter(column.toColumnAccessor().path())
196+
197+ public fun String.allAfter (colPath : ColumnPath ): ColumnSet <Any ?> = toColumnAccessor().allAfter(colPath)
198+ public fun String.allAfter (colName : String ): ColumnSet <Any ?> = toColumnAccessor().allAfter(colName)
199+ public fun String.allAfter (column : AnyColumnReference ): ColumnSet <Any ?> = toColumnAccessor().allAfter(column)
200+ public fun String.allAfter (column : KProperty <* >): ColumnSet <Any ?> = toColumnAccessor().allAfter(column)
201+
202+ public fun KProperty <* >.allAfter (colPath : ColumnPath ): ColumnSet <Any ?> = toColumnAccessor().allAfter(colPath)
203+ public fun KProperty <* >.allAfter (colName : String ): ColumnSet <Any ?> = toColumnAccessor().allAfter(colName)
204+ public fun KProperty <* >.allAfter (column : AnyColumnReference ): ColumnSet <Any ?> = toColumnAccessor().allAfter(column)
205+ public fun KProperty <* >.allAfter (column : KProperty <* >): ColumnSet <Any ?> = toColumnAccessor().allAfter(column)
170206
171207 // endregion
172208
173- // region allSince
209+ // region allFrom
174210
175211 // including current
176- public fun SingleColumn <* >.allSince (colPath : ColumnPath ): ColumnSet <Any ?> {
212+ public fun SingleColumn <* >.allFrom (colPath : ColumnPath ): ColumnSet <Any ?> {
177213 var take = false
178214 return children {
179215 if (take) true
@@ -184,8 +220,19 @@ public interface ColumnsSelectionDsl<out T> : ColumnSelectionDsl<T>, SingleColum
184220 }
185221 }
186222
187- public fun SingleColumn <* >.allSince (colName : String ): ColumnSet <Any ?> = allSince(pathOf(colName))
188- public fun SingleColumn <* >.allSince (column : AnyColumnReference ): ColumnSet <Any ?> = allSince(column.path())
223+ public fun SingleColumn <* >.allFrom (colName : String ): ColumnSet <Any ?> = allFrom(pathOf(colName))
224+ public fun SingleColumn <* >.allFrom (column : AnyColumnReference ): ColumnSet <Any ?> = allFrom(column.path())
225+ public fun SingleColumn <* >.allFrom (column : KProperty <* >): ColumnSet <Any ?> = allFrom(column.toColumnAccessor().path())
226+
227+ public fun String.allFrom (colPath : ColumnPath ): ColumnSet <Any ?> = toColumnAccessor().allFrom(colPath)
228+ public fun String.allFrom (colName : String ): ColumnSet <Any ?> = toColumnAccessor().allFrom(colName)
229+ public fun String.allFrom (column : AnyColumnReference ): ColumnSet <Any ?> = toColumnAccessor().allFrom(column)
230+ public fun String.allFrom (column : KProperty <* >): ColumnSet <Any ?> = toColumnAccessor().allFrom(column)
231+
232+ public fun KProperty <* >.allFrom (colPath : ColumnPath ): ColumnSet <Any ?> = toColumnAccessor().allFrom(colPath)
233+ public fun KProperty <* >.allFrom (colName : String ): ColumnSet <Any ?> = toColumnAccessor().allFrom(colName)
234+ public fun KProperty <* >.allFrom (column : AnyColumnReference ): ColumnSet <Any ?> = toColumnAccessor().allFrom(column)
235+ public fun KProperty <* >.allFrom (column : KProperty <* >): ColumnSet <Any ?> = toColumnAccessor().allFrom(column)
189236
190237 // endregion
191238
@@ -205,13 +252,24 @@ public interface ColumnsSelectionDsl<out T> : ColumnSelectionDsl<T>, SingleColum
205252
206253 public fun SingleColumn <* >.allBefore (colName : String ): ColumnSet <Any ?> = allBefore(pathOf(colName))
207254 public fun SingleColumn <* >.allBefore (column : AnyColumnReference ): ColumnSet <Any ?> = allBefore(column.path())
255+ public fun SingleColumn <* >.allBefore (column : KProperty <* >): ColumnSet <Any ?> = allBefore(column.toColumnAccessor().path())
256+
257+ public fun String.allBefore (colPath : ColumnPath ): ColumnSet <Any ?> = toColumnAccessor().allBefore(colPath)
258+ public fun String.allBefore (colName : String ): ColumnSet <Any ?> = toColumnAccessor().allBefore(colName)
259+ public fun String.allBefore (column : AnyColumnReference ): ColumnSet <Any ?> = toColumnAccessor().allBefore(column)
260+ public fun String.allBefore (column : KProperty <* >): ColumnSet <Any ?> = toColumnAccessor().allBefore(column)
261+
262+ public fun KProperty <* >.allBefore (colPath : ColumnPath ): ColumnSet <Any ?> = toColumnAccessor().allBefore(colPath)
263+ public fun KProperty <* >.allBefore (colName : String ): ColumnSet <Any ?> = toColumnAccessor().allBefore(colName)
264+ public fun KProperty <* >.allBefore (column : AnyColumnReference ): ColumnSet <Any ?> = toColumnAccessor().allBefore(column)
265+ public fun KProperty <* >.allBefore (column : KProperty <* >): ColumnSet <Any ?> = toColumnAccessor().allBefore(column)
208266
209267 // endregion
210268
211- // region allUntil
269+ // region allUpTo
212270
213271 // including current
214- public fun SingleColumn <* >.allUntil (colPath : ColumnPath ): ColumnSet <Any ?> {
272+ public fun SingleColumn <* >.allUpTo (colPath : ColumnPath ): ColumnSet <Any ?> {
215273 var take = true
216274 return children {
217275 if (! take) false
@@ -222,21 +280,46 @@ public interface ColumnsSelectionDsl<out T> : ColumnSelectionDsl<T>, SingleColum
222280 }
223281 }
224282
225- public fun SingleColumn <* >.allUntil (colName : String ): ColumnSet <Any ?> = allUntil(pathOf(colName))
226- public fun SingleColumn <* >.allUntil (column : AnyColumnReference ): ColumnSet <Any ?> = allUntil(column.path())
283+ public fun SingleColumn <* >.allUpTo (colName : String ): ColumnSet <Any ?> = allUpTo(pathOf(colName))
284+ public fun SingleColumn <* >.allUpTo (column : AnyColumnReference ): ColumnSet <Any ?> = allUpTo(column.path())
285+ public fun SingleColumn <* >.allUpTo (column : KProperty <* >): ColumnSet <Any ?> = allUpTo(column.toColumnAccessor().path())
286+
287+ public fun String.allUpTo (colPath : ColumnPath ): ColumnSet <Any ?> = toColumnAccessor().allUpTo(colPath)
288+ public fun String.allUpTo (colName : String ): ColumnSet <Any ?> = toColumnAccessor().allUpTo(colName)
289+ public fun String.allUpTo (column : AnyColumnReference ): ColumnSet <Any ?> = toColumnAccessor().allUpTo(column)
290+ public fun String.allUpTo (column : KProperty <* >): ColumnSet <Any ?> = toColumnAccessor().allUpTo(column)
291+
292+ public fun KProperty <* >.allUpTo (colPath : ColumnPath ): ColumnSet <Any ?> = toColumnAccessor().allUpTo(colPath)
293+ public fun KProperty <* >.allUpTo (colName : String ): ColumnSet <Any ?> = toColumnAccessor().allUpTo(colName)
294+ public fun KProperty <* >.allUpTo (column : AnyColumnReference ): ColumnSet <Any ?> = toColumnAccessor().allUpTo(column)
295+ public fun KProperty <* >.allUpTo (column : KProperty <* >): ColumnSet <Any ?> = toColumnAccessor().allUpTo(column)
227296
228297 // endregion
229298
230299 // endregion
231300
301+ // region groups
302+
232303 public fun SingleColumn <* >.groups (filter : (ColumnGroup <* >) -> Boolean = { true }): ColumnSet <AnyRow > =
233304 children { it.isColumnGroup() && filter(it.asColumnGroup()) } as ColumnSet <AnyRow >
234305
235- public fun <C > ColumnSet<C>.children (predicate : (ColumnWithPath <Any ?>) -> Boolean = { true }): ColumnSet <Any ?> =
306+ public fun String.groups (filter : (ColumnGroup <* >) -> Boolean = { true }): ColumnSet <AnyRow > =
307+ toColumnAccessor().groups(filter)
308+
309+ public fun KProperty <* >.groups (filter : (ColumnGroup <* >) -> Boolean = { true }): ColumnSet <AnyRow > =
310+ toColumnAccessor().groups(filter)
311+
312+ // endregion
313+
314+ // region children
315+
316+ public fun ColumnSet <* >.children (predicate : (ColumnWithPath <Any ?>) -> Boolean = { true }): ColumnSet <Any ?> =
236317 transform { it.flatMap { it.children().filter { predicate(it) } } }
237318
238319 public fun ColumnGroupReference.children (): ColumnSet <Any ?> = transformSingle { it.children() }
239320
321+ // endregion
322+
240323 public operator fun <C > List<DataColumn<C>>.get (range : IntRange ): ColumnSet <C > =
241324 ColumnsList (subList(range.first, range.last + 1 ))
242325
@@ -246,6 +329,7 @@ public interface ColumnsSelectionDsl<out T> : ColumnSelectionDsl<T>, SingleColum
246329 transform { it.mapNotNull { it.getChild(colName) } }
247330
248331 public operator fun <C > ColumnSet <* >.get (column : ColumnReference <C >): ColumnSet <C > = cols(column)
332+ public operator fun <C > ColumnSet <* >.get (column : KProperty <C >): ColumnSet <C > = cols(column)
249333
250334 public fun SingleColumn<AnyRow>.take (n : Int ): ColumnSet <* > = transformSingle { it.children().take(n) }
251335 public fun SingleColumn<AnyRow>.takeLast (n : Int ): ColumnSet <* > = transformSingle { it.children().takeLast(n) }
@@ -271,7 +355,7 @@ public interface ColumnsSelectionDsl<out T> : ColumnSelectionDsl<T>, SingleColum
271355 public fun ColumnSet <* >.startsWith (prefix : CharSequence ): ColumnSet <Any ?> = cols { it.name.startsWith(prefix) }
272356 public fun ColumnSet <* >.endsWith (suffix : CharSequence ): ColumnSet <Any ?> = cols { it.name.endsWith(suffix) }
273357
274- public fun <C > ColumnSet<C>.except (vararg other : ColumnSet <* >): ColumnSet <* > = except(other.toColumns ())
358+ public fun <C > ColumnSet<C>.except (vararg other : ColumnSet <* >): ColumnSet <* > = except(other.toColumnSet ())
275359 public fun <C > ColumnSet<C>.except (vararg other : String ): ColumnSet <* > = except(other.toColumnSet())
276360
277361 public fun <C > ColumnSet<C?>.withoutNulls (): ColumnSet <C > = transform { it.filter { ! it.hasNulls } } as ColumnSet <C >
@@ -280,7 +364,7 @@ public interface ColumnsSelectionDsl<out T> : ColumnSelectionDsl<T>, SingleColum
280364 createColumnSet { resolve(it).allColumnsExcept(other.resolve(it)) }
281365
282366 public infix fun <C > ColumnSet<C>.except (selector : ColumnsSelector <T , * >): ColumnSet <C > =
283- except(selector.toColumns ()) as ColumnSet <C >
367+ except(selector.toColumnSet ()) as ColumnSet <C >
284368
285369 public operator fun <C > ColumnsSelector <T , C >.invoke (): ColumnSet <C > =
286370 this (this @ColumnsSelectionDsl, this @ColumnsSelectionDsl)
@@ -297,9 +381,18 @@ public interface ColumnsSelectionDsl<out T> : ColumnSelectionDsl<T>, SingleColum
297381 toColumnAccessor().into(column.columnName)
298382
299383 public infix fun <C > ColumnReference<C>.named (newName : String ): ColumnReference <C > = renamedReference(newName)
300- public infix fun <C > ColumnReference<C>.named (name : KProperty <* >): ColumnReference <C > = named(name.columnName)
384+ public infix fun <C > ColumnReference<C>.named (nameFrom : ColumnReference <* >): ColumnReference <C > = named(nameFrom.name)
385+ public infix fun <C > ColumnReference<C>.named (nameFrom : KProperty <* >): ColumnReference <C > = named(nameFrom.columnName)
301386
302387 public infix fun String.named (newName : String ): ColumnReference <Any ?> = toColumnAccessor().named(newName)
388+ public infix fun String.named (nameFrom : ColumnReference <* >): ColumnReference <Any ?> = toColumnAccessor().named(nameFrom.name)
389+ public infix fun String.named (nameFrom : KProperty <* >): ColumnReference <Any ?> = toColumnAccessor().named(nameFrom.columnName)
390+
391+ public infix fun <C > KProperty<C>.named (newName : String ): ColumnReference <C > = toColumnAccessor().named(newName)
392+
393+ public infix fun <C > KProperty<C>.named (nameFrom : ColumnReference <* >): ColumnReference <C > = toColumnAccessor().named(nameFrom.name)
394+
395+ public infix fun <C > KProperty<C>.named (nameFrom : KProperty <* >): ColumnReference <C > = toColumnAccessor().named(nameFrom.columnName)
303396
304397 // region and
305398
@@ -340,6 +433,21 @@ public interface ColumnsSelectionDsl<out T> : ColumnSelectionDsl<T>, SingleColum
340433 // endregion
341434
342435 public fun <C > ColumnSet<C>.distinct (): ColumnSet <C > = DistinctColumnSet (this )
436+
437+ public fun <C > String.dfsOf (type : KType , predicate : (ColumnWithPath <C >) -> Boolean = { true }): ColumnSet <* > =
438+ toColumnAccessor().dfsOf(type, predicate)
439+
440+ public fun <C > KProperty <* >.dfsOf (type : KType , predicate : (ColumnWithPath <C >) -> Boolean = { true }): ColumnSet <* > =
441+ toColumnAccessor().dfsOf(type, predicate)
442+
443+ public fun String.colsOf (type : KType ): ColumnSet <Any ?> = toColumnAccessor().colsOf(type)
444+ public fun KProperty <* >.colsOf (type : KType ): ColumnSet <Any ?> = toColumnAccessor().colsOf(type)
445+
446+ public fun <C > String.colsOf (type : KType , filter : (DataColumn <C >) -> Boolean ): ColumnSet <Any ?> =
447+ toColumnAccessor().colsOf(type, filter)
448+
449+ public fun <C > KProperty <* >.colsOf (type : KType , filter : (DataColumn <C >) -> Boolean ): ColumnSet <Any ?> =
450+ toColumnAccessor().colsOf(type, filter)
343451}
344452
345453public inline fun <T , reified R > ColumnsSelectionDsl<T>.expr (
@@ -350,7 +458,6 @@ public inline fun <T, reified R> ColumnsSelectionDsl<T>.expr(
350458
351459internal fun <T , C > ColumnsSelector <T , C >.filter (predicate : (ColumnWithPath <C >) -> Boolean ): ColumnsSelector <T , C > =
352460 { this @filter(it, it).filter(predicate) }
353- // internal fun Columns<*>.filter(predicate: (AnyCol) -> Boolean) = transform { it.filter { predicate(it.data) } }
354461
355462internal fun ColumnSet <* >.colsInternal (predicate : (AnyCol ) -> Boolean ) =
356463 transform { it.flatMap { it.children().filter { predicate(it.data) } } }
0 commit comments