|
40 | 40 | * @author Grégoire Druant
|
41 | 41 | * @author Mohammad Hewedy
|
42 | 42 | * @author Greg Turnquist
|
| 43 | + * @author Jędrzej Biedrzycki |
43 | 44 | */
|
44 | 45 | class QueryUtilsUnitTests {
|
45 | 46 |
|
@@ -552,4 +553,79 @@ void countProjectionDistinctQueryIncludesNewLineAfterEntityAndBeforeWhere() {
|
552 | 553 | private static void assertCountQuery(String originalQuery, String countQuery) {
|
553 | 554 | assertThat(createCountQueryFor(originalQuery)).isEqualTo(countQuery);
|
554 | 555 | }
|
| 556 | + |
| 557 | + @Test // GH-2260 |
| 558 | + void applySortingAccountsForNativeWindowFunction() { |
| 559 | + |
| 560 | + Sort sort = Sort.by(Order.desc("age")); |
| 561 | + |
| 562 | + // order by absent |
| 563 | + assertThat(QueryUtils.applySorting("select * from user u", sort)) |
| 564 | + .isEqualTo("select * from user u order by u.age desc"); |
| 565 | + |
| 566 | + // order by present |
| 567 | + assertThat(QueryUtils.applySorting("select * from user u order by u.lastname", sort)) |
| 568 | + .isEqualTo("select * from user u order by u.lastname, u.age desc"); |
| 569 | + |
| 570 | + // partition by |
| 571 | + assertThat(QueryUtils.applySorting("select dense_rank() over (partition by age) from user u", sort)) |
| 572 | + .isEqualTo("select dense_rank() over (partition by age) from user u order by u.age desc"); |
| 573 | + |
| 574 | + // order by in over clause |
| 575 | + assertThat(QueryUtils.applySorting("select dense_rank() over (order by lastname) from user u", sort)) |
| 576 | + .isEqualTo("select dense_rank() over (order by lastname) from user u order by u.age desc"); |
| 577 | + |
| 578 | + // order by in over clause (additional spaces) |
| 579 | + assertThat(QueryUtils.applySorting("select dense_rank() over ( order by lastname ) from user u", sort)) |
| 580 | + .isEqualTo("select dense_rank() over ( order by lastname ) from user u order by u.age desc"); |
| 581 | + |
| 582 | + // order by in over clause + at the end |
| 583 | + assertThat( |
| 584 | + QueryUtils.applySorting("select dense_rank() over (order by lastname) from user u order by u.lastname", sort)) |
| 585 | + .isEqualTo("select dense_rank() over (order by lastname) from user u order by u.lastname, u.age desc"); |
| 586 | + |
| 587 | + // partition by + order by in over clause |
| 588 | + assertThat(QueryUtils.applySorting( |
| 589 | + "select dense_rank() over (partition by active, age order by lastname) from user u", sort)).isEqualTo( |
| 590 | + "select dense_rank() over (partition by active, age order by lastname) from user u order by u.age desc"); |
| 591 | + |
| 592 | + // partition by + order by in over clause + order by at the end |
| 593 | + assertThat(QueryUtils.applySorting( |
| 594 | + "select dense_rank() over (partition by active, age order by lastname) from user u order by active", sort)) |
| 595 | + .isEqualTo( |
| 596 | + "select dense_rank() over (partition by active, age order by lastname) from user u order by active, u.age desc"); |
| 597 | + |
| 598 | + // partition by + order by in over clause + frame clause |
| 599 | + assertThat(QueryUtils.applySorting( |
| 600 | + "select dense_rank() over ( partition by active, age order by username rows between current row and unbounded following ) from user u", |
| 601 | + sort)).isEqualTo( |
| 602 | + "select dense_rank() over ( partition by active, age order by username rows between current row and unbounded following ) from user u order by u.age desc"); |
| 603 | + |
| 604 | + // partition by + order by in over clause + frame clause + order by at the end |
| 605 | + assertThat(QueryUtils.applySorting( |
| 606 | + "select dense_rank() over ( partition by active, age order by username rows between current row and unbounded following ) from user u order by active", |
| 607 | + sort)).isEqualTo( |
| 608 | + "select dense_rank() over ( partition by active, age order by username rows between current row and unbounded following ) from user u order by active, u.age desc"); |
| 609 | + |
| 610 | + // order by in subselect (select expression) |
| 611 | + assertThat( |
| 612 | + QueryUtils.applySorting("select lastname, (select i.id from item i order by i.id limit 1) from user u", sort)) |
| 613 | + .isEqualTo( |
| 614 | + "select lastname, (select i.id from item i order by i.id limit 1) from user u order by u.age desc"); |
| 615 | + |
| 616 | + // order by in subselect (select expression) + at the end |
| 617 | + assertThat(QueryUtils.applySorting( |
| 618 | + "select lastname, (select i.id from item i order by 1 limit 1) from user u order by active", sort)).isEqualTo( |
| 619 | + "select lastname, (select i.id from item i order by 1 limit 1) from user u order by active, u.age desc"); |
| 620 | + |
| 621 | + // order by in subselect (from expression) |
| 622 | + assertThat(QueryUtils.applySorting("select * from (select * from user order by age desc limit 10) u", sort)) |
| 623 | + .isEqualTo("select * from (select * from user order by age desc limit 10) u order by age desc"); |
| 624 | + |
| 625 | + // order by in subselect (from expression) + at the end |
| 626 | + assertThat(QueryUtils.applySorting( |
| 627 | + "select * from (select * from user order by 1, 2, 3 desc limit 10) u order by u.active asc", sort)).isEqualTo( |
| 628 | + "select * from (select * from user order by 1, 2, 3 desc limit 10) u order by u.active asc, age desc"); |
| 629 | + } |
| 630 | + |
555 | 631 | }
|
0 commit comments