|
@@ -15,25 +15,10 @@
|
|
|
*/
|
|
|
package com.baomidou.mybatisplus.toolkit;
|
|
|
|
|
|
-import com.alibaba.druid.sql.PagerUtils;
|
|
|
import com.baomidou.mybatisplus.plugins.SQLFormatter;
|
|
|
import com.baomidou.mybatisplus.plugins.entity.CountOptimize;
|
|
|
import com.baomidou.mybatisplus.plugins.entity.Optimize;
|
|
|
import com.baomidou.mybatisplus.plugins.pagination.Pagination;
|
|
|
-import net.sf.jsqlparser.expression.Expression;
|
|
|
-import net.sf.jsqlparser.expression.Function;
|
|
|
-import net.sf.jsqlparser.expression.LongValue;
|
|
|
-import net.sf.jsqlparser.expression.operators.relational.ExpressionList;
|
|
|
-import net.sf.jsqlparser.parser.CCJSqlParserUtil;
|
|
|
-import net.sf.jsqlparser.statement.select.Distinct;
|
|
|
-import net.sf.jsqlparser.statement.select.OrderByElement;
|
|
|
-import net.sf.jsqlparser.statement.select.PlainSelect;
|
|
|
-import net.sf.jsqlparser.statement.select.Select;
|
|
|
-import net.sf.jsqlparser.statement.select.SelectExpressionItem;
|
|
|
-import net.sf.jsqlparser.statement.select.SelectItem;
|
|
|
-
|
|
|
-import java.util.ArrayList;
|
|
|
-import java.util.List;
|
|
|
|
|
|
/**
|
|
|
* <p>
|
|
@@ -45,8 +30,7 @@ import java.util.List;
|
|
|
*/
|
|
|
public class SqlUtils {
|
|
|
private final static SQLFormatter sqlFormatter = new SQLFormatter();
|
|
|
- private static final String SQL_BASE_COUNT = "SELECT COUNT(1) FROM ( %s )";
|
|
|
- private static List<SelectItem> countSelectItem = null;
|
|
|
+ public static final String SQL_BASE_COUNT = "SELECT COUNT(1) FROM ( %s )";
|
|
|
|
|
|
/**
|
|
|
* 获取CountOptimize
|
|
@@ -79,11 +63,14 @@ public class SqlUtils {
|
|
|
*
|
|
|
* @see com.alibaba.druid.util.JdbcConstants
|
|
|
*/
|
|
|
- String aliCountSql = PagerUtils.count(originalSql, dialectType);
|
|
|
+ String aliCountSql = DruidUtils.count(originalSql, dialectType);
|
|
|
countOptimize.setCountSQL(aliCountSql);
|
|
|
break;
|
|
|
case JSQLPARSER:
|
|
|
- jsqlparserCount(countOptimize, originalSql);
|
|
|
+ /**
|
|
|
+ * 调用JsqlParser方式
|
|
|
+ */
|
|
|
+ JsqlParserUtils.jsqlparserCount(countOptimize, originalSql);
|
|
|
break;
|
|
|
default:
|
|
|
StringBuffer countSql = new StringBuffer("SELECT COUNT(1) AS TOTAL ");
|
|
@@ -151,60 +138,4 @@ public class SqlUtils {
|
|
|
}
|
|
|
}
|
|
|
|
|
|
- /**
|
|
|
- * jsqlparser方式获取select的count语句
|
|
|
- *
|
|
|
- * @param originalSql
|
|
|
- * selectSQL
|
|
|
- * @return
|
|
|
- */
|
|
|
- public static CountOptimize jsqlparserCount(CountOptimize countOptimize, String originalSql) {
|
|
|
- String sqlCount;
|
|
|
- try {
|
|
|
- Select selectStatement = (Select) CCJSqlParserUtil.parse(originalSql);
|
|
|
- PlainSelect plainSelect = (PlainSelect) selectStatement.getSelectBody();
|
|
|
- Distinct distinct = plainSelect.getDistinct();
|
|
|
- List<Expression> groupBy = plainSelect.getGroupByColumnReferences();
|
|
|
- // 包含 distinct、groupBy不优化
|
|
|
- if (distinct != null || CollectionUtil.isNotEmpty(groupBy)) {
|
|
|
- sqlCount = String.format(SQL_BASE_COUNT, originalSql);
|
|
|
- }
|
|
|
- // 优化Order by
|
|
|
- List<OrderByElement> orderBy = plainSelect.getOrderByElements();
|
|
|
- if (CollectionUtil.isNotEmpty(orderBy)) {
|
|
|
- plainSelect.setOrderByElements(null);
|
|
|
- countOptimize.setOrderBy(false);
|
|
|
- }
|
|
|
- List<SelectItem> selectCount = countSelectItem();
|
|
|
- plainSelect.setSelectItems(selectCount);
|
|
|
- sqlCount = selectStatement.toString();
|
|
|
- } catch (Exception e) {
|
|
|
- sqlCount = String.format(SQL_BASE_COUNT, originalSql);
|
|
|
- }
|
|
|
- countOptimize.setCountSQL(sqlCount);
|
|
|
- return countOptimize;
|
|
|
- }
|
|
|
-
|
|
|
- /**
|
|
|
- * 获取jsqlparser中count的SelectItem
|
|
|
- *
|
|
|
- * @return
|
|
|
- */
|
|
|
- private static List<SelectItem> countSelectItem() {
|
|
|
- if (CollectionUtil.isNotEmpty(countSelectItem)) {
|
|
|
- return countSelectItem;
|
|
|
- }
|
|
|
- Function function = new Function();
|
|
|
- function.setName("COUNT");
|
|
|
- List<Expression> expressions = new ArrayList<Expression>();
|
|
|
- LongValue longValue = new LongValue(1);
|
|
|
- ExpressionList expressionList = new ExpressionList();
|
|
|
- expressions.add(longValue);
|
|
|
- expressionList.setExpressions(expressions);
|
|
|
- function.setParameters(expressionList);
|
|
|
- countSelectItem = new ArrayList<SelectItem>();
|
|
|
- SelectExpressionItem selectExpressionItem = new SelectExpressionItem(function);
|
|
|
- countSelectItem.add(selectExpressionItem);
|
|
|
- return countSelectItem;
|
|
|
- }
|
|
|
}
|