From 89e26253ccab06e9c92cebea030a2f2d9d6cca4b Mon Sep 17 00:00:00 2001 From: Mark Paluch Date: Tue, 28 Jun 2022 09:36:45 +0200 Subject: [PATCH 1/2] Prepare issue branch. --- pom.xml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/pom.xml b/pom.xml index 2f40cd66af..93ed9ff397 100644 --- a/pom.xml +++ b/pom.xml @@ -5,7 +5,7 @@ org.springframework.data spring-data-commons - 3.0.0-SNAPSHOT + 3.0.0-GH-2649-SNAPSHOT Spring Data Core Core Spring concepts underpinning every Spring Data module. @@ -169,7 +169,7 @@ ${vavr} true - + From 19c60fda9568749b2594b1fda079f3809bf48848 Mon Sep 17 00:00:00 2001 From: Mark Paluch Date: Tue, 28 Jun 2022 10:00:27 +0200 Subject: [PATCH 2/2] Fix argument conversion in `QuerydslPredicateBuilder`. We now consider the correct argument type instead of checking assignability of the actual property type against the input value. Closes #2649 --- .../binding/QuerydslPredicateBuilder.java | 13 ++++++------- .../QuerydslPredicateBuilderUnitTests.java | 15 ++++++++++++++- 2 files changed, 20 insertions(+), 8 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 a9811b6314..208f178e11 100644 --- a/src/main/java/org/springframework/data/querydsl/binding/QuerydslPredicateBuilder.java +++ b/src/main/java/org/springframework/data/querydsl/binding/QuerydslPredicateBuilder.java @@ -175,30 +175,29 @@ private Path getPath(PathInformation path, QuerydslBindings bindings) { */ private Collection convertToPropertyPathSpecificType(List source, PathInformation path) { - Class targetType = path.getLeafType(); - if (source.isEmpty() || isSingleElementCollectionWithEmptyItem(source)) { return Collections.emptyList(); } + TypeDescriptor targetType = getTargetTypeDescriptor(path); Collection target = new ArrayList<>(source.size()); for (Object value : source) { - target.add(getValue(path, targetType, value)); + target.add(getValue(targetType, value)); } return target; } @Nullable - private Object getValue(PathInformation path, Class targetType, Object value) { + private Object getValue(TypeDescriptor targetType, Object value) { - if (ClassUtils.isAssignableValue(targetType, value)) { + if (ClassUtils.isAssignableValue(targetType.getType(), value)) { return value; } - if (conversionService.canConvert(value.getClass(), targetType)) { - return conversionService.convert(value, TypeDescriptor.forObject(value), getTargetTypeDescriptor(path)); + if (conversionService.canConvert(value.getClass(), targetType.getType())) { + return conversionService.convert(value, TypeDescriptor.forObject(value), targetType); } return value; 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 be48982f02..de2431b9d3 100755 --- a/src/test/java/org/springframework/data/querydsl/binding/QuerydslPredicateBuilderUnitTests.java +++ b/src/test/java/org/springframework/data/querydsl/binding/QuerydslPredicateBuilderUnitTests.java @@ -19,10 +19,12 @@ import static org.assertj.core.api.Assumptions.*; import static org.springframework.test.util.ReflectionTestUtils.*; +import java.util.Arrays; import java.util.List; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; + import org.springframework.data.querydsl.Address; import org.springframework.data.querydsl.QSpecialUser; import org.springframework.data.querydsl.QUser; @@ -31,7 +33,6 @@ import org.springframework.data.querydsl.User; import org.springframework.data.querydsl.UserWrapper; import org.springframework.data.querydsl.Users; -// import org.springframework.data.util.ClassTypeInformation; import org.springframework.data.util.TypeInformation; import org.springframework.data.util.Version; import org.springframework.format.support.DefaultFormattingConversionService; @@ -181,6 +182,18 @@ void leavesCommaSeparatedArgumentUntouchedWhenTargetIsNotAnArray() { assertThat(constant.getConstant()).isEqualTo("rivers,two"); } + @Test + void resolvesCommaSeparatedArgumentToListCorrectly() { + + values.add("nickNames", "Walt,Heisenberg"); + + var predicate = builder.getPredicate(USER_TYPE, values, DEFAULT_BINDINGS); + + var constant = (Constant) ((List) getField(getField(predicate, "mixin"), "args")).get(0); + + assertThat(constant.getConstant()).isEqualTo(Arrays.asList("Walt", "Heisenberg")); + } + @Test // DATACMNS-883 void automaticallyInsertsAnyStepInCollectionReference() {