package com.github.obourgain.elasticsearch.http.handler.search.clearscroll; import static com.github.obourgain.elasticsearch.http.response.ErrorHandler.HANDLES_404; import org.elasticsearch.action.ActionListener; import org.elasticsearch.action.search.ClearScrollAction; import org.elasticsearch.action.search.ClearScrollRequest; 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.handler.search.search.SearchScrollActionHandler; 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 ClearScrollActionHandler { private static final Logger logger = LoggerFactory.getLogger(SearchScrollActionHandler.class); private final HttpClient httpClient; public ClearScrollActionHandler(HttpClient httpClient) { this.httpClient = httpClient; } public ClearScrollAction getAction() { return ClearScrollAction.INSTANCE; } public void execute(ClearScrollRequest request, final ActionListener<ClearScrollResponse> listener) { logger.debug("clear scroll request {}", request); try { RequestUriBuilder uriBuilder = new RequestUriBuilder() .addEndpoint("_search/scroll"); uriBuilder.addQueryParameter("scroll_id", Strings.collectionToCommaDelimitedString(request.getScrollIds())); httpClient.getHttpClient().submit(HttpClientRequest.createDelete(uriBuilder.toString())) .flatMap(HANDLES_404) .flatMap(new Func1<HttpClientResponse<ByteBuf>, Observable<ClearScrollResponse>>() { @Override public Observable<ClearScrollResponse> call(final HttpClientResponse<ByteBuf> response) { return response.getContent().flatMap(new Func1<ByteBuf, Observable<ClearScrollResponse>>() { @Override public Observable<ClearScrollResponse> call(ByteBuf byteBuf) { return ClearScrollResponse.parse(response.getStatus().code()); } }); } }) .single() .subscribe(new ListenerCompleterObserver<>(listener)); } catch (Exception e) { listener.onFailure(e); } } }