@@ -16,6 +16,32 @@ import org.junit.Test
16
16
17
17
class AllExceptTests : ColumnsSelectionDslTests () {
18
18
19
+ @Test
20
+ fun `issue 761` () {
21
+ val renamed = df.rename { colsAtAnyDepth() except name.firstName }.into { it.name.uppercase() }
22
+ renamed.columnNames() shouldBe listOf (" NAME" , " AGE" , " CITY" , " WEIGHT" , " ISHAPPY" )
23
+ renamed.getColumnGroup(" NAME" ).columnNames() shouldBe listOf (" firstName" , " LASTNAME" )
24
+
25
+ val df2 = dataFrameOf(" a.b" , " a.c.d" , " d.e" , " d.f" )(1 , 3.0 , 2 , " b" )
26
+ .move { all() }.into { it.name.split(" ." ).toPath() }
27
+ df2.select { cols(" a" ) except " a" [" b" ] }.let {
28
+ it.getColumnGroup(" a" ).getColumnOrNull(" b" ) shouldBe null
29
+ it[pathOf(" a" , " c" , " d" )].single() shouldBe 3.0
30
+ }
31
+ df2.select { cols(" a" ) except " a" [" c" ][" d" ] }.let {
32
+ it.getColumnGroup(" a" ).getColumnOrNull(" c" ) shouldBe null
33
+ it[pathOf(" a" , " b" )].single() shouldBe 1
34
+ }
35
+ df2.select { " a" .except(" b" ) }.let {
36
+ it.getColumnGroup(" a" ).getColumnOrNull(" b" ) shouldBe null
37
+ it[pathOf(" a" , " c" , " d" )].single() shouldBe 3.0
38
+ }
39
+ df2.select { " a" .except { " c" [" d" ] } }.let {
40
+ it.getColumnGroup(" a" ).getColumnOrNull(" c" ) shouldBe null
41
+ it[pathOf(" a" , " b" )].single() shouldBe 1
42
+ }
43
+ }
44
+
19
45
@Test
20
46
fun `exceptions` () {
21
47
shouldThrow<IllegalStateException > {
@@ -70,12 +96,15 @@ class AllExceptTests : ColumnsSelectionDslTests() {
70
96
).shouldAllBeEqual()
71
97
72
98
listOf (
73
- df.select { name and name.firstName }.alsoDebug(),
99
+ df.select { cols(name) except name.firstName },
100
+ df.select { (name and name.firstName and name.firstName) except name.firstName },
101
+ df.select { (name and name and name.firstName).except(name.firstName).simplify() },
74
102
).shouldAllBeEqual()
75
103
76
- df.select { (name and name.firstName and name.firstName) except name.firstName }.alsoDebug()
77
-
78
- df.select { (name and name and name.firstName) except name.firstName }.alsoDebug()
104
+ df.getColumns { (name and name and name.firstName).except(name.firstName) }.forEach {
105
+ it.isColumnGroup() shouldBe true
106
+ it.asColumnGroup().columnNames() shouldBe listOf (" lastName" )
107
+ }
79
108
}
80
109
81
110
@Test
@@ -282,4 +311,79 @@ class AllExceptTests : ColumnsSelectionDslTests() {
282
311
},
283
312
).shouldAllBeEqual()
284
313
}
314
+
315
+ @Test
316
+ fun `except on column group` () {
317
+ val firstNameAccessor = column<String >(" firstName" )
318
+ listOf (
319
+ df.select { name }.remove { name.firstName }.alsoDebug(),
320
+ df.select { cols(name) except name.firstName },
321
+ df.select { name.except { cols { " first" in it.name } } },
322
+ df.select { name.except { cols { " first" in it.name } and cols { " first" in it.name } } },
323
+ df.select { name.except { firstName } },
324
+ df.select { name.except { firstNameAccessor } },
325
+ df.select { name.except { firstName and firstName } },
326
+ df.select { name.except { firstNameAccessor and firstNameAccessor } },
327
+ // df.select { name.except(name.firstName and name.firstName) }, // not allowed
328
+ // df.select { name.except(firstNameAccessor and firstNameAccessor) }, // not allowed
329
+ df.select { name.except(" firstName" ) },
330
+ df.select { name.except(" firstName" , " firstName" ) },
331
+ df.select { name.except(Name ::firstName) },
332
+ df.select { name.except(Name ::firstName, Name ::firstName) },
333
+ df.select { name.except(pathOf(" firstName" )) },
334
+ df.select { name.except(pathOf(" firstName" ), pathOf(" firstName" )) },
335
+ df.select { " name" .except { cols { " first" in it.name } } },
336
+ df.select { " name" .except { cols { " first" in it.name } and cols { " first" in it.name } } },
337
+ df.select { " name" .except { firstNameAccessor } },
338
+ df.select { " name" .except { firstNameAccessor and firstNameAccessor } },
339
+ // df.select { "name".except(name.firstName and name.firstName) }, // not allowed
340
+ // df.select { "name".except(firstNameAccessor and firstNameAccessor) }, // not allowed
341
+ df.select { " name" .except(" firstName" ) },
342
+ df.select { " name" .except(" firstName" , " firstName" ) },
343
+ df.select { " name" .except(Name ::firstName) },
344
+ df.select { " name" .except(Name ::firstName, Name ::firstName) },
345
+ df.select { " name" .except(pathOf(" firstName" )) },
346
+ df.select { " name" .except(pathOf(" firstName" ), pathOf(" firstName" )) },
347
+ // df.select { Person::name.except(name.firstName and name.firstName) }, // not allowed
348
+ // df.select { Person::name.except(firstNameAccessor and firstNameAccessor) }, // not allowed
349
+ df.select { Person ::name.except(" firstName" ) },
350
+ df.select { Person ::name.except(" firstName" , " firstName" ) },
351
+ df.select { Person ::name.except(Name ::firstName) },
352
+ df.select { Person ::name.except(Name ::firstName, Name ::firstName) },
353
+ df.select { Person ::name.except(pathOf(" firstName" )) },
354
+ df.select { Person ::name.except(pathOf(" firstName" ), pathOf(" firstName" )) },
355
+ df.select { NonDataSchemaPerson ::name.except { cols { " first" in it.name } } },
356
+ df.select {
357
+ NonDataSchemaPerson ::name.except {
358
+ cols { " first" in it.name } and
359
+ cols { " first" in it.name }
360
+ }
361
+ },
362
+ df.select { NonDataSchemaPerson ::name.except { firstName } },
363
+ df.select { NonDataSchemaPerson ::name.except { firstNameAccessor } },
364
+ df.select { NonDataSchemaPerson ::name.except { firstName and firstName } },
365
+ df.select { NonDataSchemaPerson ::name.except { firstNameAccessor and firstNameAccessor } },
366
+ // df.select { NonDataSchemaPerson::name.except(name.firstName and name.firstName) }, // not allowed
367
+ // df.select { NonDataSchemaPerson::name.except(firstNameAccessor and firstNameAccessor) }, // not allowed
368
+ df.select { NonDataSchemaPerson ::name.except(" firstName" ) },
369
+ df.select { NonDataSchemaPerson ::name.except(" firstName" , " firstName" ) },
370
+ df.select { NonDataSchemaPerson ::name.except(Name ::firstName) },
371
+ df.select { NonDataSchemaPerson ::name.except(Name ::firstName, Name ::firstName) },
372
+ df.select { NonDataSchemaPerson ::name.except(pathOf(" firstName" )) },
373
+ df.select { NonDataSchemaPerson ::name.except(pathOf(" firstName" ), pathOf(" firstName" )) },
374
+ df.select { pathOf(" name" ).except { cols { " first" in it.name } } },
375
+ df.select { pathOf(" name" ).except { cols { " first" in it.name } and cols { " first" in it.name } } },
376
+ df.select { pathOf(" name" ).except { firstNameAccessor } },
377
+ df.select { pathOf(" name" ).except { firstNameAccessor and firstNameAccessor } },
378
+ // df.select { pathOf("name").except(name.firstName and name.firstName) }, // not allowed
379
+ // df.select { pathOf("name").except(firstNameAccessor and firstNameAccessor) }, // not allowed
380
+ df.select { pathOf(" name" ).except(" firstName" ) },
381
+ df.select { pathOf(" name" ).except(" firstName" , " firstName" ) },
382
+ df.select { pathOf(" name" ).except(Name ::firstName) },
383
+ df.select { pathOf(" name" ).except(Name ::firstName) },
384
+ df.select { pathOf(" name" ).except(Name ::firstName, Name ::firstName) },
385
+ df.select { pathOf(" name" ).except(pathOf(" firstName" )) },
386
+ df.select { pathOf(" name" ).except(pathOf(" firstName" ), pathOf(" firstName" )) },
387
+ ).shouldAllBeEqual()
388
+ }
285
389
}
0 commit comments