Skip to content

Commit f98fd3c

Browse files
committed
DATAES-680 - ReactiveElasticsearchTemplate-should-use-the-count-API.
1 parent a4b9a76 commit f98fd3c

File tree

4 files changed

+234
-63
lines changed

4 files changed

+234
-63
lines changed

src/main/java/org/springframework/data/elasticsearch/client/reactive/DefaultReactiveElasticsearchClient.java

+20-5
Original file line numberDiff line numberDiff line change
@@ -47,7 +47,6 @@
4747
import org.apache.http.util.EntityUtils;
4848
import org.elasticsearch.ElasticsearchStatusException;
4949
import org.elasticsearch.action.ActionRequest;
50-
import org.elasticsearch.action.ActionResponse;
5150
import org.elasticsearch.action.admin.indices.close.CloseIndexRequest;
5251
import org.elasticsearch.action.admin.indices.create.CreateIndexRequest;
5352
import org.elasticsearch.action.admin.indices.delete.DeleteIndexRequest;
@@ -77,6 +76,8 @@
7776
import org.elasticsearch.action.update.UpdateRequest;
7877
import org.elasticsearch.action.update.UpdateResponse;
7978
import org.elasticsearch.client.Request;
79+
import org.elasticsearch.client.core.CountRequest;
80+
import org.elasticsearch.client.core.CountResponse;
8081
import org.elasticsearch.common.unit.TimeValue;
8182
import org.elasticsearch.common.xcontent.DeprecationHandler;
8283
import org.elasticsearch.common.xcontent.NamedXContentRegistry;
@@ -325,6 +326,17 @@ public Mono<DeleteResponse> delete(HttpHeaders headers, DeleteRequest deleteRequ
325326
.publishNext();
326327
}
327328

329+
/*
330+
* (non-Javadoc)
331+
* @see org.springframework.data.elasticsearch.client.reactive.ReactiveElasticsearchClient#count(org.springframework.http.HttpHeaders, org.elasticsearch.action.search.SearchRequest)
332+
*/
333+
@Override
334+
public Mono<Long> count(HttpHeaders headers, CountRequest countRequest) {
335+
return sendRequest(countRequest, RequestCreator.count(), CountResponse.class, headers) //
336+
.map(CountResponse::getCount) //
337+
.next();
338+
}
339+
328340
/*
329341
* (non-Javadoc)
330342
* @see org.springframework.data.elasticsearch.client.reactive.ReactiveElasticsearchClient#ping(org.springframework.http.HttpHeaders, org.elasticsearch.action.search.SearchRequest)
@@ -559,13 +571,12 @@ private static GetResult getResponseToGetResult(GetResponse response) {
559571

560572
// -->
561573

562-
private <Req extends ActionRequest, Resp extends ActionResponse> Flux<Resp> sendRequest(Req request,
563-
Function<Req, Request> converter, Class<Resp> responseType, HttpHeaders headers) {
574+
private <Req extends ActionRequest, Resp> Flux<Resp> sendRequest(Req request, Function<Req, Request> converter,
575+
Class<Resp> responseType, HttpHeaders headers) {
564576
return sendRequest(converter.apply(request), responseType, headers);
565577
}
566578

567-
private <AR extends ActionResponse> Flux<AR> sendRequest(Request request, Class<AR> responseType,
568-
HttpHeaders headers) {
579+
private <Resp> Flux<Resp> sendRequest(Request request, Class<Resp> responseType, HttpHeaders headers) {
569580

570581
String logId = ClientLogger.newLogId();
571582

@@ -782,6 +793,10 @@ static Function<FlushRequest, Request> flushIndex() {
782793
return RequestConverters::flushIndex;
783794
}
784795

796+
static Function<CountRequest, Request> count() {
797+
return RequestConverters::count;
798+
}
799+
785800
}
786801

787802
/**

src/main/java/org/springframework/data/elasticsearch/client/reactive/ReactiveElasticsearchClient.java

+43
Original file line numberDiff line numberDiff line change
@@ -41,6 +41,7 @@
4141
import org.elasticsearch.action.search.SearchResponse;
4242
import org.elasticsearch.action.update.UpdateRequest;
4343
import org.elasticsearch.action.update.UpdateResponse;
44+
import org.elasticsearch.client.core.CountRequest;
4445
import org.elasticsearch.index.get.GetResult;
4546
import org.elasticsearch.index.reindex.BulkByScrollResponse;
4647
import org.elasticsearch.index.reindex.DeleteByQueryRequest;
@@ -57,6 +58,7 @@
5758
*
5859
* @author Christoph Strobl
5960
* @author Mark Paluch
61+
* @author Peter-Josef Meisch
6062
* @since 3.2
6163
* @see ClientConfiguration
6264
* @see ReactiveRestClients
@@ -328,6 +330,47 @@ default Mono<DeleteResponse> delete(DeleteRequest deleteRequest) {
328330
*/
329331
Mono<DeleteResponse> delete(HttpHeaders headers, DeleteRequest deleteRequest);
330332

