mirror of
https://github.com/spring-projects/spring-data-elasticsearch.git
synced 2025-05-08 17:37:43 +00:00
Add requestCache parameter to Query implementations.
Original Pull Request #1799 Closes #1564
This commit is contained in:
parent
5b6789539c
commit
502ce0b6aa
@ -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
|
||||
|
@ -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;
|
||||
}
|
||||
|
||||
|
@ -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;
|
||||
}
|
||||
}
|
||||
|
@ -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();
|
||||
}
|
||||
|
@ -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
|
||||
}
|
||||
|
Loading…
x
Reference in New Issue
Block a user