001/**
002 * Copyright (c) 2022-2023, Mybatis-Flex (fuhai999@gmail.com).
003 * <p>
004 * Licensed under the Apache License, Version 2.0 (the "License");
005 * you may not use this file except in compliance with the License.
006 * You may obtain a copy of the License at
007 * <p>
008 * http://www.apache.org/licenses/LICENSE-2.0
009 * <p>
010 * Unless required by applicable law or agreed to in writing, software
011 * distributed under the License is distributed on an "AS IS" BASIS,
012 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
013 * See the License for the specific language governing permissions and
014 * limitations under the License.
015 */
016package com.mybatisflex.core.paginate;
017
018import java.io.Serializable;
019import java.util.ArrayList;
020import java.util.Collections;
021import java.util.List;
022import java.util.function.Function;
023
024public class Page<T> implements Serializable {
025
026    private static final long serialVersionUID = 1L;
027    private static final int INIT_VALUE = -1;
028
029    private List<T> records = Collections.emptyList();
030    private int pageNumber = INIT_VALUE;
031    private int pageSize = INIT_VALUE;
032    private long totalPage = INIT_VALUE;
033    private long totalRow = INIT_VALUE;
034
035    public static Page of(int pageNumber, int pageSize) {
036        return new Page(pageNumber, pageSize);
037    }
038
039    public static Page of(int pageNumber, int pageSize, long totalRow) {
040        return new Page(pageNumber, pageSize, totalRow);
041    }
042
043    public Page() {
044
045    }
046
047    public Page(int pageNumber, int pageSize) {
048        this.pageNumber = pageNumber;
049        this.pageSize = pageSize;
050    }
051
052    public Page(int pageNumber, int pageSize, long totalRow) {
053        this.pageNumber = pageNumber;
054        this.pageSize = pageSize;
055        this.totalRow = totalRow;
056        this.totalPage = totalRow % pageSize == 0 ? (totalRow / pageSize) : (totalRow / pageSize + 1);
057    }
058
059    public Page(List<T> records, int pageNumber, int pageSize, long totalRow) {
060        this.records = records;
061        this.pageNumber = pageNumber;
062        this.pageSize = pageSize;
063        this.totalRow = totalRow;
064        this.totalPage = totalRow % pageSize == 0 ? (totalRow / pageSize) : (totalRow / pageSize + 1);
065    }
066
067
068    public List<T> getRecords() {
069        return records;
070    }
071
072    public void setRecords(List<T> records) {
073        this.records = records;
074    }
075
076    public int getPageNumber() {
077        return pageNumber;
078    }
079
080    public void setPageNumber(int pageNumber) {
081        this.pageNumber = pageNumber;
082    }
083
084
085    public int getPageSize() {
086        return pageSize;
087    }
088
089    public void setPageSize(int pageSize) {
090        this.pageSize = pageSize;
091    }
092
093    public long getTotalPage() {
094        return totalPage;
095    }
096
097    public void setTotalPage(long totalPage) {
098        this.totalPage = totalPage;
099    }
100
101    public long getTotalRow() {
102        return totalRow;
103    }
104
105    public void setTotalRow(long totalRow) {
106        this.totalRow = totalRow;
107        this.totalPage = totalRow % pageSize == 0 ? (totalRow / pageSize) : (totalRow / pageSize + 1);
108    }
109
110    public <R> Page<R> map(Function<? super T, ? extends R> mapper) {
111        Page<R> newPage = new Page<>();
112        newPage.pageNumber = pageNumber;
113        newPage.pageSize = pageSize;
114        newPage.totalPage = totalPage;
115        newPage.totalRow = totalRow;
116
117        if (records != null) {
118            List<R> newRecords = new ArrayList<>(records.size());
119            for (T t : records) {
120                newRecords.add(mapper.apply(t));
121            }
122            newPage.records = newRecords;
123        }
124        return newPage;
125    }
126
127
128    @Override
129    public String toString() {
130        return "Page{" +
131                "pageNumber=" + pageNumber +
132                ", pageSize=" + pageSize +
133                ", totalPage=" + totalPage +
134                ", totalRow=" + totalRow +
135                ", records=" + records +
136                '}';
137    }
138}