Skip to content

Commit 05e9655

Browse files
mp911deschauder
authored andcommitted
Associate value with isTrue/isFalse criteria operators.
We now associate a boolean value with both operators as those operators are rendered using equals comparison in the actual SQL text. Orginal pull request #1188
1 parent eabcee7 commit 05e9655

File tree

4 files changed

+56
-14
lines changed

4 files changed

+56
-14
lines changed

spring-data-jdbc/src/main/java/org/springframework/data/jdbc/repository/query/QueryMapper.java

+4-2
Original file line numberDiff line numberDiff line change
@@ -494,13 +494,15 @@ private Condition createCondition(Column column, @Nullable Object mappedValue, S
494494

495495
if (comparator == Comparator.IS_TRUE) {
496496

497-
Expression bind = bindBoolean(column, parameterSource, true);
497+
Expression bind = bindBoolean(column, parameterSource,
498+
mappedValue instanceof Boolean ? (Boolean) mappedValue : true);
498499
return column.isEqualTo(bind);
499500
}
500501

501502
if (comparator == Comparator.IS_FALSE) {
502503

503-
Expression bind = bindBoolean(column, parameterSource, false);
504+
Expression bind = bindBoolean(column, parameterSource,
505+
mappedValue instanceof Boolean ? (Boolean) mappedValue : false);
504506
return column.isEqualTo(bind);
505507
}
506508

spring-data-r2dbc/src/test/java/org/springframework/data/r2dbc/query/QueryMapperUnitTests.java

+48-10
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,10 @@
2626
import org.springframework.data.domain.Sort;
2727
import org.springframework.data.r2dbc.convert.MappingR2dbcConverter;
2828
import org.springframework.data.r2dbc.convert.R2dbcConverter;
29+
import org.springframework.data.r2dbc.convert.R2dbcCustomConversions;
30+
import org.springframework.data.r2dbc.dialect.MySqlDialect;
2931
import org.springframework.data.r2dbc.dialect.PostgresDialect;
32+
import org.springframework.data.r2dbc.dialect.R2dbcDialect;
3033
import org.springframework.data.r2dbc.mapping.R2dbcMappingContext;
3134
import org.springframework.data.relational.core.mapping.Column;
3235
import org.springframework.data.relational.core.query.Criteria;
@@ -45,11 +48,21 @@
4548
*/
4649
class QueryMapperUnitTests {
4750

48-
private R2dbcMappingContext context = new R2dbcMappingContext();
49-
private R2dbcConverter converter = new MappingR2dbcConverter(context);
50-
51-
private QueryMapper mapper = new QueryMapper(PostgresDialect.INSTANCE, converter);
5251
private BindTarget bindTarget = mock(BindTarget.class);
52+
private QueryMapper mapper = createMapper(PostgresDialect.INSTANCE);
53+
54+
QueryMapper createMapper(R2dbcDialect dialect) {
55+
56+
R2dbcCustomConversions conversions = R2dbcCustomConversions.of(dialect);
57+
58+
R2dbcMappingContext context = new R2dbcMappingContext();
59+
context.setSimpleTypeHolder(conversions.getSimpleTypeHolder());
60+
context.afterPropertiesSet();
61+
62+
R2dbcConverter converter = new MappingR2dbcConverter(context, conversions);
63+
64+
return new QueryMapper(dialect, converter);
65+
}
5366

5467
@Test // gh-289
5568
void shouldNotMapEmptyCriteria() {
@@ -189,7 +202,7 @@ void shouldMapExpression() {
189202
Table table = Table.create("my_table").as("my_aliased_table");
190203

191204
Expression mappedObject = mapper.getMappedObject(table.column("alternative").as("my_aliased_col"),
192-
context.getRequiredPersistentEntity(Person.class));
205+
mapper.getMappingContext().getRequiredPersistentEntity(Person.class));
193206

194207
assertThat(mappedObject).hasToString("my_aliased_table.another_name AS my_aliased_col");
195208
}
@@ -200,7 +213,7 @@ void shouldMapCountFunction() {
200213
Table table = Table.create("my_table").as("my_aliased_table");
201214

202215
Expression mappedObject = mapper.getMappedObject(Functions.count(table.column("alternative")),
203-
context.getRequiredPersistentEntity(Person.class));
216+
mapper.getMappingContext().getRequiredPersistentEntity(Person.class));
204217

205218
assertThat(mappedObject).hasToString("COUNT(my_aliased_table.another_name)");
206219
}
@@ -211,7 +224,7 @@ void shouldMapExpressionToUnknownColumn() {
211224
Table table = Table.create("my_table").as("my_aliased_table");
212225

213226
Expression mappedObject = mapper.getMappedObject(table.column("unknown").as("my_aliased_col"),
214-
context.getRequiredPersistentEntity(Person.class));
227+
mapper.getMappingContext().getRequiredPersistentEntity(Person.class));
215228

216229
assertThat(mappedObject).hasToString("my_aliased_table.unknown AS my_aliased_col");
217230
}
@@ -392,7 +405,7 @@ void shouldMapSort() {
392405

393406
Sort sort = Sort.by(desc("alternative"));
394407

395-
Sort mapped = mapper.getMappedObject(sort, context.getRequiredPersistentEntity(Person.class));
408+
Sort mapped = mapper.getMappedObject(sort, mapper.getMappingContext().getRequiredPersistentEntity(Person.class));
396409

397410
assertThat(mapped.getOrderFor("another_name")).isEqualTo(desc("another_name"));
398411
assertThat(mapped.getOrderFor("alternative")).isNull();
@@ -403,7 +416,7 @@ void mapSortForPropertyPathInPrimitiveShouldFallBackToColumnName() {
403416

404417
Sort sort = Sort.by(desc("alternative_name"));
405418

406-
Sort mapped = mapper.getMappedObject(sort, context.getRequiredPersistentEntity(Person.class));
419+
Sort mapped = mapper.getMappedObject(sort, mapper.getMappingContext().getRequiredPersistentEntity(Person.class));
407420
assertThat(mapped.getOrderFor("alternative_name")).isEqualTo(desc("alternative_name"));
408421
}
409422

@@ -427,19 +440,44 @@ void mapQueryForEnumArrayShouldMapToStringList() {
427440
assertThat(bindings.getCondition()).hasToString("person.enum_value IN (?[$1], ?[$2])");
428441
}
429442

443+
@Test // gh-733
444+
void shouldMapBooleanConditionProperly() {
445+
446+
Criteria criteria = Criteria.where("state").isFalse();
447+
448+
BoundCondition bindings = map(criteria);
449+
450+
assertThat(bindings.getCondition()).hasToString("person.state = ?[$1]");
451+
assertThat(bindings.getBindings().iterator().next().getValue()).isEqualTo(false);
452+
}
453+
454+
@Test // gh-733
455+
void shouldMapAndConvertBooleanConditionProperly() {
456+
457+
mapper = createMapper(MySqlDialect.INSTANCE);
458+
Criteria criteria = Criteria.where("state").isTrue();
459+
460+
BoundCondition bindings = map(criteria);
461+
462+
assertThat(bindings.getCondition()).hasToString("person.state = ?[$1]");
463+
assertThat(bindings.getBindings().iterator().next().getValue()).isEqualTo((byte) 1);
464+
}
465+
430466
private BoundCondition map(Criteria criteria) {
431467

432468
BindMarkersFactory markers = BindMarkersFactory.indexed("$", 1);
433469

434470
return mapper.getMappedObject(markers.create(), criteria, Table.create("person"),
435-
context.getRequiredPersistentEntity(Person.class));
471+
mapper.getMappingContext().getRequiredPersistentEntity(Person.class));
436472
}
437473

