From 11056be292be0c43a075f22cd307109b96106e8a Mon Sep 17 00:00:00 2001 From: Christoph Strobl Date: Mon, 20 Jul 2015 10:36:16 +0200 Subject: [PATCH] DATACMNS-734 - Allow comma separated list of values to be bound to an array. We now convert comma separated values for an array property by splitting values and converting each of them. This allows to convert address.location=40.740337,-73.995146 to class Address { Double[] location; } --- .../binding/QuerydslPredicateBuilder.java | 7 ++-- .../data/querydsl/Address.java | 1 + .../QuerydslPredicateBuilderUnitTests.java | 40 +++++++++++++++++-- 3 files changed, 41 insertions(+), 7 deletions(-) diff --git a/src/main/java/org/springframework/data/querydsl/binding/QuerydslPredicateBuilder.java b/src/main/java/org/springframework/data/querydsl/binding/QuerydslPredicateBuilder.java index 9175963d6..1b7c6325a 100644 --- a/src/main/java/org/springframework/data/querydsl/binding/QuerydslPredicateBuilder.java +++ b/src/main/java/org/springframework/data/querydsl/binding/QuerydslPredicateBuilder.java @@ -191,7 +191,8 @@ public class QuerydslPredicateBuilder { */ private Collection convertToPropertyPathSpecificType(List source, PropertyPath path) { - Class targetType = path.getLeafProperty().getType(); + Class targetType = path.getLeafProperty().getOwningType().getProperty(path.getLeafProperty().getSegment()) + .getType(); if (source.isEmpty() || isSingleElementCollectionWithoutText(source)) { return Collections.emptyList(); @@ -201,8 +202,8 @@ public class QuerydslPredicateBuilder { for (String value : source) { - target.add(conversionService.canConvert(value.getClass(), targetType) - ? conversionService.convert(value, targetType) : value); + target.add(conversionService.canConvert(String.class, targetType) ? conversionService.convert( + targetType.isArray() ? value.split(",") : value, targetType) : value); } return target; diff --git a/src/test/java/org/springframework/data/querydsl/Address.java b/src/test/java/org/springframework/data/querydsl/Address.java index 703bfabcf..60ce4510c 100644 --- a/src/test/java/org/springframework/data/querydsl/Address.java +++ b/src/test/java/org/springframework/data/querydsl/Address.java @@ -24,6 +24,7 @@ import com.mysema.query.annotations.QueryEntity; public class Address { public String street, city; + public Double[] lonLat; public Address(String street, String city) { this.street = street; diff --git a/src/test/java/org/springframework/data/querydsl/binding/QuerydslPredicateBuilderUnitTests.java b/src/test/java/org/springframework/data/querydsl/binding/QuerydslPredicateBuilderUnitTests.java index 87b5be713..a12721d17 100644 --- a/src/test/java/org/springframework/data/querydsl/binding/QuerydslPredicateBuilderUnitTests.java +++ b/src/test/java/org/springframework/data/querydsl/binding/QuerydslPredicateBuilderUnitTests.java @@ -16,8 +16,8 @@ package org.springframework.data.querydsl.binding; import static org.hamcrest.Matchers.*; -import static org.hamcrest.core.Is.is; import static org.junit.Assert.*; +import static org.springframework.test.util.ReflectionTestUtils.*; import java.util.List; @@ -28,14 +28,12 @@ import org.springframework.data.querydsl.QUser; import org.springframework.data.querydsl.SimpleEntityPathResolver; import org.springframework.data.querydsl.User; import org.springframework.data.querydsl.Users; -import org.springframework.data.querydsl.binding.QuerydslBindings; -import org.springframework.data.querydsl.binding.QuerydslPredicateBuilder; -import org.springframework.data.querydsl.binding.SingleValueBinding; import org.springframework.data.util.ClassTypeInformation; import org.springframework.util.LinkedMultiValueMap; import org.springframework.util.MultiValueMap; import com.mysema.query.collections.CollQueryFactory; +import com.mysema.query.types.Constant; import com.mysema.query.types.Predicate; import com.mysema.query.types.path.StringPath; @@ -153,4 +151,38 @@ public class QuerydslPredicateBuilderUnitTests { builder.getPredicate(USER_TYPE, values, bindings); } + + /** + * @see DATACMNS-734 + */ + @Test + @SuppressWarnings("unchecked") + public void resolvesCommaSeparatedArgumentToArrayCorrectly() { + + values.add("address.lonLat", "40.740337,-73.995146"); + + Predicate predicate = builder.getPredicate(USER_TYPE, values, DEFAULT_BINDINGS); + + Constant constant = (Constant) ((List) getField(getField(predicate, "mixin"), "args")).get(1); + + assertThat(constant.getConstant(), instanceOf(Double[].class)); + assertThat((Double[]) (constant.getConstant()), arrayContaining(40.740337D, -73.995146D)); + } + + /** + * @see DATACMNS-734 + */ + @Test + @SuppressWarnings("unchecked") + public void leavesCommaSeparatedArgumentUntouchedWhenTargetIsNotAnArray() { + + values.add("address.city", "rivers,two"); + + Predicate predicate = builder.getPredicate(USER_TYPE, values, DEFAULT_BINDINGS); + + Constant constant = (Constant) ((List) getField(getField(predicate, "mixin"), "args")).get(1); + + assertThat(constant.getConstant(), instanceOf(String.class)); + assertThat((String) (constant.getConstant()), equalTo("rivers,two")); + } }