Add requestCache parameter to Query implementations.

Original Pull Request #1799
Closes #1564
This commit is contained in:
Peter-Josef Meisch 2021-05-01 21:20:07 +02:00 committed by GitHub
parent 5b6789539c
commit 502ce0b6aa
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
5 changed files with 106 additions and 12 deletions

View File

@ -732,13 +732,15 @@ public class ReactiveElasticsearchTemplate implements ReactiveElasticsearchOpera
private Flux<SearchDocument> doFind(Query query, Class<?> clazz, IndexCoordinates index) {
return Flux.defer(() -> {
SearchRequest request = requestFactory.searchRequest(query, clazz, index);
request = prepareSearchRequest(request);
if (query.getPageable().isPaged() || query.isLimiting()) {
return doFind(request);
} else {
SearchRequest request = requestFactory.searchRequest(query, clazz, index);
boolean useScroll = !(query.getPageable().isPaged() || query.isLimiting());
request = prepareSearchRequest(request, useScroll);
if (useScroll) {
return doScroll(request);
} else {
return doFind(request);
}
});
}
@ -747,7 +749,7 @@ public class ReactiveElasticsearchTemplate implements ReactiveElasticsearchOpera
return Mono.defer(() -> {
SearchRequest request = requestFactory.searchRequest(query, clazz, index);
request = prepareSearchRequest(request);
request = prepareSearchRequest(request, false);
return doFindForResponse(request);
});
}
@ -782,7 +784,7 @@ public class ReactiveElasticsearchTemplate implements ReactiveElasticsearchOpera
private Flux<Aggregation> doAggregate(Query query, Class<?> entityType, IndexCoordinates index) {
return Flux.defer(() -> {
SearchRequest request = requestFactory.searchRequest(query, entityType, index);
request = prepareSearchRequest(request);
request = prepareSearchRequest(request, false);
return doAggregate(request);
});
}
@ -801,7 +803,7 @@ public class ReactiveElasticsearchTemplate implements ReactiveElasticsearchOpera
return Mono.defer(() -> {
SearchRequest request = requestFactory.searchRequest(query, entityType, index);
request = prepareSearchRequest(request);
request = prepareSearchRequest(request, false);
return doCount(request);
});
}
@ -890,15 +892,21 @@ public class ReactiveElasticsearchTemplate implements ReactiveElasticsearchOpera
* {@link SearchRequest#indicesOptions(IndicesOptions) indices options} if applicable.
*
* @param request the generated {@link SearchRequest}.
* @param useScroll
* @return never {@literal null}.
*/
protected SearchRequest prepareSearchRequest(SearchRequest request) {
protected SearchRequest prepareSearchRequest(SearchRequest request, boolean useScroll) {
if (indicesOptions == null) {
return request;
if (indicesOptions != null) {
request = request.indicesOptions(indicesOptions);
}
return request.indicesOptions(indicesOptions);
// request_cache is not allowed on scroll requests.
if (useScroll) {
request = request.requestCache(null);
}
return request;
}
// endregion

View File

@ -1001,6 +1001,10 @@ class RequestFactory {
query.getRescorerQueries().forEach(rescorer -> sourceBuilder.addRescorer(getQueryRescorerBuilder(rescorer)));
if (query.getRequestCache() != null) {
request.requestCache(query.getRequestCache());
}
request.source(sourceBuilder);
return request;
}
@ -1089,6 +1093,10 @@ class RequestFactory {
query.getRescorerQueries().forEach(rescorer -> searchRequestBuilder.addRescorer(getQueryRescorerBuilder(rescorer)));
if (query.getRequestCache() != null) {
searchRequestBuilder.setRequestCache(query.getRequestCache());
}
return searchRequestBuilder;
}

View File

@ -65,6 +65,7 @@ abstract class AbstractQuery implements Query {
private boolean explain = false;
@Nullable private List<Object> searchAfter;
protected List<RescorerQuery> rescorerQueries = new ArrayList<>();
@Nullable protected Boolean requestCache;
@Override
@Nullable
@ -328,4 +329,15 @@ abstract class AbstractQuery implements Query {
public List<RescorerQuery> getRescorerQueries() {
return rescorerQueries;
}
@Override
public void setRequestCache(@Nullable Boolean value) {
this.requestCache = value;
}
@Override
@Nullable
public Boolean getRequestCache() {
return this.requestCache;
}
}

View File

@ -105,6 +105,7 @@ public interface Query {
/**
* Set fields to be returned as part of search request
*
* @param fields must not be {@literal null}
* @since 4.3
*/
@ -344,4 +345,19 @@ public interface Query {
default List<RescorerQuery> getRescorerQueries() {
return Collections.emptyList();
}
/**
* sets the request_cache value for the query.
*
* @param value new value
* @since 4.3
*/
void setRequestCache(@Nullable Boolean value);
/**
* @return the request_cache value for this query.
* @since 4.3
*/
@Nullable
Boolean getRequestCache();
}

View File

@ -81,6 +81,7 @@ import org.springframework.lang.Nullable;
* @author Roman Puchkovskiy
* @author Peer Mueller
*/
@SuppressWarnings("ConstantConditions")
@ExtendWith(MockitoExtension.class)
class RequestFactoryTests {
@ -595,6 +596,54 @@ class RequestFactoryTests {
assertEquals(expected, searchRequest, false);
}
@Test // #1564
@DisplayName("should not set request_cache on default SearchRequest")
void shouldNotSetRequestCacheOnDefaultSearchRequest() {
when(client.prepareSearch(any())).thenReturn(new SearchRequestBuilder(client, SearchAction.INSTANCE));
Query query = new NativeSearchQueryBuilder().withQuery(matchAllQuery()).build();
SearchRequest searchRequest = requestFactory.searchRequest(query, Person.class, IndexCoordinates.of("persons"));
SearchRequestBuilder searchRequestBuilder = requestFactory.searchRequestBuilder(client, query, Person.class,
IndexCoordinates.of("persons"));
assertThat(searchRequest.requestCache()).isNull();
assertThat(searchRequestBuilder.request().requestCache()).isNull();
}
@Test // #1564
@DisplayName("should set request_cache true on SearchRequest")
void shouldSetRequestCacheTrueOnSearchRequest() {
when(client.prepareSearch(any())).thenReturn(new SearchRequestBuilder(client, SearchAction.INSTANCE));
Query query = new NativeSearchQueryBuilder().withQuery(matchAllQuery()).build();
query.setRequestCache(true);
SearchRequest searchRequest = requestFactory.searchRequest(query, Person.class, IndexCoordinates.of("persons"));
SearchRequestBuilder searchRequestBuilder = requestFactory.searchRequestBuilder(client, query, Person.class,
IndexCoordinates.of("persons"));
assertThat(searchRequest.requestCache()).isTrue();
assertThat(searchRequestBuilder.request().requestCache()).isTrue();
}
@Test // #1564
@DisplayName("should set request_cache false on SearchRequest")
void shouldSetRequestCacheFalseOnSearchRequest() {
when(client.prepareSearch(any())).thenReturn(new SearchRequestBuilder(client, SearchAction.INSTANCE));
Query query = new NativeSearchQueryBuilder().withQuery(matchAllQuery()).build();
query.setRequestCache(false);
SearchRequest searchRequest = requestFactory.searchRequest(query, Person.class, IndexCoordinates.of("persons"));
SearchRequestBuilder searchRequestBuilder = requestFactory.searchRequestBuilder(client, query, Person.class,
IndexCoordinates.of("persons"));
assertThat(searchRequest.requestCache()).isFalse();
assertThat(searchRequestBuilder.request().requestCache()).isFalse();
}
// region entities
static class Person {
@Nullable @Id String id;
@Nullable @Field(name = "last-name") String lastName;
@ -644,4 +693,5 @@ class RequestFactoryTests {
static class EntityWithSeqNoPrimaryTerm {
@Nullable private SeqNoPrimaryTerm seqNoPrimaryTerm;
}
// endregion
}