Skip to content

Commit 62385ed

Browse files
authored
DATAES-680 - ReactiveElasticsearchTemplate-should-use-the-count-API.
Original PR: #341
1 parent 2475197 commit 62385ed

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;
@@ -79,6 +78,8 @@
7978
import org.elasticsearch.action.update.UpdateRequest;
8079
import org.elasticsearch.action.update.UpdateResponse;
8180
import org.elasticsearch.client.Request;
81+
import org.elasticsearch.client.core.CountRequest;
82+
import org.elasticsearch.client.core.CountResponse;
8283
import org.elasticsearch.common.unit.TimeValue;
8384
import org.elasticsearch.common.xcontent.DeprecationHandler;
8485
import org.elasticsearch.common.xcontent.NamedXContentRegistry;
@@ -328,6 +329,17 @@ public Mono<DeleteResponse> delete(HttpHeaders headers, DeleteRequest deleteRequ
328329
.publishNext();
329330
}
330331

332+
/*
333+
* (non-Javadoc)
334+
* @see org.springframework.data.elasticsearch.client.reactive.ReactiveElasticsearchClient#count(org.springframework.http.HttpHeaders, org.elasticsearch.action.search.SearchRequest)
335+
*/
336+
@Override
337+
public Mono<Long> count(HttpHeaders headers, CountRequest countRequest) {
338+
return sendRequest(countRequest, RequestCreator.count(), CountResponse.class, headers) //
339+
.map(CountResponse::getCount) //
340+
.next();
341+
}
342+
331343
/*
332344
* (non-Javadoc)
333345
* @see org.springframework.data.elasticsearch.client.reactive.ReactiveElasticsearchClient#ping(org.springframework.http.HttpHeaders, org.elasticsearch.action.search.SearchRequest)
@@ -572,13 +584,12 @@ private static GetResult getResponseToGetResult(GetResponse response) {
572584

573585
// -->
574586

575-
private <Req extends ActionRequest, Resp extends ActionResponse> Flux<Resp> sendRequest(Req request,
576-
Function<Req, Request> converter, Class<Resp> responseType, HttpHeaders headers) {
587+
private <Req extends ActionRequest, Resp> Flux<Resp> sendRequest(Req request, Function<Req, Request> converter,
588+
Class<Resp> responseType, HttpHeaders headers) {
577589
return sendRequest(converter.apply(request), responseType, headers);
578590
}
579591

580-
private <AR extends ActionResponse> Flux<AR> sendRequest(Request request, Class<AR> responseType,
581-
HttpHeaders headers) {
592+
private <Resp> Flux<Resp> sendRequest(Request request, Class<Resp> responseType, HttpHeaders headers) {
582593

583594
String logId = ClientLogger.newLogId();
584595

@@ -807,6 +818,10 @@ static Function<FlushRequest, Request> flushIndex() {
807818
return RequestConverters::flushIndex;
808819
}
809820

821+
static Function<CountRequest, Request> count() {
822+
return RequestConverters::count;
823+
}
824+
810825
}
811826

812827
/**

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

+43
Original file line numberDiff line numberDiff line change
@@ -43,6 +43,7 @@
4343
import org.elasticsearch.action.search.SearchResponse;
4444
import org.elasticsearch.action.update.UpdateRequest;
4545
import org.elasticsearch.action.update.UpdateResponse;
46+
import org.elasticsearch.client.core.CountRequest;
4647
import org.elasticsearch.index.get.GetResult;
4748
import org.elasticsearch.index.reindex.BulkByScrollResponse;
4849
import org.elasticsearch.index.reindex.DeleteByQueryRequest;
@@ -59,6 +60,7 @@
5960
*
6061
* @author Christoph Strobl
6162
* @author Mark Paluch
63+
* @author Peter-Josef Meisch
6264
* @author Henrique Amaral
6365
* @since 3.2
6466
* @see ClientConfiguration
@@ -331,6 +333,47 @@ default Mono<DeleteResponse> delete(DeleteRequest deleteRequest) {
331333
*/
332334
Mono<DeleteResponse> delete(HttpHeaders headers, DeleteRequest deleteRequest);
333335

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

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)