Browse Source

Polishing.

Introduce Query.isLimited method to avoid magic numbers.

See #1233
Original pull request: #1233.
pull/1235/head
Mark Paluch 4 years ago
parent
commit
f6e7792094
No known key found for this signature in database
GPG Key ID: 4406B84C1661DCD1
  1. 12
      spring-data-r2dbc/src/main/java/org/springframework/data/r2dbc/core/R2dbcEntityTemplate.java
  2. 12
      spring-data-r2dbc/src/test/java/org/springframework/data/r2dbc/core/R2dbcEntityTemplateUnitTests.java
  3. 15
      spring-data-relational/src/main/java/org/springframework/data/relational/core/query/Query.java

12
spring-data-r2dbc/src/main/java/org/springframework/data/r2dbc/core/R2dbcEntityTemplate.java

@ -151,8 +151,7 @@ public class R2dbcEntityTemplate implements R2dbcEntityOperations, BeanFactoryAw @@ -151,8 +151,7 @@ public class R2dbcEntityTemplate implements R2dbcEntityOperations, BeanFactoryAw
* @param databaseClient must not be {@literal null}.
* @since 1.2
*/
public R2dbcEntityTemplate(DatabaseClient databaseClient,
ReactiveDataAccessStrategy strategy) {
public R2dbcEntityTemplate(DatabaseClient databaseClient, ReactiveDataAccessStrategy strategy) {
Assert.notNull(databaseClient, "DatabaseClient must not be null");
Assert.notNull(strategy, "ReactiveDataAccessStrategy must not be null");
@ -421,13 +420,8 @@ public class R2dbcEntityTemplate implements R2dbcEntityOperations, BeanFactoryAw @@ -421,13 +420,8 @@ public class R2dbcEntityTemplate implements R2dbcEntityOperations, BeanFactoryAw
*/
@Override
public <T> Mono<T> selectOne(Query query, Class<T> entityClass) throws DataAccessException {
Query q = query;
/* If the query has not a defined limit, a limit of 2 is employed
to catch cases where the query would yield more than one result. */
if (query.getLimit() == -1) {
q = query.limit(2);
} // else: use the already defined limit.
return doSelect(q, entityClass, getTableName(entityClass), entityClass, RowsFetchSpec::one);
return doSelect(query.isLimited() ? query : query.limit(2), entityClass, getTableName(entityClass), entityClass,
RowsFetchSpec::one);
}
/*

12
spring-data-r2dbc/src/test/java/org/springframework/data/r2dbc/core/R2dbcEntityTemplateUnitTests.java

@ -90,8 +90,7 @@ public class R2dbcEntityTemplateUnitTests { @@ -90,8 +90,7 @@ public class R2dbcEntityTemplateUnitTests {
MockRowMetadata metadata = MockRowMetadata.builder()
.columnMetadata(MockColumnMetadata.builder().name("name").type(R2dbcType.VARCHAR).build()).build();
MockResult result = MockResult.builder()
.row(MockRow.builder().identified(0, Long.class, 1L).build()).build();
MockResult result = MockResult.builder().row(MockRow.builder().identified(0, Long.class, 1L).build()).build();
recorder.addStubbing(s -> s.startsWith("SELECT"), result);
@ -111,8 +110,7 @@ public class R2dbcEntityTemplateUnitTests { @@ -111,8 +110,7 @@ public class R2dbcEntityTemplateUnitTests {
MockRowMetadata metadata = MockRowMetadata.builder()
.columnMetadata(MockColumnMetadata.builder().name("name").type(R2dbcType.VARCHAR).build()).build();
MockResult result = MockResult.builder()
.row(MockRow.builder().identified(0, Object.class, null).build()).build();
MockResult result = MockResult.builder().row(MockRow.builder().identified(0, Object.class, null).build()).build();
recorder.addStubbing(s -> s.startsWith("SELECT"), result);
@ -129,8 +127,7 @@ public class R2dbcEntityTemplateUnitTests { @@ -129,8 +127,7 @@ public class R2dbcEntityTemplateUnitTests {
MockRowMetadata metadata = MockRowMetadata.builder()
.columnMetadata(MockColumnMetadata.builder().name("name").type(R2dbcType.VARCHAR).build()).build();
MockResult result = MockResult.builder()
.row(MockRow.builder().identified(0, Long.class, 1L).build()).build();
MockResult result = MockResult.builder().row(MockRow.builder().identified(0, Long.class, 1L).build()).build();
recorder.addStubbing(s -> s.startsWith("SELECT"), result);
@ -208,7 +205,8 @@ public class R2dbcEntityTemplateUnitTests { @@ -208,7 +205,8 @@ public class R2dbcEntityTemplateUnitTests {
recorder.addStubbing(s -> s.startsWith("SELECT"), Collections.emptyList());
entityTemplate.selectOne(Query.query(Criteria.where("name").is("Walter")).sort(Sort.by("name")).limit(1), Person.class) //
entityTemplate
.selectOne(Query.query(Criteria.where("name").is("Walter")).sort(Sort.by("name")).limit(1), Person.class) //
.as(StepVerifier::create) //
.verifyComplete();

15
spring-data-relational/src/main/java/org/springframework/data/relational/core/query/Query.java

@ -41,6 +41,8 @@ import org.springframework.util.Assert; @@ -41,6 +41,8 @@ import org.springframework.util.Assert;
*/
public class Query {
private static final int NO_LIMIT = -1;
private final @Nullable CriteriaDefinition criteria;
private final List<SqlIdentifier> columns;
@ -64,7 +66,7 @@ public class Query { @@ -64,7 +66,7 @@ public class Query {
* @param criteria must not be {@literal null}.
*/
private Query(@Nullable CriteriaDefinition criteria) {
this(criteria, Collections.emptyList(), Sort.unsorted(), -1, -1);
this(criteria, Collections.emptyList(), Sort.unsorted(), NO_LIMIT, NO_LIMIT);
}
private Query(@Nullable CriteriaDefinition criteria, List<SqlIdentifier> columns, Sort sort, int limit, long offset) {
@ -248,6 +250,17 @@ public class Query { @@ -248,6 +250,17 @@ public class Query {
return this.limit;
}
/**
* Return whether the query has a limit.
*
* @return {@code true} if a limit is set.
* @see #getLimit()
* @since 3.0
*/
public boolean isLimited() {
return getLimit() != NO_LIMIT;
}
private static void assertNoCaseSort(Sort sort) {
for (Sort.Order order : sort) {

Loading…
Cancel
Save