All Downloads are FREE. Search and download functionalities are using the official Maven repository.

fr.ouestfrance.querydsl.postgrest.model.Page Maven / Gradle / Ivy

package fr.ouestfrance.querydsl.postgrest.model;

import java.util.Arrays;
import java.util.Iterator;
import java.util.List;
import java.util.function.Function;
import java.util.stream.Stream;

/**
 * Representation of a Page, a page is an iterable item which have list of elements, pageable information
 * and totalSizeElements and totalPage
 *
 * @param  type of item
 */
public interface Page extends Iterable {

    /**
     * Create simple page from items
     *
     * @param items items
     * @param    type of items
     * @return one page of items
     */
    @SafeVarargs
    static  Page of(T... items) {
        return new PageImpl<>(Arrays.asList(items), Pageable.unPaged(), items.length, 1);
    }

    /**
     * Create an empty page
     *
     * @param  type of items
     * @return empty page
     */
    static  Page empty() {
        return new PageImpl<>(List.of(), Pageable.unPaged(), 0, 0);
    }

    /**
     * Get data for a page
     *
     * @return data for a page
     */
    List getData();

    /**
     * Get page request infomations
     *
     * @return Pageable information with number of elements, number of the page and sort options
     */
    Pageable getPageable();

    /**
     * Get size of page
     *
     * @return size of the data for the current page
     */
    default int size() {
        return getData().size();
    }

    /**
     * Get total elements from the datasource
     *
     * @return total elements
     */
    long getTotalElements();

    /**
     * Get the total pages
     *
     * @return total pages
     */
    int getTotalPages();

    /**
     * Streaming from the page
     *
     * @return stream
     */
    default Stream stream() {
        return getData().stream();
    }

    @Override
    default Iterator iterator() {
        return getData().iterator();
    }

    /**
     * Convert a page
     *
     * @param converter function that convert type to another
     * @param        type of returned object
     * @return page converted
     */
    default  Page map(Function converter) {
        return new PageImpl<>(stream().map(converter).toList(), getPageable(), getTotalElements(), getTotalPages());
    }

    /**
     * Check that page has next page
     *
     * @return true if totalPages is greater than pageNumber
     */
    default boolean hasNext() {
        return getPageable().getPageNumber() + 1 < getTotalPages();
    }
}