Browse Source

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
pull/1209/head
Mark Paluch 4 years ago committed by Jens Schauder
parent
commit
05e96557bd
No known key found for this signature in database
GPG Key ID: 45CC872F17423DBF
  1. 6
      spring-data-jdbc/src/main/java/org/springframework/data/jdbc/repository/query/QueryMapper.java
  2. 58
      spring-data-r2dbc/src/test/java/org/springframework/data/r2dbc/query/QueryMapperUnitTests.java
  3. 4
      spring-data-relational/src/main/java/org/springframework/data/relational/core/query/Criteria.java
  4. 2
      spring-data-relational/src/test/java/org/springframework/data/relational/core/query/CriteriaUnitTests.java

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

@ -494,13 +494,15 @@ class QueryMapper {
if (comparator == Comparator.IS_TRUE) { if (comparator == Comparator.IS_TRUE) {
Expression bind = bindBoolean(column, parameterSource, true); Expression bind = bindBoolean(column, parameterSource,
mappedValue instanceof Boolean ? (Boolean) mappedValue : true);
return column.isEqualTo(bind); return column.isEqualTo(bind);
} }
if (comparator == Comparator.IS_FALSE) { if (comparator == Comparator.IS_FALSE) {
Expression bind = bindBoolean(column, parameterSource, false); Expression bind = bindBoolean(column, parameterSource,
mappedValue instanceof Boolean ? (Boolean) mappedValue : false);
return column.isEqualTo(bind); return column.isEqualTo(bind);
} }

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

@ -26,7 +26,10 @@ import org.junit.jupiter.api.Test;
import org.springframework.data.domain.Sort; import org.springframework.data.domain.Sort;
import org.springframework.data.r2dbc.convert.MappingR2dbcConverter; import org.springframework.data.r2dbc.convert.MappingR2dbcConverter;
import org.springframework.data.r2dbc.convert.R2dbcConverter; import org.springframework.data.r2dbc.convert.R2dbcConverter;
import org.springframework.data.r2dbc.convert.R2dbcCustomConversions;
import org.springframework.data.r2dbc.dialect.MySqlDialect;
import org.springframework.data.r2dbc.dialect.PostgresDialect; import org.springframework.data.r2dbc.dialect.PostgresDialect;
import org.springframework.data.r2dbc.dialect.R2dbcDialect;
import org.springframework.data.r2dbc.mapping.R2dbcMappingContext; import org.springframework.data.r2dbc.mapping.R2dbcMappingContext;
import org.springframework.data.relational.core.mapping.Column; import org.springframework.data.relational.core.mapping.Column;
import org.springframework.data.relational.core.query.Criteria; import org.springframework.data.relational.core.query.Criteria;
@ -45,11 +48,21 @@ import org.springframework.r2dbc.core.binding.BindTarget;
*/ */
class QueryMapperUnitTests { class QueryMapperUnitTests {
private R2dbcMappingContext context = new R2dbcMappingContext();
private R2dbcConverter converter = new MappingR2dbcConverter(context);
private QueryMapper mapper = new QueryMapper(PostgresDialect.INSTANCE, converter);
private BindTarget bindTarget = mock(BindTarget.class); private BindTarget bindTarget = mock(BindTarget.class);
private QueryMapper mapper = createMapper(PostgresDialect.INSTANCE);
QueryMapper createMapper(R2dbcDialect dialect) {
R2dbcCustomConversions conversions = R2dbcCustomConversions.of(dialect);
R2dbcMappingContext context = new R2dbcMappingContext();
context.setSimpleTypeHolder(conversions.getSimpleTypeHolder());
context.afterPropertiesSet();
R2dbcConverter converter = new MappingR2dbcConverter(context, conversions);
return new QueryMapper(dialect, converter);
}
@Test // gh-289 @Test // gh-289
void shouldNotMapEmptyCriteria() { void shouldNotMapEmptyCriteria() {
@ -189,7 +202,7 @@ class QueryMapperUnitTests {
Table table = Table.create("my_table").as("my_aliased_table"); Table table = Table.create("my_table").as("my_aliased_table");
Expression mappedObject = mapper.getMappedObject(table.column("alternative").as("my_aliased_col"), Expression mappedObject = mapper.getMappedObject(table.column("alternative").as("my_aliased_col"),
context.getRequiredPersistentEntity(Person.class)); mapper.getMappingContext().getRequiredPersistentEntity(Person.class));
assertThat(mappedObject).hasToString("my_aliased_table.another_name AS my_aliased_col"); assertThat(mappedObject).hasToString("my_aliased_table.another_name AS my_aliased_col");
} }
@ -200,7 +213,7 @@ class QueryMapperUnitTests {
Table table = Table.create("my_table").as("my_aliased_table"); Table table = Table.create("my_table").as("my_aliased_table");
Expression mappedObject = mapper.getMappedObject(Functions.count(table.column("alternative")), Expression mappedObject = mapper.getMappedObject(Functions.count(table.column("alternative")),
context.getRequiredPersistentEntity(Person.class)); mapper.getMappingContext().getRequiredPersistentEntity(Person.class));
assertThat(mappedObject).hasToString("COUNT(my_aliased_table.another_name)"); assertThat(mappedObject).hasToString("COUNT(my_aliased_table.another_name)");
} }
@ -211,7 +224,7 @@ class QueryMapperUnitTests {
Table table = Table.create("my_table").as("my_aliased_table"); Table table = Table.create("my_table").as("my_aliased_table");
Expression mappedObject = mapper.getMappedObject(table.column("unknown").as("my_aliased_col"), Expression mappedObject = mapper.getMappedObject(table.column("unknown").as("my_aliased_col"),
context.getRequiredPersistentEntity(Person.class)); mapper.getMappingContext().getRequiredPersistentEntity(Person.class));
assertThat(mappedObject).hasToString("my_aliased_table.unknown AS my_aliased_col"); assertThat(mappedObject).hasToString("my_aliased_table.unknown AS my_aliased_col");
} }
@ -392,7 +405,7 @@ class QueryMapperUnitTests {
Sort sort = Sort.by(desc("alternative")); Sort sort = Sort.by(desc("alternative"));
Sort mapped = mapper.getMappedObject(sort, context.getRequiredPersistentEntity(Person.class)); Sort mapped = mapper.getMappedObject(sort, mapper.getMappingContext().getRequiredPersistentEntity(Person.class));
assertThat(mapped.getOrderFor("another_name")).isEqualTo(desc("another_name")); assertThat(mapped.getOrderFor("another_name")).isEqualTo(desc("another_name"));
assertThat(mapped.getOrderFor("alternative")).isNull(); assertThat(mapped.getOrderFor("alternative")).isNull();
@ -403,7 +416,7 @@ class QueryMapperUnitTests {
Sort sort = Sort.by(desc("alternative_name")); Sort sort = Sort.by(desc("alternative_name"));
Sort mapped = mapper.getMappedObject(sort, context.getRequiredPersistentEntity(Person.class)); Sort mapped = mapper.getMappedObject(sort, mapper.getMappingContext().getRequiredPersistentEntity(Person.class));
assertThat(mapped.getOrderFor("alternative_name")).isEqualTo(desc("alternative_name")); assertThat(mapped.getOrderFor("alternative_name")).isEqualTo(desc("alternative_name"));
} }
@ -427,12 +440,35 @@ class QueryMapperUnitTests {
assertThat(bindings.getCondition()).hasToString("person.enum_value IN (?[$1], ?[$2])"); assertThat(bindings.getCondition()).hasToString("person.enum_value IN (?[$1], ?[$2])");
} }
@Test // gh-733
void shouldMapBooleanConditionProperly() {
Criteria criteria = Criteria.where("state").isFalse();
BoundCondition bindings = map(criteria);
assertThat(bindings.getCondition()).hasToString("person.state = ?[$1]");
assertThat(bindings.getBindings().iterator().next().getValue()).isEqualTo(false);
}
@Test // gh-733
void shouldMapAndConvertBooleanConditionProperly() {
mapper = createMapper(MySqlDialect.INSTANCE);
Criteria criteria = Criteria.where("state").isTrue();
BoundCondition bindings = map(criteria);
assertThat(bindings.getCondition()).hasToString("person.state = ?[$1]");
assertThat(bindings.getBindings().iterator().next().getValue()).isEqualTo((byte) 1);
}
private BoundCondition map(Criteria criteria) { private BoundCondition map(Criteria criteria) {
BindMarkersFactory markers = BindMarkersFactory.indexed("$", 1); BindMarkersFactory markers = BindMarkersFactory.indexed("$", 1);
return mapper.getMappedObject(markers.create(), criteria, Table.create("person"), return mapper.getMappedObject(markers.create(), criteria, Table.create("person"),
context.getRequiredPersistentEntity(Person.class)); mapper.getMappingContext().getRequiredPersistentEntity(Person.class));
} }
static class Person { static class Person {
@ -440,6 +476,8 @@ class QueryMapperUnitTests {
String name; String name;
@Column("another_name") String alternative; @Column("another_name") String alternative;
MyEnum enumValue; MyEnum enumValue;
boolean state;
} }
enum MyEnum { enum MyEnum {

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

@ -781,12 +781,12 @@ public class Criteria implements CriteriaDefinition {
@Override @Override
public Criteria isTrue() { public Criteria isTrue() {
return createCriteria(Comparator.IS_TRUE, null); return createCriteria(Comparator.IS_TRUE, true);
} }
@Override @Override
public Criteria isFalse() { public Criteria isFalse() {
return createCriteria(Comparator.IS_FALSE, null); return createCriteria(Comparator.IS_FALSE, false);
} }
protected Criteria createCriteria(Comparator comparator, @Nullable Object value) { protected Criteria createCriteria(Comparator comparator, @Nullable Object value) {

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

@ -285,6 +285,7 @@ public class CriteriaUnitTests {
assertThat(criteria.getColumn()).isEqualTo(SqlIdentifier.unquoted("foo")); assertThat(criteria.getColumn()).isEqualTo(SqlIdentifier.unquoted("foo"));
assertThat(criteria.getComparator()).isEqualTo(CriteriaDefinition.Comparator.IS_TRUE); assertThat(criteria.getComparator()).isEqualTo(CriteriaDefinition.Comparator.IS_TRUE);
assertThat(criteria.getValue()).isEqualTo(true);
} }
@Test // DATAJDBC-513 @Test // DATAJDBC-513
@ -294,5 +295,6 @@ public class CriteriaUnitTests {
assertThat(criteria.getColumn()).isEqualTo(SqlIdentifier.unquoted("foo")); assertThat(criteria.getColumn()).isEqualTo(SqlIdentifier.unquoted("foo"));
assertThat(criteria.getComparator()).isEqualTo(CriteriaDefinition.Comparator.IS_FALSE); assertThat(criteria.getComparator()).isEqualTo(CriteriaDefinition.Comparator.IS_FALSE);
assertThat(criteria.getValue()).isEqualTo(false);
} }
} }

Loading…
Cancel
Save