Skip to content

Commit aa4aeca

Browse files
diamondTsothawo
authored andcommitted
Fix handling of array-of-strings parameters for @Query-annotated queries.
Original Pull Request #2182 Closes #2135 (cherry picked from commit 259c43a)
1 parent 85ed8a4 commit aa4aeca

File tree

4 files changed

+225
-170
lines changed

4 files changed

+225
-170
lines changed

src/main/java/org/springframework/data/elasticsearch/repository/query/AbstractReactiveElasticsearchRepositoryQuery.java

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -82,8 +82,7 @@ private Object execute(ElasticsearchParameterAccessor parameterAccessor) {
8282

8383
ResultProcessor processor = queryMethod.getResultProcessor().withDynamicProjection(parameterAccessor);
8484

85-
Query query = createQuery(
86-
new ConvertingParameterAccessor(elasticsearchOperations.getElasticsearchConverter(), parameterAccessor));
85+
Query query = createQuery(parameterAccessor);
8786

8887
if (queryMethod.hasAnnotatedHighlight()) {
8988
query.setHighlightQuery(queryMethod.getAnnotatedHighlightQuery());

src/main/java/org/springframework/data/elasticsearch/repository/query/ConvertingParameterAccessor.java

Lines changed: 0 additions & 95 deletions
This file was deleted.

src/test/java/org/springframework/data/elasticsearch/repository/query/ReactiveElasticsearchStringQueryUnitTests.java

Lines changed: 45 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -144,10 +144,37 @@ void shouldUseConverterOnParameters() throws Exception {
144144
.isEqualTo("{ 'bool' : { 'must' : { 'term' : { 'car' : 'Toyota-Prius' } } } }");
145145
}
146146

147+
@Test // #2135
148+
@DisplayName("should handle array-of-strings parameters correctly")
149+
void shouldHandleArrayOfStringsParametersCorrectly() throws Exception {
150+
151+
List<String> otherNames = Arrays.asList("Wesley", "Emmett");
152+
153+
org.springframework.data.elasticsearch.core.query.Query query = createQuery("findByOtherNames", otherNames);
154+
155+
assertThat(query).isInstanceOf(StringQuery.class);
156+
assertThat(((StringQuery) query).getSource())
157+
.isEqualTo("{ 'bool' : { 'must' : { 'terms' : { 'otherNames' : [\"Wesley\",\"Emmett\"] } } } }");
158+
}
159+
160+
@Test // #2135
161+
@DisplayName("should handle array-of-Integers parameters correctly")
162+
void shouldHandleArrayOfIntegerParametersCorrectly() throws Exception {
163+
164+
List<Integer> ages = Arrays.asList(42, 57);
165+
166+
org.springframework.data.elasticsearch.core.query.Query query = createQuery("findByAges", ages);
167+
168+
assertThat(query).isInstanceOf(StringQuery.class);
169+
assertThat(((StringQuery) query).getSource())
170+
.isEqualTo("{ 'bool' : { 'must' : { 'terms' : { 'ages' : [42,57] } } } }");
171+
}
172+
147173
private org.springframework.data.elasticsearch.core.query.Query createQuery(String methodName, Object... args)
148174
throws NoSuchMethodException {
149175

150-
Class<?>[] argTypes = Arrays.stream(args).map(Object::getClass).toArray(Class[]::new);
176+
Class<?>[] argTypes = Arrays.stream(args).map(Object::getClass)
177+
.map(clazz -> Collection.class.isAssignableFrom(clazz) ? List.class : clazz).toArray(Class[]::new);
151178
ReactiveElasticsearchQueryMethod queryMethod = getQueryMethod(methodName, argTypes);
152179
ReactiveElasticsearchStringQuery elasticsearchStringQuery = queryForMethod(queryMethod);
153180

@@ -195,6 +222,12 @@ Person findWithRepeatedPlaceholder(String arg0, String arg1, String arg2, String
195222
@Query("{ 'bool' : { 'must' : { 'term' : { 'car' : '?0' } } } }")
196223
Mono<Person> findByCar(Car car);
197224

225+
@Query("{ 'bool' : { 'must' : { 'terms' : { 'otherNames' : ?0 } } } }")
226+
Flux<Person> findByOtherNames(List<String> otherNames);
227+
228+
@Query("{ 'bool' : { 'must' : { 'terms' : { 'ages' : ?0 } } } }")
229+
Flux<Person> findByAges(List<Integer> ages);
230+
198231
}
199232

200233
/**
@@ -211,6 +244,8 @@ public class Person {
211244

212245
@Nullable private String name;
213246

247+
@Nullable private List<String> otherNames;
248+
214249
@Nullable
215250
@Field(type = FieldType.Nested) private List<Car> car;
216251

@@ -235,6 +270,15 @@ public void setName(String name) {
235270
this.name = name;
236271
}
237272

273+
@Nullable
274+
public List<String> getOtherNames() {
275+
return otherNames;
276+
}
277+
278+
public void setOtherNames(List<String> otherNames) {
279+
this.otherNames = otherNames;
280+
}
281+
238282
@Nullable
239283
public List<Car> getCar() {
240284
return car;

0 commit comments

Comments
 (0)