package org.wikipedia.util;
import android.support.annotation.NonNull;
import org.wikipedia.page.PageTitle;
import java.util.List;
import static org.wikipedia.Constants.API_QUERY_MAX_TITLES;
public final class BatchUtil {
// Useful for API requests in which we want a number of results that exceeds the limit for at
// least one of the modules being used in the query (e.g., 50 for PageImages).
//
// TODO: This function does not yet handle batchcomplete. For requests using a generator
// together with properties, the API result may signal to continue because there are more
// properties to retrieve for the pages so far, or because there are more pages from the
// generator, or both.
//
// https://www.mediawiki.org/wiki/API:Query#batchcomplete
//
// Implement continuation/batchcomplete handling if we want to batch requests for a query in
// which we are using a generator.
//
// Bug: T162497
public static <T> void makeBatches(@NonNull final List<PageTitle> titles,
@NonNull Handler<T> handler,
@NonNull final Callback<T> callback) {
for (int i = 0; i < titles.size(); i += Math.min(API_QUERY_MAX_TITLES, titles.size() - i)) {
handler.handleBatch(titles.subList(i, i + Math.min(API_QUERY_MAX_TITLES, titles.size() - i)),
titles.size(), new Callback<T>() {
@Override
public void success(@NonNull List<T> results) {
callback.success(results);
}
@Override
public void failure(@NonNull Throwable caught) {
callback.failure(caught);
}
});
}
}
public interface Handler<T> {
void handleBatch(@NonNull List<PageTitle> batchTitles, int total, Callback<T> cb);
}
public interface Callback<T> {
void success(@NonNull List<T> results);
void failure(@NonNull Throwable caught);
}
private BatchUtil() {
}
}