Skip to content

Commit 0a0bff8

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

File tree

2 files changed

+74
-3
lines changed

2 files changed

+74
-3
lines changed

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

+5-2
Original file line numberDiff line numberDiff line change
@@ -112,6 +112,7 @@
112112
* @author cdalxndr
113113
* @author scoobyzhang
114114
* @author Haibo Liu
115+
* @author Hyuncheol Park
115116
* @since 4.4
116117
*/
117118
class RequestConverter extends AbstractQueryProcessor {
@@ -1487,8 +1488,10 @@ private <T> void prepareSearchRequest(Query query, @Nullable String routing, @Nu
14871488
addIndicesOptions(builder, query.getIndicesOptions());
14881489
}
14891490

1490-
if (query.isLimiting()) {
1491-
builder.size(query.getMaxResults());
1491+
var maxResults = query.getMaxResults();
1492+
if (query.isLimiting() && maxResults != null) {
1493+
var pageSize = Math.min(maxResults, query.getPageable().getPageSize());
1494+
builder.size(pageSize);
14921495
}
14931496

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

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

+69-1
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@
1515
*/
1616
package org.springframework.data.elasticsearch.client.elc;
1717

18-
import static org.assertj.core.api.Assertions.*;
18+
import static org.assertj.core.api.Assertions.assertThat;
1919

2020
import co.elastic.clients.json.jackson.JacksonJsonpMapper;
2121

@@ -24,6 +24,7 @@
2424
import org.junit.jupiter.api.DisplayName;
2525
import org.junit.jupiter.api.Test;
2626
import org.springframework.data.annotation.Id;
27+
import org.springframework.data.domain.Pageable;
2728
import org.springframework.data.elasticsearch.annotations.Document;
2829
import org.springframework.data.elasticsearch.annotations.Field;
2930
import org.springframework.data.elasticsearch.annotations.FieldType;
@@ -40,6 +41,7 @@
4041
/**
4142
* @author Peter-Josef Meisch
4243
* @author Han Seungwoo
44+
* @author Hyuncheol Park
4345
*/
4446
class RequestConverterTest {
4547

@@ -89,6 +91,72 @@ void refreshSetByDeleteRequest() {
8991
assertThat(deleteByQueryRequest.refresh()).isTrue();
9092
}
9193

94+
@Test // #3089
95+
@DisplayName("When maxResults is set (size < maxResults), pageSize should be the minimum of maxResults and pageable size")
96+
void searchRequestPageSizeSmallerThanMaxResults() {
97+
var size = 123;
98+
var maxResults = size * 12;
99+
100+
var query = StringQuery.builder("""
101+
{
102+
"match_all":{}
103+
}
104+
""")
105+
.withPageable(Pageable.ofSize(size))
106+
.withMaxResults(maxResults)
107+
.build();
108+
109+
var searchRequest = requestConverter.searchRequest(query, null, SampleEntity.class, IndexCoordinates.of("foo"), false, false, null);
110+
var actualPageSize = searchRequest.size();
111+
112+
assertThat(actualPageSize).isEqualTo(size);
113+
assertThat(actualPageSize).isNotEqualTo(maxResults);
114+
}
115+
116+
@Test // #3089
117+
@DisplayName("When maxResults is set (size == maxResults), pageSize should be equal to maxResults and pageable size")
118+
void searchRequestPageSizeEqualToMaxResults() {
119+
var pageSize = 123;
120+
var maxResults = pageSize;
121+
122+
var query = StringQuery.builder("""
123+
{
124+
"match_all":{}
125+
}
126+
""")
127+
.withPageable(Pageable.ofSize(pageSize))
128+
.withMaxResults(maxResults)
129+
.build();
130+
131+
var searchRequest = requestConverter.searchRequest(query, null, SampleEntity.class, IndexCoordinates.of("foo"), false, false, null);
132+
var actualPageSize = searchRequest.size();
133+
134+
assertThat(actualPageSize).isEqualTo(pageSize);
135+
assertThat(actualPageSize).isEqualTo(maxResults);
136+
}
137+
138+
@Test // #3089
139+
@DisplayName("When maxResults is set (size > maxResults), pageSize should be the minimum of maxResults and pageable size")
140+
void searchRequestPageSizeLargerThanMaxResults() {
141+
var pageSize = 123;
142+
var maxResults = 99;
143+
144+
var query = StringQuery.builder("""
145+
{
146+
"match_all":{}
147+
}
148+
""")
149+
.withPageable(Pageable.ofSize(pageSize))
150+
.withMaxResults(maxResults)
151+
.build();
152+
153+
var searchRequest = requestConverter.searchRequest(query, null, SampleEntity.class, IndexCoordinates.of("foo"), false, false, null);
154+
var actualPageSize = searchRequest.size();
155+
156+
assertThat(actualPageSize).isNotEqualTo(pageSize);
157+
assertThat(actualPageSize).isEqualTo(maxResults);
158+
}
159+
92160
@Document(indexName = "does-not-matter")
93161
static class SampleEntity {
94162
@Nullable

0 commit comments

Comments
 (0)