333+
/**
334+
* Execute a {@link SearchRequest} against the {@literal count} API.
335+
*
336+
* @param consumer new {@literal null}.
337+
* @see <a href="https://www.elastic.co/guide/en/elasticsearch/reference/current/search-count.html">Count API on
338+
* elastic.co</a>
339+
* @return the {@link Mono} emitting the count result.
340+
* @since 4.0
341+
*/
342+
default Mono<Long> count(Consumer<CountRequest> consumer) {
343+
344+
CountRequest countRequest = new CountRequest();
345+
consumer.accept(countRequest);
346+
return count(countRequest);
347+
}
348+
349+
/**
350+
* Execute a {@link SearchRequest} against the {@literal count} API.
351+
*
352+
* @param countRequest must not be {@literal null}.
353+
* @see <a href="https://www.elastic.co/guide/en/elasticsearch/reference/current/search-count.html">Count API on
354+
* elastic.co</a>
355+
* @return the {@link Mono} emitting the count result.
356+
* @since 4.0
357+
*/
358+
default Mono<Long> count(CountRequest countRequest) {
359+
return count(HttpHeaders.EMPTY, countRequest);
360+
}
361+
362+
/**
363+
* Execute a {@link SearchRequest} against the {@literal count} API.
364+
*
365+
* @param headers Use {@link HttpHeaders} to provide eg. authentication data. Must not be {@literal null}.
366+
* @param countRequest must not be {@literal null}.
367+
* @see <a href="https://www.elastic.co/guide/en/elasticsearch/reference/current/search-count.html">Count API on
368+
* elastic.co</a>
369+
* @return the {@link Mono} emitting the count result.
370+
* @since 4.0
371+
*/
372+
Mono<Long> count(HttpHeaders headers, CountRequest countRequest);
373+
331374
/**
332375
* Execute a {@link SearchRequest} against the {@literal search} API.
333376
*

src/main/java/org/springframework/data/elasticsearch/client/util/RequestConverters.java

+27
Original file line numberDiff line numberDiff line change
@@ -59,6 +59,7 @@
5959
import org.elasticsearch.client.Request;
6060
import org.elasticsearch.client.Requests;
6161
import org.elasticsearch.client.RethrottleRequest;
62+
import org.elasticsearch.client.core.CountRequest;
6263
import org.elasticsearch.client.indices.AnalyzeRequest;
6364
import org.elasticsearch.cluster.health.ClusterHealthStatus;
6465
import org.elasticsearch.common.Priority;
@@ -388,6 +389,32 @@ public static Request search(SearchRequest searchRequest) {
388389
return request;
389390
}
390391

392+
/**
393+
* Creates a count request.
394+
*
395+
* @param countRequest the search defining the data to be counted
396+
* @return Elasticsearch count request
397+
* @since 4.0
398+
*/
399+
public static Request count(CountRequest countRequest) {
400+
Request request = new Request(HttpMethod.POST.name(),
401+
endpoint(countRequest.indices(), countRequest.types(), "_count"));
402+
403+
Params params = new Params(request);
404+
addCountRequestParams(params, countRequest);
405+
406+
if (countRequest.source() != null) {
407+
request.setEntity(createEntity(countRequest.source(), REQUEST_BODY_CONTENT_TYPE));
408+
}
409+
return request;
410+
}
411+
412+
private static void addCountRequestParams(Params params, CountRequest countRequest) {
413+
params.withRouting(countRequest.routing());
414+
params.withPreference(countRequest.preference());
415+
params.withIndicesOptions(countRequest.indicesOptions());
416+
}
417+
391418
private static void addSearchRequestParams(Params params, SearchRequest searchRequest) {
392419
params.putParam("typed_keys", "true");
393420
params.withRouting(searchRequest.routing());

0 commit comments

Comments
 (0)