|
48 | 48 | import org.springframework.dao.DataAccessException;
|
49 | 49 | import org.springframework.data.domain.Pageable;
|
50 | 50 | import org.springframework.data.domain.Sort;
|
51 |
| -import org.springframework.data.domain.Sort.NullHandling; |
52 |
| -import org.springframework.data.domain.Sort.Order; |
53 | 51 | import org.springframework.data.r2dbc.UncategorizedR2dbcException;
|
54 | 52 | import org.springframework.data.r2dbc.function.connectionfactory.ConnectionProxy;
|
55 | 53 | import org.springframework.data.r2dbc.function.convert.ColumnMapRowMapper;
|
|
58 | 56 | import org.springframework.jdbc.core.SqlProvider;
|
59 | 57 | import org.springframework.lang.Nullable;
|
60 | 58 | import org.springframework.util.Assert;
|
61 |
| -import org.springframework.util.StringUtils; |
62 | 59 |
|
63 | 60 | /**
|
64 | 61 | * Default implementation of {@link DatabaseClient}.
|
@@ -570,34 +567,6 @@ public DefaultSelectSpecSupport page(Pageable page) {
|
570 | 567 | return createInstance(table, projectedFields, sort, page);
|
571 | 568 | }
|
572 | 569 |
|
573 |
| - StringBuilder getLimitOffset(Pageable pageable) { |
574 |
| - return new StringBuilder().append("LIMIT").append(' ').append(pageable.getPageSize()) // |
575 |
| - .append(' ').append("OFFSET").append(' ').append(pageable.getOffset()); |
576 |
| - } |
577 |
| - |
578 |
| - StringBuilder getSortClause(Sort sort) { |
579 |
| - |
580 |
| - StringBuilder sortClause = new StringBuilder(); |
581 |
| - |
582 |
| - for (Order order : sort) { |
583 |
| - |
584 |
| - if (sortClause.length() != 0) { |
585 |
| - sortClause.append(',').append(' '); |
586 |
| - } |
587 |
| - |
588 |
| - sortClause.append(order.getProperty()).append(' ').append(order.getDirection().isAscending() ? "ASC" : "DESC"); |
589 |
| - |
590 |
| - if (order.getNullHandling() == NullHandling.NULLS_FIRST) { |
591 |
| - sortClause.append(' ').append("NULLS FIRST"); |
592 |
| - } |
593 |
| - |
594 |
| - if (order.getNullHandling() == NullHandling.NULLS_LAST) { |
595 |
| - sortClause.append(' ').append("NULLS LAST"); |
596 |
| - } |
597 |
| - } |
598 |
| - return sortClause; |
599 |
| - } |
600 |
| - |
601 | 570 | <R> SqlResult<R> execute(String sql, BiFunction<Row, RowMetadata, R> mappingFunction) {
|
602 | 571 |
|
603 | 572 | Function<Connection, Statement<?>> selectFunction = it -> {
|
@@ -665,28 +634,17 @@ public Mono<SqlResult<Map<String, Object>>> exchange() {
|
665 | 634 |
|
666 | 635 | private <R> SqlResult<R> exchange(BiFunction<Row, RowMetadata, R> mappingFunction) {
|
667 | 636 |
|
668 |
| - List<String> projectedFields; |
| 637 | + Set<String> columns; |
669 | 638 |
|
670 | 639 | if (this.projectedFields.isEmpty()) {
|
671 |
| - projectedFields = Collections.singletonList("*"); |
| 640 | + columns = Collections.singleton("*"); |
672 | 641 | } else {
|
673 |
| - projectedFields = this.projectedFields; |
674 |
| - } |
675 |
| - |
676 |
| - StringBuilder selectBuilder = new StringBuilder(); |
677 |
| - selectBuilder.append("SELECT").append(' ') // |
678 |
| - .append(StringUtils.collectionToDelimitedString(projectedFields, ", ")).append(' ') // |
679 |
| - .append("FROM").append(' ').append(table); |
680 |
| - |
681 |
| - if (sort.isSorted()) { |
682 |
| - selectBuilder.append(' ').append("ORDER BY").append(' ').append(getSortClause(sort)); |
| 642 | + columns = new LinkedHashSet<>(this.projectedFields); |
683 | 643 | }
|
684 | 644 |
|
685 |
| - if (page.isPaged()) { |
686 |
| - selectBuilder.append(' ').append(getLimitOffset(page)); |
687 |
| - } |
| 645 | + QueryOperation select = dataAccessStrategy.select(table, columns, sort, page); |
688 | 646 |
|
689 |
| - return execute(selectBuilder.toString(), mappingFunction); |
| 647 | + return execute(select.toQuery(), mappingFunction); |
690 | 648 | }
|
691 | 649 |
|
692 | 650 | @Override
|
@@ -764,30 +722,18 @@ public Mono<SqlResult<T>> exchange() {
|
764 | 722 |
|
765 | 723 | private <R> SqlResult<R> exchange(BiFunction<Row, RowMetadata, R> mappingFunction) {
|
766 | 724 |
|
767 |
| - List<String> projectedFields; |
| 725 | + List<String> columns; |
768 | 726 |
|
769 | 727 | if (this.projectedFields.isEmpty()) {
|
770 |
| - projectedFields = dataAccessStrategy.getAllColumns(typeToRead); |
| 728 | + columns = dataAccessStrategy.getAllColumns(typeToRead); |
771 | 729 | } else {
|
772 |
| - projectedFields = this.projectedFields; |
| 730 | + columns = this.projectedFields; |
773 | 731 | }
|
| 732 | + Sort sortToUse = sort.isSorted() ? dataAccessStrategy.getMappedSort(typeToRead, sort) : Sort.unsorted(); |
774 | 733 |
|
775 |
| - StringBuilder selectBuilder = new StringBuilder(); |
776 |
| - selectBuilder.append("SELECT").append(' ') // |
777 |
| - .append(StringUtils.collectionToDelimitedString(projectedFields, ", ")).append(' ') // |
778 |
| - .append("FROM").append(' ').append(table); |
779 |
| - |
780 |
| - if (sort.isSorted()) { |
781 |
| - |
782 |
| - Sort mappedSort = dataAccessStrategy.getMappedSort(typeToRead, sort); |
783 |
| - selectBuilder.append(' ').append("ORDER BY").append(' ').append(getSortClause(mappedSort)); |
784 |
| - } |
785 |
| - |
786 |
| - if (page.isPaged()) { |
787 |
| - selectBuilder.append(' ').append(getLimitOffset(page)); |
788 |
| - } |
| 734 | + QueryOperation select = dataAccessStrategy.select(table, new LinkedHashSet<>(columns), sortToUse, page); |
789 | 735 |
|
790 |
| - return execute(selectBuilder.toString(), mappingFunction); |
| 736 | + return execute(select.get(), mappingFunction); |
791 | 737 | }
|
792 | 738 |
|
793 | 739 | @Override
|
|
0 commit comments