package com.github.obourgain.elasticsearch.http.handler.document.deleteByQuery; import static com.github.obourgain.elasticsearch.http.request.HttpRequestUtils.indicesOrAll; import org.elasticsearch.action.ActionListener; import org.elasticsearch.action.deletebyquery.DeleteByQueryAction; import org.elasticsearch.action.deletebyquery.DeleteByQueryRequest; import org.elasticsearch.action.deletebyquery.DeleteByQueryRequestAccessor; import org.elasticsearch.action.support.replication.ShardReplicationOperationRequest; import org.elasticsearch.common.Strings; 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 com.github.obourgain.elasticsearch.http.response.ErrorHandler; 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 DeleteByQueryActionHandler { private static final Logger logger = LoggerFactory.getLogger(DeleteByQueryActionHandler.class); private final HttpClient httpClient; public DeleteByQueryActionHandler(HttpClient httpClient) { this.httpClient = httpClient; } public DeleteByQueryAction getAction() { return DeleteByQueryAction.INSTANCE; } public void execute(DeleteByQueryRequest request, final ActionListener<DeleteByQueryResponse> listener) { logger.debug("delete by query request {}", request); try { String indices = indicesOrAll(request); RequestUriBuilder uriBuilder; String[] requestTypes = DeleteByQueryRequestAccessor.types(request); if (requestTypes != null && requestTypes.length != 0) { uriBuilder = new RequestUriBuilder(indices, Strings.arrayToCommaDelimitedString(requestTypes)); } else { uriBuilder = new RequestUriBuilder(indices); } uriBuilder.addEndpoint("_query"); uriBuilder.addIndicesOptions(request); // for search requests, this can be a String[] but the SearchRequests does the conversion to comma delimited string uriBuilder.addQueryParameterIfNotNull("routing", request.routing()); uriBuilder.addConsistencyLevel(request.consistencyLevel()); if (request.timeout() != ShardReplicationOperationRequest.DEFAULT_TIMEOUT) { uriBuilder.addQueryParameter("timeout", request.timeout().toString()); } httpClient.getHttpClient().submit(HttpClientRequest.createDelete(uriBuilder.toString()) .withContent(DeleteByQueryRequestAccessor.getSource(request).toBytes())) .flatMap(ErrorHandler.AS_FUNC) .flatMap(new Func1<HttpClientResponse<ByteBuf>, Observable<DeleteByQueryResponse>>() { @Override public Observable<DeleteByQueryResponse> call(HttpClientResponse<ByteBuf> response) { return response.getContent().flatMap(new Func1<ByteBuf, Observable<DeleteByQueryResponse>>() { @Override public Observable<DeleteByQueryResponse> call(ByteBuf byteBuf) { return DeleteByQueryResponse.parse(byteBuf); } }); } }) .single() .subscribe(new ListenerCompleterObserver<>(listener)); } catch (Exception e) { listener.onFailure(e); } } }