Skip to content

Commit e950752

Browse files
authored
DATAES-1003 - add timeout to search query.
Original PR: #572
1 parent b49b053 commit e950752

File tree

5 files changed

+66
-0
lines changed

5 files changed

+66
-0
lines changed

src/main/java/org/springframework/data/elasticsearch/core/RequestFactory.java

+10
Original file line numberDiff line numberDiff line change
@@ -1172,6 +1172,11 @@ private SearchRequest prepareSearchRequest(Query query, @Nullable Class<?> clazz
11721172
if (StringUtils.hasLength(query.getRoute())) {
11731173
request.routing(query.getRoute());
11741174
}
1175+
1176+
TimeValue timeout = query.getTimeout();
1177+
if (timeout !=null) {
1178+
sourceBuilder.timeout(timeout);
1179+
}
11751180

11761181
request.source(sourceBuilder);
11771182
return request;
@@ -1247,6 +1252,11 @@ private SearchRequestBuilder prepareSearchRequestBuilder(Query query, Client cli
12471252
if (StringUtils.hasLength(query.getRoute())) {
12481253
searchRequestBuilder.setRouting(query.getRoute());
12491254
}
1255+
1256+
TimeValue timeout = query.getTimeout();
1257+
if (timeout !=null) {
1258+
searchRequestBuilder.setTimeout(timeout);
1259+
}
12501260

12511261
return searchRequestBuilder;
12521262
}

src/main/java/org/springframework/data/elasticsearch/core/query/AbstractQuery.java

+12
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,7 @@
2525

2626
import org.elasticsearch.action.search.SearchType;
2727
import org.elasticsearch.action.support.IndicesOptions;
28+
import org.elasticsearch.common.unit.TimeValue;
2829
import org.springframework.data.domain.Pageable;
2930
import org.springframework.data.domain.Sort;
3031
import org.springframework.lang.Nullable;
@@ -59,6 +60,7 @@ abstract class AbstractQuery implements Query {
5960
@Nullable private Boolean trackTotalHits;
6061
@Nullable private Integer trackTotalHitsUpTo;
6162
@Nullable private Duration scrollTime;
63+
@Nullable private TimeValue timeout;
6264

6365
@Override
6466
@Nullable
@@ -252,4 +254,14 @@ public Duration getScrollTime() {
252254
public void setScrollTime(@Nullable Duration scrollTime) {
253255
this.scrollTime = scrollTime;
254256
}
257+
258+
@Nullable
259+
@Override
260+
public TimeValue getTimeout() {
261+
return timeout;
262+
}
263+
264+
public void setTimeout(TimeValue timeout) {
265+
this.timeout = timeout;
266+
}
255267
}

src/main/java/org/springframework/data/elasticsearch/core/query/NativeSearchQueryBuilder.java

+11
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@
2323

2424
import org.elasticsearch.action.search.SearchType;
2525
import org.elasticsearch.action.support.IndicesOptions;
26+
import org.elasticsearch.common.unit.TimeValue;
2627
import org.elasticsearch.index.query.QueryBuilder;
2728
import org.elasticsearch.search.aggregations.AbstractAggregationBuilder;
2829
import org.elasticsearch.search.collapse.CollapseBuilder;
@@ -68,6 +69,7 @@ public class NativeSearchQueryBuilder {
6869
@Nullable private String preference;
6970
@Nullable private Integer maxResults;
7071
@Nullable private Boolean trackTotalHits;
72+
@Nullable private TimeValue timeout;
7173

7274
public NativeSearchQueryBuilder withQuery(QueryBuilder queryBuilder) {
7375
this.queryBuilder = queryBuilder;
@@ -181,6 +183,11 @@ public NativeSearchQueryBuilder withTrackTotalHits(Boolean trackTotalHits) {
181183
this.trackTotalHits = trackTotalHits;
182184
return this;
183185
}
186+
187+
public NativeSearchQueryBuilder withTimeout(TimeValue timeout) {
188+
this.timeout = timeout;
189+
return this;
190+
}
184191

185192
public NativeSearchQuery build() {
186193

@@ -243,6 +250,10 @@ public NativeSearchQuery build() {
243250
}
244251

245252
nativeSearchQuery.setTrackTotalHits(trackTotalHits);
253+
254+
if (timeout != null) {
255+
nativeSearchQuery.setTimeout(timeout);
256+
}
246257

247258
return nativeSearchQuery;
248259
}

src/main/java/org/springframework/data/elasticsearch/core/query/Query.java

+9
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@
2222

2323
import org.elasticsearch.action.search.SearchType;
2424
import org.elasticsearch.action.support.IndicesOptions;
25+
import org.elasticsearch.common.unit.TimeValue;
2526
import org.elasticsearch.index.query.QueryBuilders;
2627
import org.springframework.data.domain.PageRequest;
2728
import org.springframework.data.domain.Pageable;
@@ -275,4 +276,12 @@ default Optional<HighlightQuery> getHighlightQuery() {
275276
default boolean hasScrollTime() {
276277
return getScrollTime() != null;
277278
}
279+
280+
/**
281+
* Get timeout
282+
*
283+
* @return null if not set
284+
*/
285+
@Nullable
286+
TimeValue getTimeout();
278287
}

src/test/java/org/springframework/data/elasticsearch/core/RequestFactoryTests.java

+24
Original file line numberDiff line numberDiff line change
@@ -39,6 +39,7 @@
3939
import org.elasticsearch.action.search.SearchRequestBuilder;
4040
import org.elasticsearch.client.Client;
4141
import org.elasticsearch.client.indices.PutIndexTemplateRequest;
42+
import org.elasticsearch.common.unit.TimeValue;
4243
import org.elasticsearch.common.xcontent.ToXContent;
4344
import org.elasticsearch.common.xcontent.XContentHelper;
4445
import org.elasticsearch.common.xcontent.XContentType;
@@ -481,6 +482,29 @@ void shouldSetOpTypeIndexIfSpecified() {
481482

482483
assertThat(indexRequest.opType()).isEqualTo(DocWriteRequest.OpType.INDEX);
483484
}
485+
486+
@Test
487+
@DisplayName("should set timeout to request")
488+
void shouldSetTimeoutToRequest() {
489+
Query query = new NativeSearchQueryBuilder().withQuery(matchAllQuery()).withTimeout(TimeValue.timeValueSeconds(1)).build();
490+
491+
SearchRequest searchRequest = requestFactory.searchRequest(query, Person.class, IndexCoordinates.of("persons"));
492+
493+
assertThat(searchRequest.source().timeout()).isEqualTo(TimeValue.timeValueSeconds(1));
494+
}
495+
496+
@Test
497+
@DisplayName("should set timeout to requestbuilder")
498+
void shouldSetTimeoutToRequestBuilder() {
499+
when(client.prepareSearch(any())).thenReturn(new SearchRequestBuilder(client, SearchAction.INSTANCE));
500+
Query query = new NativeSearchQueryBuilder().withQuery(matchAllQuery()).withTimeout(TimeValue.timeValueSeconds(1)).build();
501+
502+
SearchRequestBuilder searchRequestBuilder = requestFactory.searchRequestBuilder(client, query, Person.class,
503+
IndexCoordinates.of("persons"));
504+
505+
assertThat(searchRequestBuilder.request().source().timeout()).isEqualTo(TimeValue.timeValueSeconds(1));
506+
}
507+
484508

485509
private String requestToString(ToXContent request) throws IOException {
486510
return XContentHelper.toXContent(request, XContentType.JSON, true).utf8ToString();

0 commit comments

Comments
 (0)