From 21f577c65efe553e2ab8192466e390ea8fa53607 Mon Sep 17 00:00:00 2001 From: AlexBob <5199840@qq.com> Date: Mon, 16 Dec 2024 11:24:44 +0800 Subject: [PATCH] =?UTF-8?q?=E2=99=BB=EF=B8=8F=20refactor(`commons/utils/qu?= =?UTF-8?q?ery`):=20Overhaul=20query=20building=20utilities=20for=20improv?= =?UTF-8?q?ed=20performance=20and=20readability.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../plate/boot/commons/base/BaseEntity.java | 2 +- .../boot/commons/utils/query/Operation.java | 57 ------ .../commons/utils/query/QueryFragment.java | 45 +++-- .../boot/commons/utils/query/QueryHelper.java | 189 +++++++----------- .../commons/utils/query/QueryJsonHelper.java | 8 +- .../relational/logger/LoggersService.java | 5 +- .../security/core/group/GroupRequest.java | 7 - .../security/core/group/GroupsService.java | 10 +- .../core/group/member/GroupMemberRequest.java | 10 +- .../group/member/GroupMembersService.java | 4 +- .../security/core/tenant/TenantRequest.java | 6 - .../security/core/tenant/TenantsService.java | 10 +- .../tenant/member/TenantMembersService.java | 2 +- 13 files changed, 114 insertions(+), 241 deletions(-) delete mode 100644 boot/platform/src/main/java/com/plate/boot/commons/utils/query/Operation.java diff --git a/boot/platform/src/main/java/com/plate/boot/commons/base/BaseEntity.java b/boot/platform/src/main/java/com/plate/boot/commons/base/BaseEntity.java index 05a99da3..1734103a 100644 --- a/boot/platform/src/main/java/com/plate/boot/commons/base/BaseEntity.java +++ b/boot/platform/src/main/java/com/plate/boot/commons/base/BaseEntity.java @@ -111,6 +111,6 @@ default Criteria criteria(Collection skipKeys) { * prevent SQL injection, ensuring secure query execution. */ default QueryFragment querySql(Collection skipKeys) { - return QueryHelper.query(this, skipKeys, null); + return QueryHelper.query(this, skipKeys); } } \ No newline at end of file diff --git a/boot/platform/src/main/java/com/plate/boot/commons/utils/query/Operation.java b/boot/platform/src/main/java/com/plate/boot/commons/utils/query/Operation.java deleted file mode 100644 index 71006a0c..00000000 --- a/boot/platform/src/main/java/com/plate/boot/commons/utils/query/Operation.java +++ /dev/null @@ -1,57 +0,0 @@ -package com.plate.boot.commons.utils.query; - -import lombok.Getter; - -/** - * 这是一个表示操作的类。 - *

- * 该类可能包含执行特定操作的方法。 - * 例如,它可能包含数学运算、数据操作或其他类型的处理。 - * 这里没有具体的实现细节,因为代码片段没有提供足够的信息。 - *

- * - * @author Alex Bob - * @version 1.0 - */ -@Getter -public enum Operation { - EQ("="), - EQUAL("="), - AFTER(">"), - GREATER_THAN_EQUAL(">="), - GTE(">="), - GREATER_THAN(">"), - GT(">"), - BEFORE("<"), - LESS_THAN_EQUAL("<="), - LTE("<="), - LESS_THAN("<"), - LT("<"), - BETWEEN("between"), - NOT_BETWEEN("not between"), - NOT_IN("not in"), - IN("in"), - IS_NOT_NULL("is not null"), - NOT_NULL("is not null"), - IS_NULL("is null"), - NULL("is null"), - NOT_LIKE("not like"), - LIKE("like"), - STARTING_WITH("like '%s'"), - ENDING_WITH("like '%s'"), - IS_NOT_LIKE("not like"), - CONTAINING("like '%s'"), - NOT_CONTAINING("not like"), - NOT("!="), - IS_TRUE("is true"), - TRUE("is true"), - IS_FALSE("is false"), - FALSE("is false"); - - private final String sqlOperator; - - Operation(String sqlOperator) { - this.sqlOperator = sqlOperator; - } - -} diff --git a/boot/platform/src/main/java/com/plate/boot/commons/utils/query/QueryFragment.java b/boot/platform/src/main/java/com/plate/boot/commons/utils/query/QueryFragment.java index 223eb485..16dd1c05 100644 --- a/boot/platform/src/main/java/com/plate/boot/commons/utils/query/QueryFragment.java +++ b/boot/platform/src/main/java/com/plate/boot/commons/utils/query/QueryFragment.java @@ -2,7 +2,6 @@ import com.plate.boot.commons.exception.QueryException; import lombok.Getter; -import org.springframework.util.StringUtils; import java.util.HashMap; import java.util.Map; @@ -17,33 +16,36 @@ @Getter public class QueryFragment extends HashMap { + private final StringJoiner columns = new StringJoiner(","); + private final StringJoiner querySql = new StringJoiner(","); private final StringJoiner whereSql = new StringJoiner(" AND "); private final StringJoiner orderSql = new StringJoiner(","); - private final String pageSql; + private final int size; + + private final long offset; - public QueryFragment(String pageSql, Map params) { + public QueryFragment(int size, long offset, Map params) { super(16); - this.pageSql = pageSql; + this.size = size; + this.offset = offset; this.putAll(params); } - /** - * Creates a new instance of {@link QueryFragment} with the provided conditional SQL - * fragment and parameters map. - * - * @param pageSql A {@link StringJoiner} object containing the dynamically - * constructed WHERE clause segments of a SQL query, concatenated by 'and'. - * @param params A {@link Map} of parameter names to values, which will be - * substituted for placeholders within the SQL query to prevent SQL injection. - * @return A new {@link QueryFragment} instance encapsulating the given SQL fragment - * and parameters map, ready for use in preparing a parameterized SQL statement. - */ - public static QueryFragment of(String pageSql, Map params) { - return new QueryFragment(pageSql, params); + public static QueryFragment of(Map params) { + return of(25, 0, params); + } + + public static QueryFragment of(int size, long offset, Map params) { + return new QueryFragment(size, offset, params); + } + + public QueryFragment addColumn(CharSequence column) { + columns.add(column); + return this; } public QueryFragment addQuery(CharSequence query) { @@ -73,10 +75,11 @@ public QueryFragment mergeOrder(StringJoiner order) { public QueryFragment merge(QueryFragment fragment) { this.putAll(fragment); + this.columns.merge(fragment.getColumns()); this.querySql.merge(fragment.getQuerySql()); this.whereSql.merge(fragment.getWhereSql()); this.orderSql.merge(fragment.getOrderSql()); - return of(fragment.getPageSql(), this); + return of(fragment.getSize(), fragment.getOffset(), this); } /** @@ -102,7 +105,8 @@ public String orderSql() { public String querySql() { if (this.querySql.length() > 0) { - return this.querySql + whereSql() + orderSql() + (StringUtils.hasLength(this.pageSql) ? this.pageSql : ""); + return String.format("SELECT %s FROM %s %s %s LIMIT %d OFFSET %d", + this.columns, this.querySql, whereSql(), orderSql(), this.size, this.offset); } throw QueryException.withError("This querySql is null, please use whereSql() method!", new IllegalArgumentException("This querySql is null, please use whereSql() method")); @@ -110,7 +114,8 @@ public String querySql() { public String countSql() { if (this.querySql.length() > 0) { - return "SELECT COUNT(*) FROM (" + this.querySql + whereSql() + ") t"; + return "SELECT COUNT(*) FROM (" + String.format("SELECT %s FROM %s", this.columns, this.querySql) + + whereSql() + ") t"; } throw QueryException.withError("This countSql is null, please use whereSql() method!", new IllegalArgumentException("This countSql is null, please use whereSql() method")); diff --git a/boot/platform/src/main/java/com/plate/boot/commons/utils/query/QueryHelper.java b/boot/platform/src/main/java/com/plate/boot/commons/utils/query/QueryHelper.java index 88e48862..cee4733b 100644 --- a/boot/platform/src/main/java/com/plate/boot/commons/utils/query/QueryHelper.java +++ b/boot/platform/src/main/java/com/plate/boot/commons/utils/query/QueryHelper.java @@ -11,7 +11,10 @@ import org.springframework.util.ObjectUtils; import org.springframework.util.StringUtils; -import java.util.*; +import java.util.Collection; +import java.util.List; +import java.util.Map; +import java.util.Set; import java.util.stream.Collectors; /** @@ -24,153 +27,97 @@ public final class QueryHelper { public static final Set SKIP_CRITERIA_KEYS = Set.of("extend", "createdTime", "updatedTime", "securityCode", "query", "search"); - /** - * Applies pagination to a SQL query string based on the provided {@link Pageable} object. - * This is a convenience overload that delegates to applyPage(Pageable) - * with a null prefix, used primarily when no prefix is needed for generating the SQL LIMIT and OFFSET clauses. - * - * @param pageable The pagination information, including page size and offset. - * @return A string representing the pagination part of the SQL query, i.e., "LIMIT {pageSize} OFFSET {offset}". - */ - public static String applyPage(Pageable pageable) { - return String.format(" LIMIT %d OFFSET %d", pageable.getPageSize(), pageable.getOffset()); - + public static QueryFragment query(Object object, Pageable pageable) { + return query(object, pageable, List.of(), null); } - - /** - * Applies sorting to a SQL query string based on the provided {@link Sort} object, with an optional prefix for property names. - * Transforms the sort orders into SQL-compatible sort clauses, considering case insensitivity and JSON field access notation. - * If the sort is unsorted or null, defaults to sorting by 'id' in descending order. - * - * @param sort The sorting criteria specifying the properties and directions for sorting. - * @param prefix An optional prefix to prepend to each sorted property name, useful when dealing with table aliases or nested properties. - * @return A string representing the sorting part of the SQL query, starting with "ORDER BY", - * followed by comma-separated sort clauses, each in the format "property_name ASC/DESC". - */ - public static StringJoiner applySort(Sort sort, String prefix) { - sort = QueryJsonHelper.transformSortForJson(sort); - StringJoiner sortSql = new StringJoiner(", "); - for (Sort.Order order : sort) { - String sortedPropertyName = order.getProperty(); - String sortedProperty = order.isIgnoreCase() ? "lower(" + sortedPropertyName + ")" : sortedPropertyName; - if (StringUtils.hasLength(prefix)) { - sortedProperty = prefix + "." + sortedProperty; - } - sortSql.add(sortedProperty + (order.isAscending() ? " asc" : " desc")); - } - return sortSql; - } - public static QueryFragment query(Object object, Pageable pageable, String querySql) { - return query(object, pageable, querySql, List.of(), null); + public static QueryFragment query(Object object, Collection skipKeys) { + return query(object, Pageable.ofSize(25), skipKeys, null); } - public static QueryFragment query(Object object, Pageable pageable, String querySql, String prefix) { - return query(object, pageable, querySql, List.of(), prefix); + public static QueryFragment query(Object object, Collection skipKeys, String prefix) { + return query(object, Pageable.ofSize(25), skipKeys, prefix); } - public static QueryFragment query(Object object, Pageable pageable, String querySql, Collection skipKeys, String prefix) { - QueryFragment queryFragment = query(object, querySql, QueryHelper.applyPage(pageable), skipKeys, prefix); - return queryFragment.mergeOrder(QueryHelper.applySort(pageable.getSort(), prefix)); + public static QueryFragment query(Object object, Pageable pageable, String prefix) { + return query(object, pageable, List.of(), prefix); } - /** - * Constructs a QueryFragment for dynamic SQL WHERE clause generation based on an object's properties. - * Excludes specified keys and allows for an optional prefix to be applied to column names. - * This method also processes a special "query" property within the object, which contains - * a nested map of conditions, and applies additional security-related conditions if present. - * - * @param object The source object whose properties will be used to construct the query conditions. - * Properties should map to filter values. A special property "query" can be used - * to pass a nested map of conditions. - * @param skipKeys A collection of strings representing property names to exclude from the query conditions. - * These properties will not be included in the generated WHERE clause. - * @param prefix An optional prefix to prepend to each property name in the SQL query, - * useful for specifying table aliases or namespaces. - * @return A QueryFragment containing the concatenated SQL WHERE conditions and a map of parameters. - * The SQL conditions are joined by 'and', and the parameters map binds placeholders to actual values. - */ @SuppressWarnings("unchecked") - public static QueryFragment query(Object object, String sql, String pageSql, Collection skipKeys, String prefix) { + public static QueryFragment query(Object object, Pageable pageable, Collection skipKeys, String prefix) { Map objectMap = BeanUtils.beanToMap(object, false, true); - QueryFragment queryFragment = QueryFragment.of(pageSql, objectMap); - String querySql = StringUtils.hasLength(sql) ? sql : querySqlBuilder(object); - queryFragment.addQuery(querySql); + Map filterMap = ObjectUtils.isEmpty(objectMap) ? Map.of() : + Maps.filterKeys(objectMap, key -> !SKIP_CRITERIA_KEYS.contains(key) && !skipKeys.contains(key)); + + QueryFragment queryFragment = QueryFragment.of(pageable.getPageSize(), pageable.getOffset(), filterMap); + QueryHelper.applySort(queryFragment, pageable.getSort(), prefix); + QueryHelper.applyWhere(queryFragment, prefix); + QueryHelper.applyQuerySql(queryFragment, object); + if (ObjectUtils.isEmpty(objectMap)) { return queryFragment; } - if (objectMap.containsKey("search") && !ObjectUtils.isEmpty(objectMap.get("search"))) { - String textSearch = (String) objectMap.get("search"); - queryFragment.addQuery("ts_rank_cd(text_search, query) as rank"); - queryFragment.addQuery("to_tsquery('chinese',:textSearch) query"); - queryFragment.addWhere("text_search @@ to_tsquery('chinese',:textSearch)"); - queryFragment.put("textSearch", textSearch); - } - if (objectMap.containsKey("query")) { - var jsonMap = (Map) objectMap.get("query"); + String queryKey = "query"; + if (objectMap.containsKey(queryKey)) { + Map jsonMap = (Map) objectMap.get(queryKey); QueryFragment jsonQueryFragment = QueryJsonHelper.queryJson(jsonMap, prefix); queryFragment.merge(jsonQueryFragment); } String securityCodeKey = "securityCode"; if (!skipKeys.contains(securityCodeKey) && objectMap.containsKey(securityCodeKey)) { - QueryFragment securityCondition = securityCondition(objectMap.get(securityCodeKey), prefix); - queryFragment.merge(securityCondition); + String key = "tenant_code"; + if (StringUtils.hasLength(prefix)) { + key = prefix + "." + key; + } + queryFragment.addWhere(key + " LIKE :securityCode"); + queryFragment.put("securityCode", objectMap.get(securityCodeKey)); } - objectMap = Maps.filterKeys(objectMap, key -> !SKIP_CRITERIA_KEYS.contains(key) && !skipKeys.contains(key)); - if (!ObjectUtils.isEmpty(objectMap)) { - QueryFragment entityQueryFragment = query(objectMap, prefix); - queryFragment.merge(entityQueryFragment); + String searchKey = "search"; + if (objectMap.containsKey(searchKey) && !ObjectUtils.isEmpty(objectMap.get(searchKey))) { + String textSearch = (String) objectMap.get(searchKey); + queryFragment.addColumn("TS_RANK_CD(text_search, queryTextSearch) AS rank"); + queryFragment.addQuery("TO_TSQUERY('chinese',:textSearch) queryTextSearch"); + queryFragment.addWhere("text_search @@ TO_TSQUERY('chinese',:textSearch)"); + queryFragment.put("textSearch", textSearch); } return queryFragment; } - private static String querySqlBuilder(Object object) { - String query = "SELECT * %1$s FROM #table_name %2$s"; - Class objectClass = object.getClass(); - Table table = objectClass.getAnnotation(Table.class); - if (!ObjectUtils.isEmpty(table)) { - String tableName = StringUtils.hasLength(table.value()) ? table.value() : objectClass.getName(); - return query.replace("#table_name", tableName); + + public static void applySort(QueryFragment queryFragment, Sort sort, String prefix) { + sort = QueryJsonHelper.transformSortForJson(sort); + for (Sort.Order order : sort) { + String sortedPropertyName = order.getProperty(); + String sortedProperty = order.isIgnoreCase() ? "LOWER(" + sortedPropertyName + ")" : sortedPropertyName; + if (StringUtils.hasLength(prefix)) { + sortedProperty = prefix + "." + sortedProperty; + } + queryFragment.addOrder(sortedProperty + (order.isAscending() ? " ASC" : " DESC")); } - throw QueryException.withMsg("Table annotation not found", - "This object does not have a table annotation"); } - private static QueryFragment securityCondition(Object value, String prefix) { - String key = "tenant_code"; - if (StringUtils.hasLength(prefix)) { - key = prefix + "." + key; + public static void applyWhere(QueryFragment queryFragment, String prefix) { + for (Map.Entry entry : queryFragment.entrySet()) { + String conditionSql = buildConditionSql(entry, prefix); + queryFragment.addWhere(conditionSql); } - return QueryFragment.of(key + " LIKE :securityCode", Map.of("securityCode", value)); } - /** - * Constructs a ParamSql instance for dynamic SQL WHERE clause generation - * based on a provided map of column-value pairs. Supports optional prefixing - * for column names to handle table aliases or nested properties. Determines - * the SQL condition type (equality, 'like', or 'in') dynamically based on - * the value's type, enabling flexible query construction. - * - * @param objectMap A map where keys represent column names (in camelCase) - * and values are the criteria for filtering. Values can be - * Strings, Collections, or other types supporting equality checks. - * @param prefix An optional string prefix to prepend to each column name, - * typically used to reference specific tables or entities in a query. - * @return A ParamSql object encapsulating the constructed WHERE clause - * conditions joined by 'and', and a map of parameters for prepared - * statement binding, where keys correspond to named parameters - * and values are the user-provided filter values. - */ - public static QueryFragment query(Map objectMap, String prefix) { - StringJoiner whereAndJoiner = new StringJoiner(" AND "); - for (Map.Entry entry : objectMap.entrySet()) { - String conditionSql = buildConditionSql(entry, prefix); - whereAndJoiner.add(conditionSql); + public static void applyQuerySql(QueryFragment queryFragment, Object object) { + Class objectClass = object.getClass(); + Table table = objectClass.getAnnotation(Table.class); + + if (ObjectUtils.isEmpty(table)) { + throw QueryException.withMsg("Table annotation not found", + "This object does not have a table annotation"); } - return QueryFragment.of(whereAndJoiner.toString(), objectMap); + + String tableName = StringUtils.hasLength(table.value()) ? table.value() : objectClass.getName(); + queryFragment.addColumn("*"); + queryFragment.addQuery(tableName); } /** @@ -187,20 +134,20 @@ public static QueryFragment query(Map objectMap, String prefix) * - A map of parameters mapping placeholders to the actual filter values. */ public static String buildConditionSql(Map.Entry entry, String prefix) { - String sql = CaseFormat.LOWER_CAMEL.to(CaseFormat.LOWER_UNDERSCORE, entry.getKey()); + String columnName = CaseFormat.LOWER_CAMEL.to(CaseFormat.LOWER_UNDERSCORE, entry.getKey()); if (StringUtils.hasLength(prefix)) { - sql = prefix + "." + sql; + columnName = prefix + "." + columnName; } Object value = entry.getValue(); String paramName = ":" + entry.getKey(); if (value instanceof String) { - sql = sql + " like " + paramName; + columnName = columnName + " LIKE " + paramName; } else if (value instanceof Collection) { - sql = sql + " in (" + paramName + ")"; + columnName = columnName + " IN (" + paramName + ")"; } else { - sql = sql + " = " + paramName; + columnName = columnName + " = " + paramName; } - return sql; + return columnName; } /** diff --git a/boot/platform/src/main/java/com/plate/boot/commons/utils/query/QueryJsonHelper.java b/boot/platform/src/main/java/com/plate/boot/commons/utils/query/QueryJsonHelper.java index d6b0259e..7c532f10 100644 --- a/boot/platform/src/main/java/com/plate/boot/commons/utils/query/QueryJsonHelper.java +++ b/boot/platform/src/main/java/com/plate/boot/commons/utils/query/QueryJsonHelper.java @@ -119,7 +119,7 @@ private static Sort.Order convertSortOrderToCamelCase(Sort.Order order) { * @throws IllegalArgumentException If any processing error occurs due to invalid input structure or content. */ public static QueryFragment queryJson(Map params, String prefix) { - QueryFragment queryFragment = QueryFragment.of(null, params); + QueryFragment queryFragment = QueryFragment.of(25, 0, Map.of()); for (Map.Entry entry : params.entrySet()) { queryFragment.merge(buildJsonCondition(entry, prefix)); } @@ -171,7 +171,7 @@ private static QueryFragment buildJsonCondition(Map.Entry entry, //处理最后键 QueryFragment lastCondition = buildLastCondition(keys, entry.getValue()); conditionBuilder.append(lastCondition.getWhereSql()); - return QueryFragment.of(conditionBuilder.toString(), lastCondition); + return QueryFragment.of(lastCondition).addWhere(conditionBuilder.toString()); } /** @@ -199,7 +199,7 @@ private static QueryFragment buildLastCondition(String[] keys, Object value) { Map.Entry exps = queryKeywordMapper(lastKey); if (exps == null) { conditionSql.append(lastKey).append("' = :").append(paramName); - return QueryFragment.of(conditionSql.toString(), Map.of(paramName, value)); + return QueryFragment.of(Map.of(paramName, value)).addWhere(conditionSql.toString()); } String key = lastKey.substring(0, lastKey.length() - exps.getKey().length()); @@ -219,7 +219,7 @@ private static QueryFragment buildLastCondition(String[] keys, Object value) { conditionSql.append(exps.getValue()).append(" :").append(paramName); params = Map.of(paramName, value); } - return QueryFragment.of(conditionSql.toString(), params); + return QueryFragment.of(params).addWhere(conditionSql.toString()); } /** diff --git a/boot/platform/src/main/java/com/plate/boot/relational/logger/LoggersService.java b/boot/platform/src/main/java/com/plate/boot/relational/logger/LoggersService.java index 2adb4775..af9d47b3 100644 --- a/boot/platform/src/main/java/com/plate/boot/relational/logger/LoggersService.java +++ b/boot/platform/src/main/java/com/plate/boot/relational/logger/LoggersService.java @@ -3,6 +3,7 @@ import com.plate.boot.commons.base.AbstractDatabase; import com.plate.boot.commons.utils.BeanUtils; import com.plate.boot.commons.utils.query.QueryFragment; +import com.plate.boot.commons.utils.query.QueryHelper; import lombok.RequiredArgsConstructor; import lombok.extern.log4j.Log4j2; import org.springframework.data.domain.Page; @@ -34,7 +35,7 @@ public class LoggersService extends AbstractDatabase { * @return A Flux of Logger objects matching the search criteria, respecting the specified pagination. */ public Flux search(LoggerRequest request, Pageable pageable) { - QueryFragment queryFragment = QueryFragment.query(request, pageable); + QueryFragment queryFragment = QueryHelper.query(request, pageable); var cacheKey = BeanUtils.cacheKey(request, pageable); return this.queryWithCache(cacheKey, queryFragment.querySql(), queryFragment, Logger.class); } @@ -50,7 +51,7 @@ public Flux search(LoggerRequest request, Pageable pageable) { */ public Mono> page(LoggerRequest request, Pageable pageable) { var searchMono = this.search(request, pageable).collectList(); - QueryFragment queryFragment = QueryFragment.query(request, pageable); + QueryFragment queryFragment = QueryHelper.query(request, pageable); var countMono = this.countWithCache(BeanUtils.cacheKey(request), queryFragment.countSql(), queryFragment); return searchMono.zipWith(countMono) .map(tuple2 -> new PageImpl<>(tuple2.getT1(), pageable, tuple2.getT2())); diff --git a/boot/platform/src/main/java/com/plate/boot/security/core/group/GroupRequest.java b/boot/platform/src/main/java/com/plate/boot/security/core/group/GroupRequest.java index beeae1d4..a0c00a96 100644 --- a/boot/platform/src/main/java/com/plate/boot/security/core/group/GroupRequest.java +++ b/boot/platform/src/main/java/com/plate/boot/security/core/group/GroupRequest.java @@ -1,13 +1,10 @@ package com.plate.boot.security.core.group; import com.plate.boot.commons.utils.BeanUtils; -import com.plate.boot.commons.utils.query.QueryFragment; -import com.plate.boot.commons.utils.query.QueryHelper; import lombok.Data; import lombok.EqualsAndHashCode; import lombok.ToString; -import java.util.List; import java.util.Map; /** @@ -30,8 +27,4 @@ public GroupRequest securityCode(String securityCode) { public Group toGroup() { return BeanUtils.copyProperties(this, Group.class); } - - public QueryFragment qSql() { - return QueryHelper.query(this, List.of(), null); - } } \ No newline at end of file diff --git a/boot/platform/src/main/java/com/plate/boot/security/core/group/GroupsService.java b/boot/platform/src/main/java/com/plate/boot/security/core/group/GroupsService.java index 1ce4ea32..c6070390 100644 --- a/boot/platform/src/main/java/com/plate/boot/security/core/group/GroupsService.java +++ b/boot/platform/src/main/java/com/plate/boot/security/core/group/GroupsService.java @@ -22,16 +22,14 @@ public class GroupsService extends AbstractDatabase { private final GroupsRepository groupsRepository; public Flux search(GroupRequest request, Pageable pageable) { - QueryFragment queryFragment = request.qSql(); - String query = "select * from se_groups" + queryFragment.whereSql() + QueryHelper.applyPage(pageable); - return super.queryWithCache(BeanUtils.cacheKey(request, pageable), query, queryFragment, Group.class); + QueryFragment queryFragment = QueryHelper.query(request, pageable); + return super.queryWithCache(BeanUtils.cacheKey(request, pageable), queryFragment.querySql(), queryFragment, Group.class); } public Mono> page(GroupRequest request, Pageable pageable) { var searchMono = this.search(request, pageable).collectList(); - QueryFragment queryFragment = request.qSql(); - String query = "select count(*) from se_groups" + queryFragment.whereSql(); - var countMono = this.countWithCache(BeanUtils.cacheKey(request), query, queryFragment); + QueryFragment queryFragment = QueryHelper.query(request, pageable); + var countMono = this.countWithCache(BeanUtils.cacheKey(request), queryFragment.countSql(), queryFragment); return searchMono.zipWith(countMono) .map(tuple2 -> new PageImpl<>(tuple2.getT1(), pageable, tuple2.getT2())); diff --git a/boot/platform/src/main/java/com/plate/boot/security/core/group/member/GroupMemberRequest.java b/boot/platform/src/main/java/com/plate/boot/security/core/group/member/GroupMemberRequest.java index c537aa83..26438494 100644 --- a/boot/platform/src/main/java/com/plate/boot/security/core/group/member/GroupMemberRequest.java +++ b/boot/platform/src/main/java/com/plate/boot/security/core/group/member/GroupMemberRequest.java @@ -12,7 +12,6 @@ import java.util.List; import java.util.Set; -import java.util.StringJoiner; /** * @author Alex bob @@ -36,20 +35,17 @@ public Criteria toCriteria() { public QueryFragment toParamSql() { QueryFragment queryFragment = QueryHelper.query(this, List.of("users", "username"), "a"); - - StringJoiner criteria = new StringJoiner(" AND ", "(", ")"); - if (!ObjectUtils.isEmpty(this.getUsers())) { - criteria.add("a.user_code in :users"); + queryFragment.addWhere("a.user_code in :users"); queryFragment.put("users", this.getUsers()); } if (StringUtils.hasLength(this.getUsername())) { - criteria.add("c.username = :username"); + queryFragment.addWhere("c.username = :username"); queryFragment.put("username", this.getUsername()); } - return QueryFragment.of(queryFragment.getWhereSql() + criteria, queryFragment); + return queryFragment; } } \ No newline at end of file diff --git a/boot/platform/src/main/java/com/plate/boot/security/core/group/member/GroupMembersService.java b/boot/platform/src/main/java/com/plate/boot/security/core/group/member/GroupMembersService.java index f2d27b24..edabe957 100644 --- a/boot/platform/src/main/java/com/plate/boot/security/core/group/member/GroupMembersService.java +++ b/boot/platform/src/main/java/com/plate/boot/security/core/group/member/GroupMembersService.java @@ -3,7 +3,6 @@ import com.plate.boot.commons.base.AbstractDatabase; import com.plate.boot.commons.utils.BeanUtils; import com.plate.boot.commons.utils.query.QueryFragment; -import com.plate.boot.commons.utils.query.QueryHelper; import lombok.RequiredArgsConstructor; import org.springframework.data.domain.Page; import org.springframework.data.domain.PageImpl; @@ -35,8 +34,7 @@ select count(*) from se_group_members a public Flux search(GroupMemberRequest request, Pageable pageable) { QueryFragment queryFragment = request.toParamSql(); - String query = QUERY_SQL + queryFragment.whereSql() + QueryHelper.applyPage(pageable); - return super.queryWithCache(BeanUtils.cacheKey(request, pageable), query, + return super.queryWithCache(BeanUtils.cacheKey(request, pageable), queryFragment.querySql(), queryFragment, GroupMemberResponse.class); } diff --git a/boot/platform/src/main/java/com/plate/boot/security/core/tenant/TenantRequest.java b/boot/platform/src/main/java/com/plate/boot/security/core/tenant/TenantRequest.java index 87efb11d..5061ce8b 100644 --- a/boot/platform/src/main/java/com/plate/boot/security/core/tenant/TenantRequest.java +++ b/boot/platform/src/main/java/com/plate/boot/security/core/tenant/TenantRequest.java @@ -1,13 +1,10 @@ package com.plate.boot.security.core.tenant; import com.plate.boot.commons.utils.BeanUtils; -import com.plate.boot.commons.utils.query.QueryFragment; -import com.plate.boot.commons.utils.query.QueryHelper; import lombok.Data; import lombok.EqualsAndHashCode; import lombok.ToString; -import java.util.List; import java.util.Map; /** @@ -24,7 +21,4 @@ public Tenant toTenant() { return BeanUtils.copyProperties(this, Tenant.class); } - public QueryFragment qSql() { - return QueryHelper.query(this, List.of(), null); - } } \ No newline at end of file diff --git a/boot/platform/src/main/java/com/plate/boot/security/core/tenant/TenantsService.java b/boot/platform/src/main/java/com/plate/boot/security/core/tenant/TenantsService.java index 4df4e025..85be99ea 100644 --- a/boot/platform/src/main/java/com/plate/boot/security/core/tenant/TenantsService.java +++ b/boot/platform/src/main/java/com/plate/boot/security/core/tenant/TenantsService.java @@ -25,16 +25,14 @@ public class TenantsService extends AbstractDatabase { private final TenantMembersRepository membersRepository; public Flux search(TenantRequest request, Pageable pageable) { - QueryFragment queryFragment = request.qSql(); - String query = "select * from se_tenants" + queryFragment.whereSql() + QueryHelper.applyPage(pageable); - return super.queryWithCache(BeanUtils.cacheKey(request, pageable), query, queryFragment, Tenant.class); + QueryFragment queryFragment = QueryHelper.query(request, pageable); + return super.queryWithCache(BeanUtils.cacheKey(request, pageable), queryFragment.querySql(), queryFragment, Tenant.class); } public Mono> page(TenantRequest request, Pageable pageable) { var searchMono = this.search(request, pageable).collectList(); - QueryFragment queryFragment = request.qSql(); - String query = "select count(*) from se_tenants" + queryFragment.whereSql() + QueryHelper.applyPage(pageable); - var countMono = this.countWithCache(BeanUtils.cacheKey(request), query, queryFragment); + QueryFragment queryFragment = QueryHelper.query(request, pageable); + var countMono = this.countWithCache(BeanUtils.cacheKey(request), queryFragment.countSql(), queryFragment); return searchMono.zipWith(countMono) .map(tuple2 -> new PageImpl<>(tuple2.getT1(), pageable, tuple2.getT2())); diff --git a/boot/platform/src/main/java/com/plate/boot/security/core/tenant/member/TenantMembersService.java b/boot/platform/src/main/java/com/plate/boot/security/core/tenant/member/TenantMembersService.java index 300a9491..3d4ef3a2 100644 --- a/boot/platform/src/main/java/com/plate/boot/security/core/tenant/member/TenantMembersService.java +++ b/boot/platform/src/main/java/com/plate/boot/security/core/tenant/member/TenantMembersService.java @@ -37,7 +37,7 @@ select count(*) from se_tenant_members a private final TenantMembersRepository tenantMembersRepository; public Flux search(TenantMemberRequest request, Pageable pageable) { - QueryFragment queryFragment = QueryHelper.query(request, pageable, QUERY_SQL, "a"); + QueryFragment queryFragment = QueryHelper.query(request, pageable, "a"); queryFragment = queryFragment.merge(request.toParamSql()); return super.queryWithCache(BeanUtils.cacheKey(request, pageable), queryFragment.querySql(), queryFragment, TenantMemberResponse.class);