From d6681e133ad2021de45546d1329662654f3a2519 Mon Sep 17 00:00:00 2001 From: ZhouXY108 Date: Sun, 10 Aug 2025 16:50:21 +0800 Subject: [PATCH] =?UTF-8?q?refactor:=20=E5=B0=86=E6=9E=84=E5=BB=BA?= =?UTF-8?q?=E8=BF=87=E7=A8=8B=E6=94=BE=E5=9C=A8=20Builder=20=E4=B8=AD?= =?UTF-8?q?=E4=BB=A5=E9=81=BF=E5=85=8D=E9=87=8D=E5=A4=8D=E6=A0=A1=E9=AA=8C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../dto/PagingAndSortingQueryParams.java | 108 ++++++++---------- .../PagingAndSortingQueryParamsTests.java | 9 +- 2 files changed, 52 insertions(+), 65 deletions(-) diff --git a/plusone-commons/src/main/java/xyz/zhouxy/plusone/commons/model/dto/PagingAndSortingQueryParams.java b/plusone-commons/src/main/java/xyz/zhouxy/plusone/commons/model/dto/PagingAndSortingQueryParams.java index a9ccf87..78210a7 100644 --- a/plusone-commons/src/main/java/xyz/zhouxy/plusone/commons/model/dto/PagingAndSortingQueryParams.java +++ b/plusone-commons/src/main/java/xyz/zhouxy/plusone/commons/model/dto/PagingAndSortingQueryParams.java @@ -27,7 +27,6 @@ import javax.annotation.Nullable; import com.google.common.collect.ImmutableMap; -import xyz.zhouxy.plusone.commons.annotation.Virtual; import xyz.zhouxy.plusone.commons.collection.CollectionTools; import xyz.zhouxy.plusone.commons.util.RegexTools; import xyz.zhouxy.plusone.commons.util.StringTools; @@ -45,30 +44,10 @@ import xyz.zhouxy.plusone.commons.util.StringTools; */ public class PagingAndSortingQueryParams { - private static final int DEFAULT_PAGE_SIZE = 15; - private Integer size; private Long pageNum; private List orderBy; - private static final Pattern SORT_STR_PATTERN = Pattern.compile("^[a-zA-Z][\\w-]{0,63}-(desc|asc|DESC|ASC)$"); - - private final Map sortableProperties; - - /** - * 构造分页排序查询参数 - * - * @param sortableProperties 可排序的属性。不可为空。 - */ - public PagingAndSortingQueryParams(Map sortableProperties) { - checkArgument(CollectionTools.isNotEmpty(sortableProperties), - "Sortable properties can not be empty."); - sortableProperties.forEach((k, v) -> - checkArgument(StringTools.isNotBlank(k) && StringTools.isNotBlank(v), - "Property name must not be blank.")); - this.sortableProperties = ImmutableMap.copyOf(sortableProperties); - } - // Setters /** @@ -100,56 +79,18 @@ public class PagingAndSortingQueryParams { // Setters end - /** - * 构建分页参数 - * - * @return {@code PagingParams} 对象 - */ - public final PagingParams buildPagingParams() { - final int sizeValue = this.size != null ? this.size : defaultSizeInternal(); - final long pageNumValue = this.pageNum != null ? this.pageNum : 1L; - checkArgument(CollectionTools.isNotEmpty(this.orderBy), - "The 'orderBy' cannot be empty"); - final List propertiesToSort = this.orderBy.stream() - .map(this::generateSortableProperty) - .collect(Collectors.toList()); - return new PagingParams(sizeValue, pageNumValue, propertiesToSort); - } - - /** - * 默认每页大小 - * - *

NOTE: 可覆写此方法

- * - * @return 默认每页大小 - */ - @Virtual - protected int defaultSizeInternal() { - return DEFAULT_PAGE_SIZE; - } - @Override public String toString() { return "PagingAndSortingQueryParams [" + "size=" + size + ", pageNum=" + pageNum + ", orderBy=" + orderBy - + ", sortableProperties=" + sortableProperties + "]"; } - private SortableProperty generateSortableProperty(String orderByStr) { - checkArgument(StringTools.isNotBlank(orderByStr)); - checkArgument(RegexTools.matches(orderByStr, SORT_STR_PATTERN)); - String[] propertyNameAndOrderType = orderByStr.split("-"); - checkArgument(propertyNameAndOrderType.length == 2); - - String propertyName = propertyNameAndOrderType[0]; - checkArgument(sortableProperties.containsKey(propertyName), - "The property name must be in the set of sortable properties."); - String columnName = sortableProperties.get(propertyName); - String orderType = propertyNameAndOrderType[1]; - return new SortableProperty(propertyName, columnName, orderType); + protected static PagingParamsBuilder pagingParamsBuilder( + int defaultSize, int maxSize, Map sortableProperties) { + return new PagingParamsBuilder(defaultSize, maxSize, sortableProperties); } /** @@ -217,4 +158,47 @@ public class PagingAndSortingQueryParams { } } + protected static final class PagingParamsBuilder { + private static final Pattern SORT_STR_PATTERN = Pattern.compile("^[a-zA-Z][\\w-]{0,63}-(desc|asc|DESC|ASC)$"); + + private final Map sortableProperties; + protected final int defaultSize; + protected final int maxSize; + + private PagingParamsBuilder(int defaultSize, int maxSize, Map sortableProperties) { + this.defaultSize = defaultSize; + this.maxSize = maxSize; + checkArgument(CollectionTools.isNotEmpty(sortableProperties), + "Sortable properties can not be empty."); + sortableProperties.forEach((k, v) -> + checkArgument(StringTools.isNotBlank(k) && StringTools.isNotBlank(v), + "Property name must not be blank.")); + this.sortableProperties = ImmutableMap.copyOf(sortableProperties); + } + + public PagingParams buildPagingParams(PagingAndSortingQueryParams params) { + final int sizeValue = params.size != null ? params.size : this.defaultSize; + final long pageNumValue = params.pageNum != null ? params.pageNum : 1L; + checkArgument(CollectionTools.isNotEmpty(params.orderBy), + "The 'orderBy' cannot be empty"); + final List propertiesToSort = params.orderBy.stream() + .map(this::generateSortableProperty) + .collect(Collectors.toList()); + return new PagingParams(sizeValue, pageNumValue, propertiesToSort); + } + + private SortableProperty generateSortableProperty(String orderByStr) { + checkArgument(StringTools.isNotBlank(orderByStr)); + checkArgument(RegexTools.matches(orderByStr, SORT_STR_PATTERN)); + String[] propertyNameAndOrderType = orderByStr.split("-"); + checkArgument(propertyNameAndOrderType.length == 2); + + String propertyName = propertyNameAndOrderType[0]; + checkArgument(sortableProperties.containsKey(propertyName), + "The property name must be in the set of sortable properties."); + String columnName = sortableProperties.get(propertyName); + String orderType = propertyNameAndOrderType[1]; + return new SortableProperty(propertyName, columnName, orderType); + } + } } diff --git a/plusone-commons/src/test/java/xyz/zhouxy/plusone/commons/model/dto/test/PagingAndSortingQueryParamsTests.java b/plusone-commons/src/test/java/xyz/zhouxy/plusone/commons/model/dto/test/PagingAndSortingQueryParamsTests.java index 7b3a7ee..f548390 100644 --- a/plusone-commons/src/test/java/xyz/zhouxy/plusone/commons/model/dto/test/PagingAndSortingQueryParamsTests.java +++ b/plusone-commons/src/test/java/xyz/zhouxy/plusone/commons/model/dto/test/PagingAndSortingQueryParamsTests.java @@ -231,9 +231,8 @@ class AccountQueryParams extends PagingAndSortingQueryParams { .put("createTime", "create_time") .build(); - public AccountQueryParams() { - super(PROPERTY_COLUMN_MAP); - } + private static final PagingParamsBuilder PAGING_PARAMS_BUILDER = PagingAndSortingQueryParams + .pagingParamsBuilder(20, 100, PROPERTY_COLUMN_MAP); private @Getter @Setter Long id; private @Getter @Setter String username; @@ -249,6 +248,10 @@ class AccountQueryParams extends PagingAndSortingQueryParams { } return this.createTimeEnd.plusDays(1); } + + public PagingParams buildPagingParams() { + return PAGING_PARAMS_BUILDER.buildPagingParams(this); + } } @Data