package com.github.obourgain.elasticsearch.http.handler.search.count; import static com.github.obourgain.elasticsearch.http.request.HttpRequestUtils.indicesOrAll; import static com.github.obourgain.elasticsearch.http.response.ErrorHandler.HANDLES_404; import org.elasticsearch.action.ActionListener; import org.elasticsearch.action.count.CountAction; import org.elasticsearch.action.count.CountRequest; import org.elasticsearch.action.count.CountRequestAccessor; import org.elasticsearch.common.Strings; import org.elasticsearch.common.bytes.BytesReference; import org.elasticsearch.search.internal.SearchContext; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import com.github.obourgain.elasticsearch.http.client.HttpClient; import com.github.obourgain.elasticsearch.http.concurrent.ListenerCompleterObserver; import com.github.obourgain.elasticsearch.http.request.RequestUriBuilder; import io.netty.buffer.ByteBuf; import io.reactivex.netty.protocol.http.client.HttpClientRequest; import io.reactivex.netty.protocol.http.client.HttpClientResponse; import rx.Observable; import rx.functions.Func1; /** * @author olivier bourgain */ public class CountActionHandler { private static final Logger logger = LoggerFactory.getLogger(CountActionHandler.class); private final HttpClient httpClient; public CountActionHandler(HttpClient httpClient) { this.httpClient = httpClient; } public CountAction getAction() { return CountAction.INSTANCE; } public void execute(CountRequest request, final ActionListener<CountResponse> listener) { logger.debug("count request {}", request); try { String indices = indicesOrAll(request); RequestUriBuilder uriBuilder; if (request.types() != null && request.types().length > 0) { String types = Strings.arrayToCommaDelimitedString(request.types()); uriBuilder = new RequestUriBuilder(indices, types); } else { uriBuilder = new RequestUriBuilder(indices); } uriBuilder.addEndpoint("_count"); if (CountRequestAccessor.getMinScore(request) != CountRequest.DEFAULT_MIN_SCORE) { uriBuilder.addQueryParameter("min_score", CountRequestAccessor.getMinScore(request)); } uriBuilder.addQueryParameterIfNotNull("preference", request.preference()); uriBuilder.addQueryParameterIfNotNull("routing", request.routing()); if (request.terminateAfter() != SearchContext.DEFAULT_TERMINATE_AFTER) { uriBuilder.addQueryParameter("terminate_after", request.terminateAfter()); } uriBuilder.addIndicesOptions(request); HttpClientRequest<ByteBuf> httpRequest = HttpClientRequest.createPost(uriBuilder.toString()); BytesReference source = CountRequestAccessor.getSource(request); if (source != null) { httpRequest.withContent(source.toBytes()); } httpClient.getHttpClient().submit(httpRequest) .flatMap(HANDLES_404) .flatMap(new Func1<HttpClientResponse<ByteBuf>, Observable<CountResponse>>() { @Override public Observable<CountResponse> call(final HttpClientResponse<ByteBuf> response) { return response.getContent().flatMap(new Func1<ByteBuf, Observable<CountResponse>>() { @Override public Observable<CountResponse> call(ByteBuf byteBuf) { return CountResponse.parse(byteBuf); } }); } }) .single() .subscribe(new ListenerCompleterObserver<>(listener)); } catch (Exception e) { listener.onFailure(e); } } }