|
@@ -15,30 +15,23 @@
|
|
|
*/
|
|
|
package com.baomidou.mybatisplus.extension.plugins.pagination.optimize;
|
|
|
|
|
|
-import java.util.ArrayList;
|
|
|
-import java.util.List;
|
|
|
-
|
|
|
-import org.apache.ibatis.logging.Log;
|
|
|
-import org.apache.ibatis.logging.LogFactory;
|
|
|
-import org.apache.ibatis.reflection.MetaObject;
|
|
|
-
|
|
|
import com.baomidou.mybatisplus.core.parser.ISqlParser;
|
|
|
import com.baomidou.mybatisplus.core.parser.SqlInfo;
|
|
|
import com.baomidou.mybatisplus.core.toolkit.CollectionUtils;
|
|
|
import com.baomidou.mybatisplus.core.toolkit.StringPool;
|
|
|
import com.baomidou.mybatisplus.extension.toolkit.SqlParserUtils;
|
|
|
-
|
|
|
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 net.sf.jsqlparser.statement.select.*;
|
|
|
+import org.apache.ibatis.logging.Log;
|
|
|
+import org.apache.ibatis.logging.LogFactory;
|
|
|
+import org.apache.ibatis.reflection.MetaObject;
|
|
|
+
|
|
|
+import java.util.ArrayList;
|
|
|
+import java.util.List;
|
|
|
|
|
|
/**
|
|
|
* JsqlParser Count Optimize
|
|
@@ -48,11 +41,29 @@ import net.sf.jsqlparser.statement.select.SelectItem;
|
|
|
*/
|
|
|
public class JsqlParserCountOptimize implements ISqlParser {
|
|
|
|
|
|
+ private static final List<SelectItem> COUNT_SELECT_ITEM = countSelectItem();
|
|
|
/**
|
|
|
* 日志
|
|
|
*/
|
|
|
private final Log logger = LogFactory.getLog(JsqlParserCountOptimize.class);
|
|
|
- private static final List<SelectItem> COUNT_SELECT_ITEM = countSelectItem();
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 获取jsqlparser中count的SelectItem
|
|
|
+ */
|
|
|
+ private static List<SelectItem> countSelectItem() {
|
|
|
+ Function function = new Function();
|
|
|
+ function.setName("COUNT");
|
|
|
+ List<Expression> expressions = new ArrayList<>();
|
|
|
+ LongValue longValue = new LongValue(1);
|
|
|
+ ExpressionList expressionList = new ExpressionList();
|
|
|
+ expressions.add(longValue);
|
|
|
+ expressionList.setExpressions(expressions);
|
|
|
+ function.setParameters(expressionList);
|
|
|
+ List<SelectItem> selectItems = new ArrayList<>();
|
|
|
+ SelectExpressionItem selectExpressionItem = new SelectExpressionItem(function);
|
|
|
+ selectItems.add(selectExpressionItem);
|
|
|
+ return selectItems;
|
|
|
+ }
|
|
|
|
|
|
@Override
|
|
|
public SqlInfo parser(MetaObject metaObject, String sql) {
|
|
@@ -64,7 +75,8 @@ public class JsqlParserCountOptimize implements ISqlParser {
|
|
|
Select selectStatement = (Select) CCJSqlParserUtil.parse(sql);
|
|
|
PlainSelect plainSelect = (PlainSelect) selectStatement.getSelectBody();
|
|
|
Distinct distinct = plainSelect.getDistinct();
|
|
|
- List<Expression> groupBy = plainSelect.getGroupByColumnReferences();
|
|
|
+ GroupByElement groupByElement = plainSelect.getGroupBy();
|
|
|
+ List<Expression> groupBy = groupByElement.getGroupByExpressions();
|
|
|
List<OrderByElement> orderBy = plainSelect.getOrderByElements();
|
|
|
|
|
|
// 添加包含groupBy 不去除orderBy
|
|
@@ -90,23 +102,4 @@ public class JsqlParserCountOptimize implements ISqlParser {
|
|
|
return sqlInfo.setSql(SqlParserUtils.getOriginalCountSql(sql));
|
|
|
}
|
|
|
}
|
|
|
-
|
|
|
-
|
|
|
- /**
|
|
|
- * 获取jsqlparser中count的SelectItem
|
|
|
- */
|
|
|
- private static List<SelectItem> countSelectItem() {
|
|
|
- Function function = new Function();
|
|
|
- function.setName("COUNT");
|
|
|
- List<Expression> expressions = new ArrayList<>();
|
|
|
- LongValue longValue = new LongValue(1);
|
|
|
- ExpressionList expressionList = new ExpressionList();
|
|
|
- expressions.add(longValue);
|
|
|
- expressionList.setExpressions(expressions);
|
|
|
- function.setParameters(expressionList);
|
|
|
- List<SelectItem> selectItems = new ArrayList<>();
|
|
|
- SelectExpressionItem selectExpressionItem = new SelectExpressionItem(function);
|
|
|
- selectItems.add(selectExpressionItem);
|
|
|
- return selectItems;
|
|
|
- }
|
|
|
}
|