Class Paginator<RQ,​RS,​T>

  • Type Parameters:
    RQ - request type
    RS - response type
    T - item type
    All Implemented Interfaces:
    Iterable<T>

    public class Paginator<RQ,​RS,​T>
    extends Object
    implements Iterable<T>
    Consistent pagination support for all APIs
    • Constructor Detail

      • Paginator

        public Paginator​(RQ request,
                         Function<RQ,​RS> requestFn,
                         Function<RS,​Collection<T>> itemsFn,
                         Function<RS,​RQ> nextPageFn)
        Repeatedly call `requestFn` until `nextPageFn` returns non-null result.

        Example: return new Paginator<>(request, impl::listRuns, ListRunsResponse::getRuns, response -> { Long offset = request.getOffset(); if (offset == null) { offset = 0L; } offset += response.getRuns().size(); return request.setOffset(offset); }).withDedupe(BaseRun::getRunId);

        Parameters:
        request - initial request to `requestFn` implementation, possibly with filters.
        requestFn - implementation of request, that takes modified `request` and returns some results.
        itemsFn - reference to the getter method, that returns `Collection` of results.
        nextPageFn - return non-null request in case we need to fetch another page of results.
    • Method Detail

      • withDedupe

        public <ID> Iterable<T> withDedupe​(Function<T,​ID> idGetter)
        De-duplicate results across all pages with an ID

        This call is only necessary for offset/limit pagination, where additions/removals may get inconsistent results across multiple page calls

        Type Parameters:
        ID - ID type, like Long
        Parameters:
        idGetter - reference to ID getter
        Returns:
        ID value, like 92384023984