From b93bd07a3a92361d5354b29223313d38889ce66f Mon Sep 17 00:00:00 2001 From: Taylor Date: Sun, 24 Mar 2019 13:59:50 -0700 Subject: [PATCH] DATAES-552 - @Query annotation fail when passing over 10 parameters Updated the replacePlaceholders methods to use replaceFirst to prevent duplication substitutions. Original Pull Request: #267 --- .../query/ElasticsearchStringQuery.java | 4 +++- .../ReactiveElasticsearchStringQuery.java | 4 +++- ...ctiveElasticsearchStringQueryUnitTests.java | 18 ++++++++++++++++++ 3 files changed, 24 insertions(+), 2 deletions(-) diff --git a/src/main/java/org/springframework/data/elasticsearch/repository/query/ElasticsearchStringQuery.java b/src/main/java/org/springframework/data/elasticsearch/repository/query/ElasticsearchStringQuery.java index 1712bd1be..c0e33c97e 100644 --- a/src/main/java/org/springframework/data/elasticsearch/repository/query/ElasticsearchStringQuery.java +++ b/src/main/java/org/springframework/data/elasticsearch/repository/query/ElasticsearchStringQuery.java @@ -32,6 +32,7 @@ import org.springframework.util.Assert; * @author Rizwan Idrees * @author Mohsin Husen * @author Mark Paluch + * @author Taylor Ono */ public class ElasticsearchStringQuery extends AbstractElasticsearchRepositoryQuery { @@ -86,8 +87,9 @@ public class ElasticsearchStringQuery extends AbstractElasticsearchRepositoryQue String result = input; while (matcher.find()) { String group = matcher.group(); + group = "\\" + group; int index = Integer.parseInt(matcher.group(1)); - result = result.replace(group, getParameterWithIndex(accessor, index)); + result = result.replaceFirst(group, getParameterWithIndex(accessor, index)); } return result; } diff --git a/src/main/java/org/springframework/data/elasticsearch/repository/query/ReactiveElasticsearchStringQuery.java b/src/main/java/org/springframework/data/elasticsearch/repository/query/ReactiveElasticsearchStringQuery.java index 71a57d674..1d177c54f 100644 --- a/src/main/java/org/springframework/data/elasticsearch/repository/query/ReactiveElasticsearchStringQuery.java +++ b/src/main/java/org/springframework/data/elasticsearch/repository/query/ReactiveElasticsearchStringQuery.java @@ -26,6 +26,7 @@ import org.springframework.util.ObjectUtils; /** * @author Christoph Strobl + * @author Taylor Ono * @since 3.2 */ public class ReactiveElasticsearchStringQuery extends AbstractReactiveElasticsearchRepositoryQuery { @@ -60,8 +61,9 @@ public class ReactiveElasticsearchStringQuery extends AbstractReactiveElasticsea String result = input; while (matcher.find()) { String group = matcher.group(); + group = "\\" + group; int index = Integer.parseInt(matcher.group(1)); - result = result.replace(group, getParameterWithIndex(accessor, index)); + result = result.replaceFirst(group, getParameterWithIndex(accessor, index)); } return result; } diff --git a/src/test/java/org/springframework/data/elasticsearch/repository/query/ReactiveElasticsearchStringQueryUnitTests.java b/src/test/java/org/springframework/data/elasticsearch/repository/query/ReactiveElasticsearchStringQueryUnitTests.java index b3fee8007..4e40d84e7 100644 --- a/src/test/java/org/springframework/data/elasticsearch/repository/query/ReactiveElasticsearchStringQueryUnitTests.java +++ b/src/test/java/org/springframework/data/elasticsearch/repository/query/ReactiveElasticsearchStringQueryUnitTests.java @@ -87,6 +87,20 @@ public class ReactiveElasticsearchStringQueryUnitTests { assertThat(((StringQuery) query).getSource()).isEqualTo(reference.getSource()); } + @Test // DATAES-552 + public void shouldReplaceLotsOfParametersCorrectly() throws Exception { + + ReactiveElasticsearchStringQuery elasticsearchStringQuery = createQueryForMethod("findWithQuiteSomeParameters", + String.class, String.class, String.class, String.class, String.class, String.class, String.class, String.class, + String.class, String.class, String.class, String.class); + StubParameterAccessor accesor = new StubParameterAccessor("a", "b", "c", "d", "e", "f", "g", "h", "i", "j", "k", + "l"); + org.springframework.data.elasticsearch.core.query.Query query = elasticsearchStringQuery.createQuery(accesor); + StringQuery reference = new StringQuery("name:(a, b, c, d, e, f, g, h, i, j, k, l)"); + assertThat(query).isInstanceOf(StringQuery.class); + assertThat(((StringQuery) query).getSource()).isEqualTo(reference.getSource()); + } + private ReactiveElasticsearchStringQuery createQueryForMethod(String name, Class... parameters) throws Exception { Method method = SampleRepository.class.getMethod(name, parameters); @@ -104,5 +118,9 @@ public class ReactiveElasticsearchStringQueryUnitTests { @Query("{ 'bool' : { 'must' : { 'term' : { 'name' : '?#{[0]}' } } } }") Flux findByNameWithExpression(String param0); + + @Query(value = "name:(?0, ?1, ?2, ?3, ?4, ?5, ?6, ?7, ?8, ?9, ?10, ?11)") + Person findWithQuiteSomeParameters(String arg0, String arg1, String arg2, String arg3, String arg4, String arg5, + String arg6, String arg7, String arg8, String arg9, String arg10, String arg11); } }