@@ -16,6 +16,32 @@ import org.junit.Test
1616
1717class AllExceptTests : ColumnsSelectionDslTests () {
1818
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+
1945 @Test
2046 fun `exceptions` () {
2147 shouldThrow<IllegalStateException > {
@@ -70,12 +96,15 @@ class AllExceptTests : ColumnsSelectionDslTests() {
7096 ).shouldAllBeEqual()
7197
7298 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() },
74102 ).shouldAllBeEqual()
75103
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+ }
79108 }
80109
81110 @Test
@@ -282,4 +311,79 @@ class AllExceptTests : ColumnsSelectionDslTests() {
282311 },
283312 ).shouldAllBeEqual()
284313 }
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+ }
285389}
0 commit comments