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 <T> Page<T> of(int pageNumber, int pageSize) {
036        return new Page<>(pageNumber, pageSize);
037    }
038
039    public static <T> Page<T> 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.setPageNumber(pageNumber);
049        this.setPageSize(pageSize);
050    }
051
052    public Page(int pageNumber, int pageSize, long totalRow) {
053        this.setPageNumber(pageNumber);
054        this.setPageSize(pageSize);
055        this.setTotalRow(totalRow);
056    }
057
058
059    public Page(List<T> records, int pageNumber, int pageSize, long totalRow) {
060        this.setRecords(records);
061        this.setPageNumber(pageNumber);
062        this.setPageSize(pageSize);
063        this.setTotalRow(totalRow);
064    }
065
066
067    public List<T> getRecords() {
068        return records;
069    }
070
071    public void setRecords(List<T> records) {
072        if (records == null) {
073            records = Collections.emptyList();
074        }
075        this.records = records;
076    }
077
078    public int getPageNumber() {
079        return pageNumber;
080    }
081
082    public void setPageNumber(int pageNumber) {
083        if (pageNumber < 1) {
084            throw new IllegalArgumentException("pageNumber must greater than or equal 1,current value is: " + pageNumber);
085        }
086        this.pageNumber = pageNumber;
087    }
088
089
090    public int getPageSize() {
091        return pageSize;
092    }
093
094    public void setPageSize(int pageSize) {
095        if (pageSize < 0) {
096            throw new IllegalArgumentException("pageSize must greater than or equal 0,current value is: " + pageSize);
097        }
098        this.pageSize = pageSize;
099        this.calcTotalPage();
100    }
101
102    public long getTotalPage() {
103        return totalPage;
104    }
105
106    public void setTotalPage(long totalPage) {
107        this.totalPage = totalPage;
108    }
109
110    public long getTotalRow() {
111        return totalRow;
112    }
113
114    public void setTotalRow(long totalRow) {
115        if (totalRow < 0) {
116            throw new IllegalArgumentException("totalRow must greater than or equal 0,current value is: " + totalRow);
117        }
118        this.totalRow = totalRow;
119        this.calcTotalPage();
120    }
121
122    /**
123     * 计算总页码
124     */
125    private void calcTotalPage() {
126        if (totalPage == INIT_VALUE && pageSize != INIT_VALUE && totalRow != INIT_VALUE) {
127            totalPage = totalRow % pageSize == 0 ? (totalRow / pageSize) : (totalRow / pageSize + 1);
128        }
129    }
130
131
132    public <R> Page<R> map(Function<? super T, ? extends R> mapper) {
133        Page<R> newPage = new Page<>();
134        newPage.pageNumber = pageNumber;
135        newPage.pageSize = pageSize;
136        newPage.totalPage = totalPage;
137        newPage.totalRow = totalRow;
138
139        if (records != null && !records.isEmpty()) {
140            List<R> newRecords = new ArrayList<>(records.size());
141            for (T t : records) {
142                newRecords.add(mapper.apply(t));
143            }
144            newPage.records = newRecords;
145        }
146        return newPage;
147    }
148
149
150    @Override
151    public String toString() {
152        return "Page{" +
153                "pageNumber=" + pageNumber +
154                ", pageSize=" + pageSize +
155                ", totalPage=" + totalPage +
156                ", totalRow=" + totalRow +
157                ", records=" + records +
158                '}';
159    }
160}