Module bus.pager

Class DefaultCountSqlParser

java.lang.Object
org.miaixz.bus.pager.parsing.DefaultCountSqlParser
All Implemented Interfaces:
CountSqlParser

public class DefaultCountSqlParser extends Object implements CountSqlParser
sql解析类,提供更智能的count查询sql
Since:
Java 17+
Author:
Kimi Liu
  • Field Details

    • KEEP_ORDERBY

      public static final String KEEP_ORDERBY
      See Also:
    • TABLE_ALIAS

      protected static final net.sf.jsqlparser.expression.Alias TABLE_ALIAS
  • Constructor Details

    • DefaultCountSqlParser

      public DefaultCountSqlParser()
  • Method Details

    • getSmartCountSql

      public String getSmartCountSql(String sql, String countColumn)
      获取智能的 COUNT SQL,自动检测是否需要保留 ORDER BY。 优化字符串处理和解析逻辑,减少性能开销。
      Specified by:
      getSmartCountSql in interface CountSqlParser
      Parameters:
      sql - 原始 SQL 查询
      countColumn - COUNT 列名,默认为 "0"
      Returns:
      优化的 COUNT SQL
    • getSimpleCountSql

      public String getSimpleCountSql(String sql)
      获取简单的 COUNT SQL,适用于无法解析或复杂场景。
      Parameters:
      sql - 原查询 SQL
      Returns:
      简单的 COUNT SQL
    • getSimpleCountSql

      public String getSimpleCountSql(String sql, String name)
      获取简单的 COUNT SQL,指定 COUNT 列名。 优化 StringBuilder 容量预估,减少扩容。
      Parameters:
      sql - 原查询 SQL
      name - COUNT 列名
      Returns:
      简单的 COUNT SQL
    • sqlToCount

      public net.sf.jsqlparser.statement.select.Select sqlToCount(net.sf.jsqlparser.statement.select.Select select, String name)
      将sql转换为count查询
      Parameters:
      select - 原查询sql
      name - 名称
      Returns:
      返回count查询sql
    • isSimpleCount

      public boolean isSimpleCount(net.sf.jsqlparser.statement.select.PlainSelect select)
      判断是否可以使用简单的 COUNT 查询方式。 避免使用过时的 Parenthesis 类,改用 ParenthesedExpressionList 或通用 Expression 处理。
      Parameters:
      select - 查询
      Returns:
      是否为简单 COUNT
    • processSelect

      public void processSelect(net.sf.jsqlparser.statement.select.Select select)
      处理 SELECT 主体,移除不必要的 ORDER BY。 优化递归处理逻辑,减少重复调用。
      Parameters:
      select - 查询信息
    • processPlainSelect

      public void processPlainSelect(net.sf.jsqlparser.statement.select.PlainSelect plainSelect)
      处理 PlainSelect 类型的 SELECT 主体。 优化 JOIN 和 FROM 项处理逻辑。
      Parameters:
      plainSelect - 查询
    • processWithItemsList

      public void processWithItemsList(List<net.sf.jsqlparser.statement.select.WithItem<?>> withItemsList)
      处理 WITH 子句,移除不必要的 ORDER BY。
      1. 使用 List<WithItem<?>> 适配 JSqlParser 5.1 的泛型 API。
      2. 提前检查 keepSubSelectOrderBy 和空列表,减少不必要循环。
      3. 使用 for-each 循环,减少迭代器创建。
      4. 提前检查 select 非空,减少无效递归。
      Parameters:
      withItemsList - WITH 子句列表
    • processFromItem

      public void processFromItem(net.sf.jsqlparser.statement.select.FromItem fromItem)
      处理 FROM 子句中的子查询。 优化类型检查和递归逻辑。
      Parameters:
      fromItem - FROM 子句项
    • keepOrderBy

      protected boolean keepOrderBy()
      检查是否需要保留 ORDER BY。 使用 PageMethod 的配置判断。
      Returns:
      是否保留 ORDER BY
    • keepSubSelectOrderBy

      protected boolean keepSubSelectOrderBy()
      检查是否需要保留子查询的 ORDER BY。
      Returns:
      是否保留子查询 ORDER BY
    • orderByHashParameters

      public boolean orderByHashParameters(List<net.sf.jsqlparser.statement.select.OrderByElement> orderByElements)
      判断 ORDER BY 是否包含参数(?)。 优化空检查和循环效率。
      Parameters:
      orderByElements - ORDER BY 元素列表
      Returns:
      是否包含参数