438474
static class Person {
439475

440476
String name;
441477
@Column("another_name") String alternative;
442478
MyEnum enumValue;
479+
480+
boolean state;
443481
}
444482

445483
enum MyEnum {

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

+2-2
Original file line numberDiff line numberDiff line change
@@ -781,12 +781,12 @@ public Criteria isNotNull() {
781781

782782
@Override
783783
public Criteria isTrue() {
784-
return createCriteria(Comparator.IS_TRUE, null);
784+
return createCriteria(Comparator.IS_TRUE, true);
785785
}
786786

787787
@Override
788788
public Criteria isFalse() {
789-
return createCriteria(Comparator.IS_FALSE, null);
789+
return createCriteria(Comparator.IS_FALSE, false);
790790
}
791791

792792
protected Criteria createCriteria(Comparator comparator, @Nullable Object value) {

spring-data-relational/src/test/java/org/springframework/data/relational/core/query/CriteriaUnitTests.java

+2
Original file line numberDiff line numberDiff line change
@@ -285,6 +285,7 @@ public void shouldBuildIsTrueCriteria() {
285285

286286
assertThat(criteria.getColumn()).isEqualTo(SqlIdentifier.unquoted("foo"));
287287
assertThat(criteria.getComparator()).isEqualTo(CriteriaDefinition.Comparator.IS_TRUE);
288+
assertThat(criteria.getValue()).isEqualTo(true);
288289
}
289290

290291
@Test // DATAJDBC-513
@@ -294,5 +295,6 @@ public void shouldBuildIsFalseCriteria() {
294295

295296
assertThat(criteria.getColumn()).isEqualTo(SqlIdentifier.unquoted("foo"));
296297
assertThat(criteria.getComparator()).isEqualTo(CriteriaDefinition.Comparator.IS_FALSE);
298+
assertThat(criteria.getValue()).isEqualTo(false);
297299
}
298300
}

0 commit comments

Comments
 (0)