Skip to content

Commit be8c8c3

Browse files
committed
Fix searchMsearchRequest to use Min(size, maxResults) as actual pageSize
See spring-projects#3089
1 parent 787a4c3 commit be8c8c3

File tree

2 files changed

+89
-6
lines changed

2 files changed

+89
-6
lines changed

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

+5-3
Original file line numberDiff line numberDiff line change
@@ -1310,9 +1310,11 @@ public MsearchRequest searchMsearchRequest(
13101310
bb.storedFields(query.getStoredFields());
13111311
}
13121312

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

13171319
if (query.getMinScore() > 0) {
13181320
bb.minScore((double) query.getMinScore());

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

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

9393
@Test
94-
@DisplayName("When maxResults is set (size < maxResults), pageSize should be the minimum of maxResults and pageable size")
94+
@DisplayName("searchRequest() - When maxResults is set (size < maxResults), pageSize should be the minimum of maxResults and pageable size")
9595
void searchRequestPageSizeSmallerThanMaxResults() {
9696
var size = 123;
9797
var maxResults = size * 12;
@@ -113,7 +113,7 @@ void searchRequestPageSizeSmallerThanMaxResults() {
113113
}
114114

115115
@Test
116-
@DisplayName("When maxResults is set (size == maxResults), pageSize should be equal to maxResults and pageable size")
116+
@DisplayName("searchRequest() - When maxResults is set (size == maxResults), pageSize should be equal to maxResults and pageable size")
117117
void searchRequestPageSizeEqualToMaxResults() {
118118
var pageSize = 123;
119119
var maxResults = pageSize;
@@ -135,7 +135,7 @@ void searchRequestPageSizeEqualToMaxResults() {
135135
}
136136

137137
@Test
138-
@DisplayName("When maxResults is set (size > maxResults), pageSize should be the minimum of maxResults and pageable size")
138+
@DisplayName("searchRequest() - When maxResults is set (size > maxResults), pageSize should be the minimum of maxResults and pageable size")
139139
void searchRequestPageSizeLargerThanMaxResults() {
140140
var pageSize = 123;
141141
var maxResults = 99;
@@ -156,6 +156,87 @@ void searchRequestPageSizeLargerThanMaxResults() {
156156
assertThat(actualPageSize).isEqualTo(maxResults);
157157
}
158158

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

0 commit comments

Comments
 (0)