Skip to content

Commit 2cf42a4

Browse files
committed
DATAES-680 - ReactiveElasticsearchTemplate-should-use-the-count-API.
Original PR: #341 (cherry picked from commit 62385ed)
1 parent 6f0d1ee commit 2cf42a4

File tree

4 files changed

+232
-62
lines changed

4 files changed

+232
-62
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;
@@ -322,6 +323,17 @@ public Mono<DeleteResponse> delete(HttpHeaders headers, DeleteRequest deleteRequ
322323
.publishNext();
323324
}
324325

326+
/*
327+
* (non-Javadoc)
328+
* @see org.springframework.data.elasticsearch.client.reactive.ReactiveElasticsearchClient#count(org.springframework.http.HttpHeaders, org.elasticsearch.action.search.SearchRequest)
329+
*/
330+
@Override
331+
public Mono<Long> count(HttpHeaders headers, CountRequest countRequest) {
332+
return sendRequest(countRequest, RequestCreator.count(), CountResponse.class, headers) //
333+
.map(CountResponse::getCount) //
334+
.next();
335+
}
336+
325337
/*
326338
* (non-Javadoc)
327339
* @see org.springframework.data.elasticsearch.client.reactive.ReactiveElasticsearchClient#ping(org.springframework.http.HttpHeaders, org.elasticsearch.action.search.SearchRequest)
@@ -566,13 +578,12 @@ private static GetResult getResponseToGetResult(GetResponse response) {
566578

567579
// -->
568580

569-
private <Req extends ActionRequest, Resp extends ActionResponse> Flux<Resp> sendRequest(Req request,
570-
Function<Req, Request> converter, Class<Resp> responseType, HttpHeaders headers) {
581+
private <Req extends ActionRequest, Resp> Flux<Resp> sendRequest(Req request, Function<Req, Request> converter,
582+
Class<Resp> responseType, HttpHeaders headers) {
571583
return sendRequest(converter.apply(request), responseType, headers);
572584
}
573585

574-
private <AR extends ActionResponse> Flux<AR> sendRequest(Request request, Class<AR> responseType,
575-
HttpHeaders headers) {
586+
private <Resp> Flux<Resp> sendRequest(Request request, Class<Resp> responseType, HttpHeaders headers) {
576587

577588
String logId = ClientLogger.newLogId();
578589

@@ -801,6 +812,10 @@ static Function<FlushRequest, Request> flushIndex() {
801812
return RequestConverters::flushIndex;
802813
}
803814

815+
static Function<CountRequest, Request> count() {
816+
return RequestConverters::count;
817+
}
818+
804819
}
805820

806821
/**

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;
@@ -60,6 +61,7 @@
6061
*
6162
* @author Christoph Strobl
6263
* @author Mark Paluch
64+
* @author Peter-Josef Meisch
6365
* @author Henrique Amaral
6466
* @since 3.2
6567
* @see ClientConfiguration
@@ -332,6 +334,47 @@ default Mono<DeleteResponse> delete(DeleteRequest deleteRequest) {
332334
*/
333335
Mono<DeleteResponse> delete(HttpHeaders headers, DeleteRequest deleteRequest);
334336

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

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

+29
Original file line numberDiff line numberDiff line change
@@ -60,6 +60,7 @@
6060
import org.elasticsearch.client.Request;
6161
import org.elasticsearch.client.Requests;
6262
import org.elasticsearch.client.RethrottleRequest;
63+
import org.elasticsearch.client.core.CountRequest;
6364
import org.elasticsearch.cluster.health.ClusterHealthStatus;
6465
import org.elasticsearch.common.Priority;
6566
import org.elasticsearch.common.Strings;
@@ -98,6 +99,8 @@
9899
* <p>
99100
* Only intended for internal use.
100101
*
102+
* @author Christoph Strobl
103+
* @author Peter-Josef Meisch
101104
* @since 3.2
102105
*/
103106
public class RequestConverters {
@@ -386,6 +389,32 @@ public static Request search(SearchRequest searchRequest) {
386389
return request;
387390
}
388391

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+
389418
private static void addSearchRequestParams(Params params, SearchRequest searchRequest) {
390419
params.putParam("typed_keys", "true");
391420
params.withRouting(searchRequest.routing());

0 commit comments

Comments
 (0)