package sample.context.orm; import java.math.RoundingMode; import lombok.*; import sample.context.Dto; import sample.context.orm.Sort.SortOrder; import sample.util.Calculator; /** * ページング情報を表現します。 */ @Data @AllArgsConstructor public class Pagination implements Dto { private static final long serialVersionUID = 1l; public static final int DefaultSize = 100; /** ページ数(1開始) */ private int page; /** ページあたりの件数 */ private int size; /** トータル件数 */ private Long total; /** トータル件数算出を無視するか */ private boolean ignoreTotal; /** ソート条件 */ private Sort sort; public Pagination() { this(1); } public Pagination(int page) { this(page, DefaultSize, null, false, new Sort()); } public Pagination(int page, int size) { this(page, size, null, false, new Sort()); } public Pagination(int page, int size, final Sort sort) { this(page, size, null, false, sort); } public Pagination(final Pagination req, long total) { this(req.getPage(), req.getSize(), total, false, req.getSort()); } /** カウント算出を無効化します。 */ public Pagination ignoreTotal() { this.ignoreTotal = true; return this; } /** ソート指定が未指定の時は与えたソート条件で上書きします。 */ public Pagination sortIfEmpty(SortOrder... orders) { if (sort != null) sort.ifEmpty(orders); return this; } /** 最大ページ数を返します。total設定時のみ適切な値が返されます。 */ public int getMaxPage() { return (total == null) ? 0 : Calculator.of(total) .scale(0, RoundingMode.UP).divideBy(size).intValue(); } /** 開始件数を返します。 */ public int getFirstResult() { return (page - 1) * size; } }