@@ -14,7 +14,6 @@ import org.jetbrains.kotlinx.dataframe.Predicate
14
14
import org.jetbrains.kotlinx.dataframe.columns.*
15
15
import org.jetbrains.kotlinx.dataframe.documentation.AccessApi
16
16
import org.jetbrains.kotlinx.dataframe.hasNulls
17
- import org.jetbrains.kotlinx.dataframe.impl.aggregation.toColumns
18
17
import org.jetbrains.kotlinx.dataframe.impl.columnName
19
18
import org.jetbrains.kotlinx.dataframe.impl.columns.*
20
19
import org.jetbrains.kotlinx.dataframe.impl.columns.tree.dfs
@@ -43,6 +42,18 @@ public interface ColumnSelectionDsl<out T> : ColumnsContainer<T> {
43
42
44
43
public operator fun <C > ColumnPath.invoke (): DataColumn <C > = getColumn(this ).cast()
45
44
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
+
46
57
public operator fun <C > String.invoke (): DataColumn <C > = getColumn(this ).cast()
47
58
48
59
public operator fun String.get (column : String ): ColumnPath = pathOf(this , column)
@@ -69,6 +80,8 @@ public interface ColumnsSelectionDsl<out T> : ColumnSelectionDsl<T>, SingleColum
69
80
public operator fun String.rangeTo (endInclusive : String ): ColumnSet <* > =
70
81
toColumnAccessor().rangeTo(endInclusive.toColumnAccessor())
71
82
83
+ public operator fun KProperty <* >.rangeTo (endInclusive : KProperty <* >): ColumnSet <* > = toColumnAccessor().rangeTo(endInclusive.toColumnAccessor())
84
+
72
85
public operator fun AnyColumnReference.rangeTo (endInclusive : AnyColumnReference ): ColumnSet <* > =
73
86
object : ColumnSet <Any ?> {
74
87
override fun resolve (context : ColumnResolutionContext ): List <ColumnWithPath <Any ?>> {
@@ -103,19 +116,19 @@ public interface ColumnsSelectionDsl<out T> : ColumnSelectionDsl<T>, SingleColum
103
116
transform { it.flatMap { col -> names.mapNotNull { col.getChild(it) } } }
104
117
}
105
118
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
+
106
124
public fun ColumnSet <* >.cols (vararg indices : Int ): ColumnSet <Any ?> =
107
125
transform { it.flatMap { it.children().let { children -> indices.map { children[it] } } } }
108
126
109
127
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 ) } }
111
129
112
130
// region select
113
131
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
-
119
132
public fun <C , R > ColumnSet<DataRow<C>>.select (selector : ColumnsSelector <C , R >): ColumnSet <R > = createColumnSet {
120
133
this @select.resolve(it).flatMap { group ->
121
134
group.asColumnGroup().getColumnsWithPaths(selector).map {
@@ -124,6 +137,12 @@ public interface ColumnsSelectionDsl<out T> : ColumnSelectionDsl<T>, SingleColum
124
137
}
125
138
}
126
139
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
+
127
146
// endregion
128
147
129
148
// endregion
@@ -134,6 +153,8 @@ public interface ColumnsSelectionDsl<out T> : ColumnSelectionDsl<T>, SingleColum
134
153
135
154
public fun String.dfs (predicate : (ColumnWithPath <* >) -> Boolean ): ColumnSet <* > = toColumnAccessor().dfs(predicate)
136
155
156
+ public fun <C > KProperty<C>.dfs (predicate : (ColumnWithPath <* >) -> Boolean ): ColumnSet <* > = toColumnAccessor().dfs(predicate)
157
+
137
158
// endregion
138
159
139
160
// region all
@@ -142,13 +163,17 @@ public interface ColumnsSelectionDsl<out T> : ColumnSelectionDsl<T>, SingleColum
142
163
143
164
public fun String.all (): ColumnSet <* > = toColumnAccessor().transformSingle { it.children() }
144
165
166
+ public fun KProperty <* >.all (): ColumnSet <* > = toColumnAccessor().transformSingle { it.children() }
167
+
145
168
// region allDfs
146
169
147
170
public fun ColumnSet <* >.allDfs (includeGroups : Boolean = false): ColumnSet <Any ?> =
148
171
if (includeGroups) dfs { true } else dfs { ! it.isColumnGroup() }
149
172
150
173
public fun String.allDfs (includeGroups : Boolean = false): ColumnSet <Any ?> = toColumnAccessor().allDfs(includeGroups)
151
174
175
+ public fun KProperty <* >.allDfs (includeGroups : Boolean = false): ColumnSet <Any ?> = toColumnAccessor().allDfs(includeGroups)
176
+
152
177
// endregion
153
178
154
179
// region allAfter
@@ -167,13 +192,24 @@ public interface ColumnsSelectionDsl<out T> : ColumnSelectionDsl<T>, SingleColum
167
192
168
193
public fun SingleColumn <* >.allAfter (colName : String ): ColumnSet <Any ?> = allAfter(pathOf(colName))
169
194
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)
170
206
171
207
// endregion
172
208
173
- // region allSince
209
+ // region allFrom
174
210
175
211
// including current
176
- public fun SingleColumn <* >.allSince (colPath : ColumnPath ): ColumnSet <Any ?> {
212
+ public fun SingleColumn <* >.allFrom (colPath : ColumnPath ): ColumnSet <Any ?> {
177
213
var take = false
178
214
return children {
179
215
if (take) true
@@ -184,8 +220,19 @@ public interface ColumnsSelectionDsl<out T> : ColumnSelectionDsl<T>, SingleColum
184
220
}
185
221
}
186
222
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)
189
236
190
237
// endregion
191
238
@@ -205,13 +252,24 @@ public interface ColumnsSelectionDsl<out T> : ColumnSelectionDsl<T>, SingleColum
205
252
206
253
public fun SingleColumn <* >.allBefore (colName : String ): ColumnSet <Any ?> = allBefore(pathOf(colName))
207
254
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)
208
266
209
267
// endregion
210
268
211
- // region allUntil
269
+ // region allUpTo
212
270
213
271
// including current
214
- public fun SingleColumn <* >.allUntil (colPath : ColumnPath ): ColumnSet <Any ?> {
272
+ public fun SingleColumn <* >.allUpTo (colPath : ColumnPath ): ColumnSet <Any ?> {
215
273
var take = true
216
274
return children {
217
275
if (! take) false
@@ -222,21 +280,46 @@ public interface ColumnsSelectionDsl<out T> : ColumnSelectionDsl<T>, SingleColum
222
280
}
223
281
}
224
282
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)
227
296
228
297
// endregion
229
298
230
299
// endregion
231
300
301
+ // region groups
302
+
232
303
public fun SingleColumn <* >.groups (filter : (ColumnGroup <* >) -> Boolean = { true }): ColumnSet <AnyRow > =
233
304
children { it.isColumnGroup() && filter(it.asColumnGroup()) } as ColumnSet <AnyRow >
234
305
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 ?> =
236
317
transform { it.flatMap { it.children().filter { predicate(it) } } }
237
318
238
319
public fun ColumnGroupReference.children (): ColumnSet <Any ?> = transformSingle { it.children() }
239
320
321
+ // endregion
322
+
240
323
public operator fun <C > List<DataColumn<C>>.get (range : IntRange ): ColumnSet <C > =
241
324
ColumnsList (subList(range.first, range.last + 1 ))
242
325
@@ -246,6 +329,7 @@ public interface ColumnsSelectionDsl<out T> : ColumnSelectionDsl<T>, SingleColum
246
329
transform { it.mapNotNull { it.getChild(colName) } }
247
330
248
331
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)
249
333
250
334
public fun SingleColumn<AnyRow>.take (n : Int ): ColumnSet <* > = transformSingle { it.children().take(n) }
251
335
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
271
355
public fun ColumnSet <* >.startsWith (prefix : CharSequence ): ColumnSet <Any ?> = cols { it.name.startsWith(prefix) }
272
356
public fun ColumnSet <* >.endsWith (suffix : CharSequence ): ColumnSet <Any ?> = cols { it.name.endsWith(suffix) }
273
357
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 ())
275
359
public fun <C > ColumnSet<C>.except (vararg other : String ): ColumnSet <* > = except(other.toColumnSet())
276
360
277
361
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
280
364
createColumnSet { resolve(it).allColumnsExcept(other.resolve(it)) }
281
365
282
366
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 >
284
368
285
369
public operator fun <C > ColumnsSelector <T , C >.invoke (): ColumnSet <C > =
286
370
this (this @ColumnsSelectionDsl, this @ColumnsSelectionDsl)
@@ -297,9 +381,18 @@ public interface ColumnsSelectionDsl<out T> : ColumnSelectionDsl<T>, SingleColum
297
381
toColumnAccessor().into(column.columnName)
298
382
299
383
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)
301
386
302
387
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)
303
396
304
397
// region and
305
398
@@ -340,6 +433,21 @@ public interface ColumnsSelectionDsl<out T> : ColumnSelectionDsl<T>, SingleColum
340
433
// endregion
341
434
342
435
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)
343
451
}
344
452
345
453
public inline fun <T , reified R > ColumnsSelectionDsl<T>.expr (
@@ -350,7 +458,6 @@ public inline fun <T, reified R> ColumnsSelectionDsl<T>.expr(
350
458
351
459
internal fun <T , C > ColumnsSelector <T , C >.filter (predicate : (ColumnWithPath <C >) -> Boolean ): ColumnsSelector <T , C > =
352
460
{ this @filter(it, it).filter(predicate) }
353
- // internal fun Columns<*>.filter(predicate: (AnyCol) -> Boolean) = transform { it.filter { predicate(it.data) } }
354
461
355
462
internal fun ColumnSet <* >.colsInternal (predicate : (AnyCol ) -> Boolean ) =
356
463
transform { it.flatMap { it.children().filter { predicate(it.data) } } }
0 commit comments