Skip to content

Commit 65db81c

Browse files
committed
#20 - Hacking.
Most of SimpleR2dbcRepository queries.
1 parent 090746a commit 65db81c

File tree

11 files changed

+551
-148
lines changed

11 files changed

+551
-148
lines changed

src/main/java/org/springframework/data/r2dbc/dialect/LimitClause.java

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,15 @@ public interface LimitClause {
1515
*/
1616
String getClause(long limit);
1717

18+
/**
19+
* Returns the {@code LIMIT} clause
20+
*
21+
* @param limit the actual limit to use.
22+
* @param offset the offset to start from.
23+
* @return rendered limit clause.
24+
*/
25+
String getClause(long limit, long offset);
26+
1827
/**
1928
* Returns the {@link Position} where to apply the {@link #getClause(long) clause}.
2029
*/

src/main/java/org/springframework/data/r2dbc/dialect/PostgresDialect.java

Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,27 +16,56 @@ public class PostgresDialect implements Dialect {
1616

1717
private static final LimitClause LIMIT_CLAUSE = new LimitClause() {
1818

19+
/*
20+
* (non-Javadoc)
21+
* @see org.springframework.data.r2dbc.dialect.LimitClause#getClause(long, long)
22+
*/
23+
@Override
24+
public String getClause(long limit, long offset) {
25+
return String.format("LIMIT %d OFFSET %d", limit, offset);
26+
}
27+
28+
/*
29+
* (non-Javadoc)
30+
* @see org.springframework.data.r2dbc.dialect.LimitClause#getClause(long)
31+
*/
1932
@Override
2033
public String getClause(long limit) {
2134
return "LIMIT " + limit;
2235
}
2336

37+
/*
38+
* (non-Javadoc)
39+
* @see org.springframework.data.r2dbc.dialect.LimitClause#getClausePosition()
40+
*/
2441
@Override
2542
public Position getClausePosition() {
2643
return Position.END;
2744
}
2845
};
2946

47+
/*
48+
* (non-Javadoc)
49+
* @see org.springframework.data.r2dbc.dialect.Dialect#getBindMarkersFactory()
50+
*/
3051
@Override
3152
public BindMarkersFactory getBindMarkersFactory() {
3253
return INDEXED;
3354
}
3455

56+
/*
57+
* (non-Javadoc)
58+
* @see org.springframework.data.r2dbc.dialect.Dialect#returnGeneratedKeys()
59+
*/
3560
@Override
3661
public String returnGeneratedKeys() {
3762
return "RETURNING *";
3863
}
3964

65+
/*
66+
* (non-Javadoc)
67+
* @see org.springframework.data.r2dbc.dialect.Dialect#limit()
68+
*/
4069
@Override
4170
public LimitClause limit() {
4271
return LIMIT_CLAUSE;

src/main/java/org/springframework/data/r2dbc/dialect/SqlServerDialect.java

Lines changed: 31 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,27 +16,57 @@ public class SqlServerDialect implements Dialect {
1616
SqlServerDialect::filterBindMarker);
1717

1818
private static final LimitClause LIMIT_CLAUSE = new LimitClause() {
19+
20+
/*
21+
* (non-Javadoc)
22+
* @see org.springframework.data.r2dbc.dialect.LimitClause#getClause(long)
23+
*/
1924
@Override
2025
public String getClause(long limit) {
21-
return "FETCH NEXT " + limit + " ROWS ONLY";
26+
return "OFFSET 0 ROWS FETCH NEXT " + limit + " ROWS ONLY";
27+
}
28+
29+
/*
30+
* (non-Javadoc)
31+
* @see org.springframework.data.r2dbc.dialect.LimitClause#getClause(long, long)
32+
*/
33+
@Override
34+
public String getClause(long limit, long offset) {
35+
return String.format("OFFSET %d ROWS FETCH NEXT %d ROWS ONLY", offset, limit);
2236
}
2337

38+
/*
39+
* (non-Javadoc)
40+
* @see org.springframework.data.r2dbc.dialect.LimitClause#getClausePosition()
41+
*/
2442
@Override
2543
public Position getClausePosition() {
2644
return Position.END;
2745
}
2846
};
2947

48+
/*
49+
* (non-Javadoc)
50+
* @see org.springframework.data.r2dbc.dialect.Dialect#getBindMarkersFactory()
51+
*/
3052
@Override
3153
public BindMarkersFactory getBindMarkersFactory() {
3254
return NAMED;
3355
}
3456

57+
/*
58+
* (non-Javadoc)
59+
* @see org.springframework.data.r2dbc.dialect.Dialect#returnGeneratedKeys()
60+
*/
3561
@Override
3662
public String returnGeneratedKeys() {
3763
return "select SCOPE_IDENTITY() AS GENERATED_KEYS";
3864
}
3965

66+
/*
67+
* (non-Javadoc)
68+
* @see org.springframework.data.r2dbc.dialect.Dialect#limit()
69+
*/
4070
@Override
4171
public LimitClause limit() {
4272
return LIMIT_CLAUSE;

src/main/java/org/springframework/data/r2dbc/function/DefaultDatabaseClient.java

Lines changed: 11 additions & 65 deletions
Original file line numberDiff line numberDiff line change
@@ -48,8 +48,6 @@
4848
import org.springframework.dao.DataAccessException;
4949
import org.springframework.data.domain.Pageable;
5050
import org.springframework.data.domain.Sort;
51-
import org.springframework.data.domain.Sort.NullHandling;
52-
import org.springframework.data.domain.Sort.Order;
5351
import org.springframework.data.r2dbc.UncategorizedR2dbcException;
5452
import org.springframework.data.r2dbc.function.connectionfactory.ConnectionProxy;
5553
import org.springframework.data.r2dbc.function.convert.ColumnMapRowMapper;
@@ -58,7 +56,6 @@
5856
import org.springframework.jdbc.core.SqlProvider;
5957
import org.springframework.lang.Nullable;
6058
import org.springframework.util.Assert;
61-
import org.springframework.util.StringUtils;
6259

6360
/**
6461
* Default implementation of {@link DatabaseClient}.
@@ -570,34 +567,6 @@ public DefaultSelectSpecSupport page(Pageable page) {
570567
return createInstance(table, projectedFields, sort, page);
571568
}
572569

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-
601570
<R> SqlResult<R> execute(String sql, BiFunction<Row, RowMetadata, R> mappingFunction) {
602571

603572
Function<Connection, Statement<?>> selectFunction = it -> {
@@ -665,28 +634,17 @@ public Mono<SqlResult<Map<String, Object>>> exchange() {
665634

666635
private <R> SqlResult<R> exchange(BiFunction<Row, RowMetadata, R> mappingFunction) {
667636

668-
List<String> projectedFields;
637+
Set<String> columns;
669638

670639
if (this.projectedFields.isEmpty()) {
671-
projectedFields = Collections.singletonList("*");
640+
columns = Collections.singleton("*");
672641
} 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);
683643
}
684644

685-
if (page.isPaged()) {
686-
selectBuilder.append(' ').append(getLimitOffset(page));
687-
}
645+
QueryOperation select = dataAccessStrategy.select(table, columns, sort, page);
688646

689-
return execute(selectBuilder.toString(), mappingFunction);
647+
return execute(select.toQuery(), mappingFunction);
690648
}
691649

692650
@Override
@@ -764,30 +722,18 @@ public Mono<SqlResult<T>> exchange() {
764722

765723
private <R> SqlResult<R> exchange(BiFunction<Row, RowMetadata, R> mappingFunction) {
766724

767-
List<String> projectedFields;
725+
List<String> columns;
768726

769727
if (this.projectedFields.isEmpty()) {
770-
projectedFields = dataAccessStrategy.getAllColumns(typeToRead);
728+
columns = dataAccessStrategy.getAllColumns(typeToRead);
771729
} else {
772-
projectedFields = this.projectedFields;
730+
columns = this.projectedFields;
773731
}
732+
Sort sortToUse = sort.isSorted() ? dataAccessStrategy.getMappedSort(typeToRead, sort) : Sort.unsorted();
774733

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);
789735

790-
return execute(selectBuilder.toString(), mappingFunction);
736+
return execute(select.get(), mappingFunction);
791737
}
792738

793739
@Override

0 commit comments

Comments
 (0)