Skip to content

Commit 502ce0b

Browse files
authored
Add requestCache parameter to Query implementations.
Original Pull Request #1799 Closes #1564
1 parent 5b67895 commit 502ce0b

File tree

5 files changed

+105
-11
lines changed

5 files changed

+105
-11
lines changed

Diff for: src/main/java/org/springframework/data/elasticsearch/core/ReactiveElasticsearchTemplate.java

+19-11
Original file line numberDiff line numberDiff line change
@@ -732,13 +732,15 @@ public <T> Mono<SearchPage<T>> searchForPage(Query query, Class<?> entityType, C
732732
private Flux<SearchDocument> doFind(Query query, Class<?> clazz, IndexCoordinates index) {
733733

734734
return Flux.defer(() -> {
735+
735736
SearchRequest request = requestFactory.searchRequest(query, clazz, index);
736-
request = prepareSearchRequest(request);
737+
boolean useScroll = !(query.getPageable().isPaged() || query.isLimiting());
738+
request = prepareSearchRequest(request, useScroll);
737739

738-
if (query.getPageable().isPaged() || query.isLimiting()) {
739-
return doFind(request);
740-
} else {
740+
if (useScroll) {
741741
return doScroll(request);
742+
} else {
743+
return doFind(request);
742744
}
743745
});
744746
}
@@ -747,7 +749,7 @@ private Mono<SearchDocumentResponse> doFindForResponse(Query query, Class<?> cla
747749

748750
return Mono.defer(() -> {
749751
SearchRequest request = requestFactory.searchRequest(query, clazz, index);
750-
request = prepareSearchRequest(request);
752+
request = prepareSearchRequest(request, false);
751753
return doFindForResponse(request);
752754
});
753755
}
@@ -782,7 +784,7 @@ private Flux<Suggest> doSuggest(SuggestBuilder suggestion, IndexCoordinates inde
782784
private Flux<Aggregation> doAggregate(Query query, Class<?> entityType, IndexCoordinates index) {
783785
return Flux.defer(() -> {
784786
SearchRequest request = requestFactory.searchRequest(query, entityType, index);
785-
request = prepareSearchRequest(request);
787+
request = prepareSearchRequest(request, false);
786788
return doAggregate(request);
787789
});
788790
}
@@ -801,7 +803,7 @@ private Mono<Long> doCount(Query query, Class<?> entityType, IndexCoordinates in
801803
return Mono.defer(() -> {
802804

803805
SearchRequest request = requestFactory.searchRequest(query, entityType, index);
804-
request = prepareSearchRequest(request);
806+
request = prepareSearchRequest(request, false);
805807
return doCount(request);
806808
});
807809
}
@@ -890,15 +892,21 @@ protected Flux<SearchDocument> doScroll(SearchRequest request) {
890892
* {@link SearchRequest#indicesOptions(IndicesOptions) indices options} if applicable.
891893
*
892894
* @param request the generated {@link SearchRequest}.
895+
* @param useScroll
893896
* @return never {@literal null}.
894897
*/
895-
protected SearchRequest prepareSearchRequest(SearchRequest request) {
898+
protected SearchRequest prepareSearchRequest(SearchRequest request, boolean useScroll) {
896899

897-
if (indicesOptions == null) {
898-
return request;
900+
if (indicesOptions != null) {
901+
request = request.indicesOptions(indicesOptions);
899902
}
900903

901-
return request.indicesOptions(indicesOptions);
904+
// request_cache is not allowed on scroll requests.
905+
if (useScroll) {
906+
request = request.requestCache(null);
907+
}
908+
return request;
909+
902910
}
903911

904912
// endregion

Diff for: src/main/java/org/springframework/data/elasticsearch/core/RequestFactory.java

+8
Original file line numberDiff line numberDiff line change
@@ -1001,6 +1001,10 @@ private SearchRequest prepareSearchRequest(Query query, @Nullable Class<?> clazz
10011001

10021002
query.getRescorerQueries().forEach(rescorer -> sourceBuilder.addRescorer(getQueryRescorerBuilder(rescorer)));
10031003

1004+
if (query.getRequestCache() != null) {
1005+
request.requestCache(query.getRequestCache());
1006+
}
1007+
10041008
request.source(sourceBuilder);
10051009
return request;
10061010
}
@@ -1089,6 +1093,10 @@ private SearchRequestBuilder prepareSearchRequestBuilder(Query query, Client cli
10891093

10901094
query.getRescorerQueries().forEach(rescorer -> searchRequestBuilder.addRescorer(getQueryRescorerBuilder(rescorer)));
10911095

1096+
if (query.getRequestCache() != null) {
1097+
searchRequestBuilder.setRequestCache(query.getRequestCache());
1098+
}
1099+
10921100
return searchRequestBuilder;
10931101
}
10941102

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

+12
Original file line numberDiff line numberDiff line change
@@ -65,6 +65,7 @@ abstract class AbstractQuery implements Query {
6565
private boolean explain = false;
6666
@Nullable private List<Object> searchAfter;
6767
protected List<RescorerQuery> rescorerQueries = new ArrayList<>();
68+
@Nullable protected Boolean requestCache;
6869

6970
@Override
7071
@Nullable
@@ -328,4 +329,15 @@ public void setRescorerQueries(List<RescorerQuery> rescorerQueryList) {
328329
public List<RescorerQuery> getRescorerQueries() {
329330
return rescorerQueries;
330331
}
332+
333+
@Override
334+
public void setRequestCache(@Nullable Boolean value) {
335+
this.requestCache = value;
336+
}
337+
338+
@Override
339+
@Nullable
340+
public Boolean getRequestCache() {
341+
return this.requestCache;
342+
}
331343
}

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

+16
Original file line numberDiff line numberDiff line change
@@ -105,6 +105,7 @@ static Query findAll() {
105105

106106
/**
107107
* Set fields to be returned as part of search request
108+
*
108109
* @param fields must not be {@literal null}
109110
* @since 4.3
110111
*/
@@ -344,4 +345,19 @@ default boolean getExplain() {
344345
default List<RescorerQuery> getRescorerQueries() {
345346
return Collections.emptyList();
346347
}
348+
349+
/**
350+
* sets the request_cache value for the query.
351+
*
352+
* @param value new value
353+
* @since 4.3
354+
*/
355+
void setRequestCache(@Nullable Boolean value);
356+
357+
/**
358+
* @return the request_cache value for this query.
359+
* @since 4.3
360+
*/
361+
@Nullable
362+
Boolean getRequestCache();
347363
}

Diff for: src/test/java/org/springframework/data/elasticsearch/core/RequestFactoryTests.java

+50
Original file line numberDiff line numberDiff line change
@@ -81,6 +81,7 @@
8181
* @author Roman Puchkovskiy
8282
* @author Peer Mueller
8383
*/
84+
@SuppressWarnings("ConstantConditions")
8485
@ExtendWith(MockitoExtension.class)
8586
class RequestFactoryTests {
8687

@@ -595,6 +596,54 @@ void shouldBuildSearchWithRescorerQuery() throws JSONException {
595596
assertEquals(expected, searchRequest, false);
596597
}
597598

599+
@Test // #1564
600+
@DisplayName("should not set request_cache on default SearchRequest")
601+
void shouldNotSetRequestCacheOnDefaultSearchRequest() {
602+
603+
when(client.prepareSearch(any())).thenReturn(new SearchRequestBuilder(client, SearchAction.INSTANCE));
604+
Query query = new NativeSearchQueryBuilder().withQuery(matchAllQuery()).build();
605+
606+
SearchRequest searchRequest = requestFactory.searchRequest(query, Person.class, IndexCoordinates.of("persons"));
607+
SearchRequestBuilder searchRequestBuilder = requestFactory.searchRequestBuilder(client, query, Person.class,
608+
IndexCoordinates.of("persons"));
609+
610+
assertThat(searchRequest.requestCache()).isNull();
611+
assertThat(searchRequestBuilder.request().requestCache()).isNull();
612+
}
613+
614+
@Test // #1564
615+
@DisplayName("should set request_cache true on SearchRequest")
616+
void shouldSetRequestCacheTrueOnSearchRequest() {
617+
618+
when(client.prepareSearch(any())).thenReturn(new SearchRequestBuilder(client, SearchAction.INSTANCE));
619+
Query query = new NativeSearchQueryBuilder().withQuery(matchAllQuery()).build();
620+
query.setRequestCache(true);
621+
622+
SearchRequest searchRequest = requestFactory.searchRequest(query, Person.class, IndexCoordinates.of("persons"));
623+
SearchRequestBuilder searchRequestBuilder = requestFactory.searchRequestBuilder(client, query, Person.class,
624+
IndexCoordinates.of("persons"));
625+
626+
assertThat(searchRequest.requestCache()).isTrue();
627+
assertThat(searchRequestBuilder.request().requestCache()).isTrue();
628+
}
629+
630+
@Test // #1564
631+
@DisplayName("should set request_cache false on SearchRequest")
632+
void shouldSetRequestCacheFalseOnSearchRequest() {
633+
634+
when(client.prepareSearch(any())).thenReturn(new SearchRequestBuilder(client, SearchAction.INSTANCE));
635+
Query query = new NativeSearchQueryBuilder().withQuery(matchAllQuery()).build();
636+
query.setRequestCache(false);
637+
638+
SearchRequest searchRequest = requestFactory.searchRequest(query, Person.class, IndexCoordinates.of("persons"));
639+
SearchRequestBuilder searchRequestBuilder = requestFactory.searchRequestBuilder(client, query, Person.class,
640+
IndexCoordinates.of("persons"));
641+
642+
assertThat(searchRequest.requestCache()).isFalse();
643+
assertThat(searchRequestBuilder.request().requestCache()).isFalse();
644+
}
645+
646+
// region entities
598647
static class Person {
599648
@Nullable @Id String id;
600649
@Nullable @Field(name = "last-name") String lastName;
@@ -644,4 +693,5 @@ public void setLocation(@Nullable GeoPoint location) {
644693
static class EntityWithSeqNoPrimaryTerm {
645694
@Nullable private SeqNoPrimaryTerm seqNoPrimaryTerm;
646695
}
696+
// endregion
647697
}

0 commit comments

Comments
 (0)