Skip to content

Commit 4949e40

Browse files
committed
Fix searchMsearchRequest to use Min(size, maxResults) as actual pageSize.
See spring-projects#3089
1 parent 0a0bff8 commit 4949e40

File tree

2 files changed

+88
-5
lines changed

2 files changed

+88
-5
lines changed

src/main/java/org/springframework/data/elasticsearch/client/elc/RequestConverter.java

+4-2
Original file line numberDiff line numberDiff line change
@@ -1311,8 +1311,10 @@ public MsearchRequest searchMsearchRequest(
13111311
bb.storedFields(query.getStoredFields());
13121312
}
13131313

1314-
if (query.isLimiting()) {
1315-
bb.size(query.getMaxResults());
1314+
var maxResults = query.getMaxResults();
1315+
if (query.isLimiting() && maxResults != null) {
1316+
var pageSize = Math.min(maxResults, query.getPageable().getPageSize());
1317+
bb.size(pageSize);
13161318
}
13171319

13181320
if (query.getMinScore() > 0) {

src/test/java/org/springframework/data/elasticsearch/client/elc/RequestConverterTest.java

+84-3
Original file line numberDiff line numberDiff line change
@@ -92,7 +92,7 @@ void refreshSetByDeleteRequest() {
9292
}
9393

9494
@Test // #3089
95-
@DisplayName("When maxResults is set (size < maxResults), pageSize should be the minimum of maxResults and pageable size")
95+
@DisplayName("searchRequest() - When maxResults is set (size < maxResults), pageSize should be the minimum of maxResults and pageable size")
9696
void searchRequestPageSizeSmallerThanMaxResults() {
9797
var size = 123;
9898
var maxResults = size * 12;
@@ -114,7 +114,7 @@ void searchRequestPageSizeSmallerThanMaxResults() {
114114
}
115115

116116
@Test // #3089
117-
@DisplayName("When maxResults is set (size == maxResults), pageSize should be equal to maxResults and pageable size")
117+
@DisplayName("searchRequest() - When maxResults is set (size == maxResults), pageSize should be equal to maxResults and pageable size")
118118
void searchRequestPageSizeEqualToMaxResults() {
119119
var pageSize = 123;
120120
var maxResults = pageSize;
@@ -136,7 +136,7 @@ void searchRequestPageSizeEqualToMaxResults() {
136136
}
137137

138138
@Test // #3089
139-
@DisplayName("When maxResults is set (size > maxResults), pageSize should be the minimum of maxResults and pageable size")
139+
@DisplayName("searchRequest() - When maxResults is set (size > maxResults), pageSize should be the minimum of maxResults and pageable size")
140140
void searchRequestPageSizeLargerThanMaxResults() {
141141
var pageSize = 123;
142142
var maxResults = 99;
@@ -157,6 +157,87 @@ void searchRequestPageSizeLargerThanMaxResults() {
157157
assertThat(actualPageSize).isEqualTo(maxResults);
158158
}
159159

160+
@Test // #3089
161+
@DisplayName("searchMsearchRequest() - When maxResults is set (size < maxResults), pageSize should be the minimum of maxResults and pageable size")
162+
void msearchRequestPageSizeSmallerThanMaxResults() {
163+
var size = 100;
164+
var maxResults = 150;
165+
166+
var query = StringQuery.builder("""
167+
{
168+
"match_all":{}
169+
}
170+
""")
171+
.withPageable(Pageable.ofSize(size))
172+
.withMaxResults(maxResults)
173+
.build();
174+
175+
var multiSearchQueryParameter = new ElasticsearchTemplate.MultiSearchQueryParameter(query, SampleEntity.class, IndexCoordinates.of("foo"));
176+
var multiSearchQueryParameters = List.of(multiSearchQueryParameter);
177+
178+
var msearchRequest = requestConverter.searchMsearchRequest(multiSearchQueryParameters, null);
179+
180+
var searchBody = msearchRequest.searches().get(0).body();
181+
var actualPageSize = searchBody.size();
182+
183+
assertThat(actualPageSize).isEqualTo(size);
184+
assertThat(actualPageSize).isNotEqualTo(maxResults);
185+
}
186+
187+
@Test // #3089
188+
@DisplayName("searchMsearchRequest() - When maxResults is set (size == maxResults), pageSize should be equal to maxResults and pageable size")
189+
void msearchRequestPageSizeEqualToMaxResults() {
190+
var size = 150;
191+
var maxResults = size;
192+
193+
var query = StringQuery.builder("""
194+
{
195+
"match_all":{}
196+
}
197+
""")
198+
.withPageable(Pageable.ofSize(size))
199+
.withMaxResults(maxResults)
200+
.build();
201+
202+
var multiSearchQueryParameter = new ElasticsearchTemplate.MultiSearchQueryParameter(query, SampleEntity.class, IndexCoordinates.of("foo"));
203+
var multiSearchQueryParameters = List.of(multiSearchQueryParameter);
204+
205+
var msearchRequest = requestConverter.searchMsearchRequest(multiSearchQueryParameters, null);
206+
207+
var searchBody = msearchRequest.searches().get(0).body();
208+
var actualPageSize = searchBody.size();
209+
210+
assertThat(actualPageSize).isEqualTo(size);
211+
assertThat(actualPageSize).isEqualTo(maxResults);
212+
}
213+
214+
@Test // #3089
215+
@DisplayName("searchMsearchRequest() - When maxResults is set (size > maxResults), pageSize should be the minimum of maxResults and pageable size")
216+
void msearchRequestPageSizeLargerThanMaxResults() {
217+
var size = 200;
218+
var maxResults = 150;
219+
220+
var query = StringQuery.builder("""
221+
{
222+
"match_all":{}
223+
}
224+
""")
225+
.withPageable(Pageable.ofSize(size))
226+
.withMaxResults(maxResults)
227+
.build();
228+
229+
var multiSearchQueryParameter = new ElasticsearchTemplate.MultiSearchQueryParameter(query, SampleEntity.class, IndexCoordinates.of("foo"));
230+
var multiSearchQueryParameters = List.of(multiSearchQueryParameter);
231+
232+
var msearchRequest = requestConverter.searchMsearchRequest(multiSearchQueryParameters, null);
233+
234+
var searchBody = msearchRequest.searches().get(0).body();
235+
var actualPageSize = searchBody.size();
236+
237+
assertThat(actualPageSize).isNotEqualTo(size);
238+
assertThat(actualPageSize).isEqualTo(maxResults);
239+
}
240+
160241
@Document(indexName = "does-not-matter")
161242
static class SampleEntity {
162243
@Nullable

0 commit comments

Comments
 (0)