|
@@ -20,11 +20,13 @@ 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.Alias;
|
|
|
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.schema.Table;
|
|
|
import net.sf.jsqlparser.statement.select.*;
|
|
|
import org.apache.ibatis.logging.Log;
|
|
|
import org.apache.ibatis.logging.LogFactory;
|
|
@@ -32,6 +34,7 @@ import org.apache.ibatis.reflection.MetaObject;
|
|
|
|
|
|
import java.util.ArrayList;
|
|
|
import java.util.List;
|
|
|
+import java.util.Optional;
|
|
|
|
|
|
/**
|
|
|
* JsqlParser Count Optimize
|
|
@@ -93,6 +96,29 @@ public class JsqlParserCountOptimize implements ISqlParser {
|
|
|
if (distinct != null || CollectionUtils.isNotEmpty(groupBy)) {
|
|
|
return sqlInfo.setSql(SqlParserUtils.getOriginalCountSql(selectStatement.toString()));
|
|
|
}
|
|
|
+ // 包含 join 连表,进行判断是否移除 join 连表
|
|
|
+ List<Join> joins = plainSelect.getJoins();
|
|
|
+ if (CollectionUtils.isNotEmpty(joins)) {
|
|
|
+ boolean canRemoveJoin = true;
|
|
|
+ String whereS = Optional.ofNullable(plainSelect.getWhere()).map(Expression::toString).orElse(StringPool.EMPTY);
|
|
|
+ for (Join join : joins) {
|
|
|
+ if (!join.isLeft()) {
|
|
|
+ canRemoveJoin = false;
|
|
|
+ break;
|
|
|
+ }
|
|
|
+ Table table = (Table) join.getRightItem();
|
|
|
+ String str = Optional.ofNullable(table.getAlias()).map(Alias::getName).orElse(table.getName()) + StringPool.DOT;
|
|
|
+ String onExpressionS = join.getOnExpression().toString();
|
|
|
+ /* 如果 join 里包含 ?(代表有入参) 或者 where 条件里包含使用 join 的表的字段作条件,就不移除 join */
|
|
|
+ if (onExpressionS.contains(StringPool.QUESTION_MARK) || whereS.contains(str)) {
|
|
|
+ canRemoveJoin = false;
|
|
|
+ break;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ if (canRemoveJoin) {
|
|
|
+ plainSelect.setJoins(null);
|
|
|
+ }
|
|
|
+ }
|
|
|
// 优化 SQL
|
|
|
plainSelect.setSelectItems(COUNT_SELECT_ITEM);
|
|
|
return sqlInfo.setSql(selectStatement.toString());
|