Skip to content

Commit 0944f8a

Browse files
committed
spring-projects#282 - Add support of 'LESS/GREATER THAN (EQUAL)' conditions
1 parent bab4c7e commit 0944f8a

File tree

2 files changed

+76
-2
lines changed

2 files changed

+76
-2
lines changed

Diff for: src/main/java/org/springframework/data/r2dbc/repository/query/ConditionFactory.java

+20
Original file line numberDiff line numberDiff line change
@@ -66,6 +66,26 @@ public Condition createCondition(Part part) {
6666
return Conditions.isGreaterOrEqualTo(pathExpression, firstBindMarker)
6767
.and(Conditions.isLessOrEqualTo(pathExpression, secondBindMarker));
6868
}
69+
case GREATER_THAN: {
70+
Expression pathExpression = createPropertyPathExpression(part.getProperty());
71+
BindMarker bindMarker = createBindMarker(parameterMetadataProvider.next(part));
72+
return Conditions.isGreater(pathExpression, bindMarker);
73+
}
74+
case GREATER_THAN_EQUAL: {
75+
Expression pathExpression = createPropertyPathExpression(part.getProperty());
76+
BindMarker bindMarker = createBindMarker(parameterMetadataProvider.next(part));
77+
return Conditions.isGreaterOrEqualTo(pathExpression, bindMarker);
78+
}
79+
case LESS_THAN: {
80+
Expression pathExpression = createPropertyPathExpression(part.getProperty());
81+
BindMarker bindMarker = createBindMarker(parameterMetadataProvider.next(part));
82+
return Conditions.isLess(pathExpression, bindMarker);
83+
}
84+
case LESS_THAN_EQUAL: {
85+
Expression pathExpression = createPropertyPathExpression(part.getProperty());
86+
BindMarker bindMarker = createBindMarker(parameterMetadataProvider.next(part));
87+
return Conditions.isLessOrEqualTo(pathExpression, bindMarker);
88+
}
6989
case SIMPLE_PROPERTY: {
7090
Expression pathExpression = createPropertyPathExpression(part.getProperty());
7191
ParameterMetadata parameterMetadata = parameterMetadataProvider.next(part);

Diff for: src/test/java/org/springframework/data/r2dbc/repository/query/PartTreeR2dbcQueryIntegrationTests.java

+56-2
Original file line numberDiff line numberDiff line change
@@ -55,7 +55,8 @@ public class PartTreeR2dbcQueryIntegrationTests {
5555
private static final String ALL_FIELDS = TABLE + ".id, "
5656
+ TABLE + ".first_name, "
5757
+ TABLE + ".last_name, "
58-
+ TABLE + ".date_of_birth";
58+
+ TABLE + ".date_of_birth, "
59+
+ TABLE + ".age";
5960

6061
@Mock
6162
private ConnectionFactory connectionFactory;
@@ -141,13 +142,57 @@ public void createsQueryToFindAllEntitiesByDateAttributeBetween() throws Excepti
141142
R2dbcQueryMethod queryMethod = getQueryMethod("findAllByDateOfBirthBetween", Date.class, Date.class);
142143
PartTreeR2dbcQuery r2dbcQuery = new PartTreeR2dbcQuery(queryMethod, databaseClient, r2dbcConverter,
143144
dataAccessStrategy);
144-
RelationalParametersParameterAccessor accessor = getAccessor(queryMethod, new Object[]{null, new Date()});
145+
RelationalParametersParameterAccessor accessor = getAccessor(queryMethod, new Object[]{new Date(), new Date()});
145146
BindableQuery bindableQuery = r2dbcQuery.createQuery(accessor);
146147
String expectedSql = "SELECT " + ALL_FIELDS + " FROM " + TABLE
147148
+ " WHERE " + TABLE + ".date_of_birth >= ? AND " + TABLE + ".date_of_birth <= ?";
148149
assertThat(bindableQuery.get()).isEqualTo(expectedSql);
149150
}
150151

152+
@Test
153+
public void createsQueryToFindAllEntitiesByIntegerAttributeLessThan() throws Exception {
154+
R2dbcQueryMethod queryMethod = getQueryMethod("findAllByAgeLessThan", Integer.class);
155+
PartTreeR2dbcQuery r2dbcQuery = new PartTreeR2dbcQuery(queryMethod, databaseClient, r2dbcConverter,
156+
dataAccessStrategy);
157+
RelationalParametersParameterAccessor accessor = getAccessor(queryMethod, new Object[]{30});
158+
BindableQuery bindableQuery = r2dbcQuery.createQuery(accessor);
159+
String expectedSql = "SELECT " + ALL_FIELDS + " FROM " + TABLE + " WHERE " + TABLE + ".age < ?";
160+
assertThat(bindableQuery.get()).isEqualTo(expectedSql);
161+
}
162+
163+
@Test
164+
public void createsQueryToFindAllEntitiesByIntegerAttributeLessThanEqual() throws Exception {
165+
R2dbcQueryMethod queryMethod = getQueryMethod("findAllByAgeLessThanEqual", Integer.class);
166+
PartTreeR2dbcQuery r2dbcQuery = new PartTreeR2dbcQuery(queryMethod, databaseClient, r2dbcConverter,
167+
dataAccessStrategy);
168+
RelationalParametersParameterAccessor accessor = getAccessor(queryMethod, new Object[]{30});
169+
BindableQuery bindableQuery = r2dbcQuery.createQuery(accessor);
170+
String expectedSql = "SELECT " + ALL_FIELDS + " FROM " + TABLE + " WHERE " + TABLE + ".age <= ?";
171+
assertThat(bindableQuery.get()).isEqualTo(expectedSql);
172+
}
173+
174+
@Test
175+
public void createsQueryToFindAllEntitiesByIntegerAttributeGreaterThan() throws Exception {
176+
R2dbcQueryMethod queryMethod = getQueryMethod("findAllByAgeGreaterThan", Integer.class);
177+
PartTreeR2dbcQuery r2dbcQuery = new PartTreeR2dbcQuery(queryMethod, databaseClient, r2dbcConverter,
178+
dataAccessStrategy);
179+
RelationalParametersParameterAccessor accessor = getAccessor(queryMethod, new Object[]{30});
180+
BindableQuery bindableQuery = r2dbcQuery.createQuery(accessor);
181+
String expectedSql = "SELECT " + ALL_FIELDS + " FROM " + TABLE + " WHERE " + TABLE + ".age > ?";
182+
assertThat(bindableQuery.get()).isEqualTo(expectedSql);
183+
}
184+
185+
@Test
186+
public void createsQueryToFindAllEntitiesByIntegerAttributeGreaterThanEqual() throws Exception {
187+
R2dbcQueryMethod queryMethod = getQueryMethod("findAllByAgeGreaterThanEqual", Integer.class);
188+
PartTreeR2dbcQuery r2dbcQuery = new PartTreeR2dbcQuery(queryMethod, databaseClient, r2dbcConverter,
189+
dataAccessStrategy);
190+
RelationalParametersParameterAccessor accessor = getAccessor(queryMethod, new Object[]{30});
191+
BindableQuery bindableQuery = r2dbcQuery.createQuery(accessor);
192+
String expectedSql = "SELECT " + ALL_FIELDS + " FROM " + TABLE + " WHERE " + TABLE + ".age >= ?";
193+
assertThat(bindableQuery.get()).isEqualTo(expectedSql);
194+
}
195+
151196
private R2dbcQueryMethod getQueryMethod(String methodName, Class<?>... parameterTypes) throws Exception {
152197
Method method = UserRepository.class.getMethod(methodName, parameterTypes);
153198
return new R2dbcQueryMethod(method, new DefaultRepositoryMetadata(UserRepository.class),
@@ -168,6 +213,14 @@ private interface UserRepository extends Repository<User, Long> {
168213
Mono<Boolean> existsByFirstName(String firstName);
169214

170215
Flux<User> findAllByDateOfBirthBetween(Date from, Date to);
216+
217+
Flux<User> findAllByAgeLessThan(Integer age);
218+
219+
Flux<User> findAllByAgeLessThanEqual(Integer age);
220+
221+
Flux<User> findAllByAgeGreaterThan(Integer age);
222+
223+
Flux<User> findAllByAgeGreaterThanEqual(Integer age);
171224
}
172225

173226
@Table("users")
@@ -178,5 +231,6 @@ private static class User {
178231
private String firstName;
179232
private String lastName;
180233
private Date dateOfBirth;
234+
private Integer age;
181235
}
182236
}

0 commit comments

Comments
 (0)