|
@@ -16,10 +16,15 @@
|
|
|
package com.baomidou.mybatisplus.extension.plugins.pagination;
|
|
|
|
|
|
import com.baomidou.mybatisplus.core.metadata.IPage;
|
|
|
+import com.baomidou.mybatisplus.core.metadata.OrderItem;
|
|
|
import com.baomidou.mybatisplus.core.toolkit.CollectionUtils;
|
|
|
+import org.jetbrains.annotations.Nullable;
|
|
|
|
|
|
+import java.util.ArrayList;
|
|
|
+import java.util.Arrays;
|
|
|
import java.util.Collections;
|
|
|
import java.util.List;
|
|
|
+import java.util.function.Predicate;
|
|
|
|
|
|
/**
|
|
|
* 简单分页模型
|
|
@@ -35,6 +40,7 @@ public class Page<T> implements IPage<T> {
|
|
|
* 查询数据列表
|
|
|
*/
|
|
|
private List<T> records = Collections.emptyList();
|
|
|
+
|
|
|
/**
|
|
|
* 总数
|
|
|
*/
|
|
@@ -43,18 +49,17 @@ public class Page<T> implements IPage<T> {
|
|
|
* 每页显示条数,默认 10
|
|
|
*/
|
|
|
private long size = 10;
|
|
|
+
|
|
|
/**
|
|
|
* 当前页
|
|
|
*/
|
|
|
private long current = 1;
|
|
|
+
|
|
|
/**
|
|
|
- * SQL 排序 ASC 数组
|
|
|
- */
|
|
|
- private String[] ascs;
|
|
|
- /**
|
|
|
- * SQL 排序 DESC 数组
|
|
|
+ * 排序字段信息
|
|
|
*/
|
|
|
- private String[] descs;
|
|
|
+ private List<OrderItem> orders = new ArrayList<>();
|
|
|
+
|
|
|
/**
|
|
|
* 自动优化 COUNT SQL
|
|
|
*/
|
|
@@ -65,7 +70,6 @@ public class Page<T> implements IPage<T> {
|
|
|
private boolean isSearchCount = true;
|
|
|
|
|
|
public Page() {
|
|
|
- // to do nothing
|
|
|
}
|
|
|
|
|
|
/**
|
|
@@ -157,51 +161,150 @@ public class Page<T> implements IPage<T> {
|
|
|
return this;
|
|
|
}
|
|
|
|
|
|
+ /**
|
|
|
+ * 获取当前正序排列的字段集合
|
|
|
+ * <p>
|
|
|
+ * 为了兼容,将在不久后废弃
|
|
|
+ *
|
|
|
+ * @return 正序排列的字段集合
|
|
|
+ * @see #getOrders()
|
|
|
+ * @deprecated 3.1.2.2-SNAPSHOT
|
|
|
+ */
|
|
|
@Override
|
|
|
+ @Nullable
|
|
|
+ @Deprecated
|
|
|
public String[] ascs() {
|
|
|
- return ascs;
|
|
|
+ return CollectionUtils.isNotEmpty(orders) ? mapOrderToArray(OrderItem::isAsc) : null;
|
|
|
}
|
|
|
|
|
|
- public Page<T> setAscs(List<String> ascs) {
|
|
|
- if (CollectionUtils.isNotEmpty(ascs)) {
|
|
|
- this.ascs = ascs.toArray(new String[0]);
|
|
|
+ /**
|
|
|
+ * 查找 order 中正序排序的字段数组
|
|
|
+ *
|
|
|
+ * @param filter 过滤器
|
|
|
+ * @return 返回正序排列的字段数组
|
|
|
+ */
|
|
|
+ private String[] mapOrderToArray(Predicate<OrderItem> filter) {
|
|
|
+ List<String> columns = new ArrayList<>(orders.size());
|
|
|
+ orders.forEach(i -> {
|
|
|
+ if (filter.test(i)) columns.add(i.getColumn());
|
|
|
+ });
|
|
|
+ return columns.toArray(new String[0]);
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 移除符合条件的条件
|
|
|
+ *
|
|
|
+ * @param filter 条件判断
|
|
|
+ */
|
|
|
+ private void removeOrder(Predicate<OrderItem> filter) {
|
|
|
+ for (int i = orders.size() - 1; i >= 0; i--) {
|
|
|
+ if (filter.test(orders.get(i))) orders.remove(i);
|
|
|
}
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 添加新的排序条件,构造条件可以使用工厂:{@link OrderItem#build(String, boolean)}
|
|
|
+ *
|
|
|
+ * @param items 条件
|
|
|
+ * @return 返回分页参数本身
|
|
|
+ */
|
|
|
+ public Page<T> addOrder(OrderItem... items) {
|
|
|
+ orders.addAll(Arrays.asList(items));
|
|
|
return this;
|
|
|
}
|
|
|
|
|
|
+ /**
|
|
|
+ * 设置需要进行正序排序的字段
|
|
|
+ * <p>
|
|
|
+ * Replaced:{@link #addOrder(OrderItem...)}
|
|
|
+ *
|
|
|
+ * @param ascs 字段
|
|
|
+ * @return 返回自身
|
|
|
+ * @deprecated 3.1.2.2-SNAPSHOT
|
|
|
+ */
|
|
|
+ @Deprecated
|
|
|
+ public Page<T> setAscs(List<String> ascs) {
|
|
|
+ return CollectionUtils.isNotEmpty(ascs) ? setAsc(ascs.toArray(new String[0])) : this;
|
|
|
+ }
|
|
|
|
|
|
/**
|
|
|
* 升序
|
|
|
+ * <p>
|
|
|
+ * Replaced:{@link #addOrder(OrderItem...)}
|
|
|
*
|
|
|
* @param ascs 多个升序字段
|
|
|
+ * @deprecated 3.1.2.2-SNAPSHOT
|
|
|
*/
|
|
|
+ @Deprecated
|
|
|
public Page<T> setAsc(String... ascs) {
|
|
|
- this.ascs = ascs;
|
|
|
+ // 保证原来方法 set 的语意
|
|
|
+ removeOrder(OrderItem::isAsc);
|
|
|
+ for (String s : ascs) {
|
|
|
+ addOrder(OrderItem.asc(s));
|
|
|
+ }
|
|
|
return this;
|
|
|
}
|
|
|
|
|
|
+ /**
|
|
|
+ * 获取需简要倒序排列的字段数组
|
|
|
+ * <p>
|
|
|
+ *
|
|
|
+ * @return 倒序排列的字段数组
|
|
|
+ * @see #getOrders()
|
|
|
+ * @deprecated 3.1.2.2-SNAPSHOT
|
|
|
+ */
|
|
|
@Override
|
|
|
+ @Deprecated
|
|
|
public String[] descs() {
|
|
|
- return descs;
|
|
|
+ return mapOrderToArray(i -> !i.isAsc());
|
|
|
}
|
|
|
|
|
|
+ /**
|
|
|
+ * Replaced:{@link #addOrder(OrderItem...)}
|
|
|
+ *
|
|
|
+ * @param descs 需要倒序排列的字段
|
|
|
+ * @return 自身
|
|
|
+ * @deprecated 3.1.2.2-SNAPSHOT
|
|
|
+ */
|
|
|
+ @Deprecated
|
|
|
public Page<T> setDescs(List<String> descs) {
|
|
|
+ // 保证原来方法 set 的语意
|
|
|
if (CollectionUtils.isNotEmpty(descs)) {
|
|
|
- this.descs = descs.toArray(new String[0]);
|
|
|
+ removeOrder(item -> !item.isAsc());
|
|
|
+ for (String s : descs) {
|
|
|
+ addOrder(OrderItem.build(s, false));
|
|
|
+ }
|
|
|
}
|
|
|
return this;
|
|
|
}
|
|
|
|
|
|
/**
|
|
|
- * 降序
|
|
|
+ * 降序,这方法名不知道是谁起的
|
|
|
+ * <p>
|
|
|
+ * Replaced:{@link #addOrder(OrderItem...)}
|
|
|
*
|
|
|
* @param descs 多个降序字段
|
|
|
+ * @deprecated 3.1.2.2-SNAPSHOT
|
|
|
*/
|
|
|
+ @Deprecated
|
|
|
public Page<T> setDesc(String... descs) {
|
|
|
- this.descs = descs;
|
|
|
+ setDescs(Arrays.asList(descs));
|
|
|
return this;
|
|
|
}
|
|
|
|
|
|
+ @Override
|
|
|
+ public List<OrderItem> orders() {
|
|
|
+ return getOrders();
|
|
|
+ }
|
|
|
+
|
|
|
+ public List<OrderItem> getOrders() {
|
|
|
+ return orders;
|
|
|
+ }
|
|
|
+
|
|
|
+ public void setOrders(List<OrderItem> orders) {
|
|
|
+ this.orders = orders;
|
|
|
+ }
|
|
|
+
|
|
|
@Override
|
|
|
public boolean optimizeCountSql() {
|
|
|
return optimizeCountSql;
|
|
@@ -224,4 +327,5 @@ public class Page<T> implements IPage<T> {
|
|
|
this.optimizeCountSql = optimizeCountSql;
|
|
|
return this;
|
|
|
}
|
|
|
+
|
|
|
}
|