浏览代码

优化解析器

hubin 7 年之前
父节点
当前提交
5064fdf10e

+ 30 - 1
src/main/java/com/baomidou/mybatisplus/plugins/parser/AbstractJsqlParser.java

@@ -24,6 +24,11 @@ import com.baomidou.mybatisplus.exceptions.MybatisPlusException;
 import net.sf.jsqlparser.JSQLParserException;
 import net.sf.jsqlparser.parser.CCJSqlParserUtil;
 import net.sf.jsqlparser.statement.Statement;
+import net.sf.jsqlparser.statement.delete.Delete;
+import net.sf.jsqlparser.statement.insert.Insert;
+import net.sf.jsqlparser.statement.select.Select;
+import net.sf.jsqlparser.statement.select.SelectBody;
+import net.sf.jsqlparser.statement.update.Update;
 
 /**
  * <p>
@@ -72,7 +77,31 @@ public abstract class AbstractJsqlParser implements ISqlParser {
      * @param statement JsqlParser Statement
      * @return
      */
-    public abstract SqlInfo processParser(Statement statement);
+    public SqlInfo processParser(Statement statement) {
+        if (statement instanceof Insert) {
+            this.processInsert((Insert) statement);
+        } else if (statement instanceof Select) {
+            this.processSelectBody(((Select) statement).getSelectBody());
+        } else if (statement instanceof Update) {
+            this.processUpdate((Update) statement);
+        } else if (statement instanceof Delete) {
+            this.processDelete((Delete) statement);
+        }
+        logger.debug("parser sql: " + statement.toString());
+        return SqlInfo.newInstance().setSql(statement.toString());
+    }
+
+    // 新增
+    public abstract void processInsert(Insert insert);
+
+    // 删除
+    public abstract void processDelete(Delete delete);
+
+    // 更新
+    public abstract void processUpdate(Update update);
+
+    // 查询
+    public abstract void processSelectBody(SelectBody selectBody);
 
     /**
      * <p>

+ 0 - 81
src/main/java/com/baomidou/mybatisplus/plugins/parser/logicdelete/LogicDeleteDefaultHandler.java

@@ -1,81 +0,0 @@
-/**
- * Copyright (c) 2011-2020, hubin (jobob@qq.com).
- * <p>
- * Licensed under the Apache License, Version 2.0 (the "License"); you may not
- * use this file except in compliance with the License. You may obtain a copy of
- * the License at
- * <p>
- * http://www.apache.org/licenses/LICENSE-2.0
- * <p>
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
- * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
- * License for the specific language governing permissions and limitations under
- * the License.
- */
-package com.baomidou.mybatisplus.plugins.parser.logicdelete;
-
-import com.baomidou.mybatisplus.entity.TableFieldInfo;
-import com.baomidou.mybatisplus.entity.TableInfo;
-import com.baomidou.mybatisplus.toolkit.TableInfoHelper;
-import net.sf.jsqlparser.expression.Expression;
-import net.sf.jsqlparser.expression.LongValue;
-import net.sf.jsqlparser.expression.StringValue;
-
-import java.util.List;
-import java.util.Map;
-import java.util.concurrent.ConcurrentHashMap;
-
-/**
- * <p>
- * 租户处理器
- * </p>
- *
- * @author hubin
- * @since 2017-08-31
- */
-public class LogicDeleteDefaultHandler implements LogicDeleteHandler {
-
-    private static final Map<String, TableFieldInfo> tableLogicDeleteMap = new ConcurrentHashMap<>();
-
-    public LogicDeleteDefaultHandler() {
-        init();
-    }
-
-    private void init() {
-        if (tableLogicDeleteMap.isEmpty()) {
-            List<TableInfo> tableInfos = TableInfoHelper.getTableInfos();
-            for (TableInfo tableInfo : tableInfos) {
-                List<TableFieldInfo> tableFieldInfos = tableInfo.getFieldList();
-                for (TableFieldInfo tableFieldInfo: tableFieldInfos) {
-                    if (tableFieldInfo.isLogicDelete()) {
-                        tableLogicDeleteMap.put(tableInfo.getTableName(), tableFieldInfo);
-                        break;
-                    }
-                }
-            }
-        }
-    }
-
-    @Override
-    public Expression getValue(String tableName) {
-        init();
-        if (String.class.equals(tableLogicDeleteMap.get(tableName).getPropertyType())) {
-            return new StringValue(tableLogicDeleteMap.get(tableName).getLogicNotDeleteValue());
-        } else {
-            return new LongValue(tableLogicDeleteMap.get(tableName).getLogicNotDeleteValue());
-        }
-    }
-
-    @Override
-    public String getColumn(String tableName) {
-        init();
-        return tableLogicDeleteMap.get(tableName).getColumn();
-    }
-
-    @Override
-    public boolean doTableFilter(String tableName) {
-        init();
-        return !tableLogicDeleteMap.containsKey(tableName);
-    }
-}

+ 0 - 255
src/main/java/com/baomidou/mybatisplus/plugins/parser/logicdelete/LogicDeleteSqlParser.java

@@ -1,255 +0,0 @@
-/**
- * Copyright (c) 2011-2020, hubin (jobob@qq.com).
- * <p>
- * Licensed under the Apache License, Version 2.0 (the "License"); you may not
- * use this file except in compliance with the License. You may obtain a copy of
- * the License at
- * <p>
- * http://www.apache.org/licenses/LICENSE-2.0
- * <p>
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
- * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
- * License for the specific language governing permissions and limitations under
- * the License.
- */
-package com.baomidou.mybatisplus.plugins.parser.logicdelete;
-
-import com.baomidou.mybatisplus.exceptions.MybatisPlusException;
-import com.baomidou.mybatisplus.plugins.parser.AbstractJsqlParser;
-import com.baomidou.mybatisplus.plugins.parser.SqlInfo;
-import net.sf.jsqlparser.expression.BinaryExpression;
-import net.sf.jsqlparser.expression.Expression;
-import net.sf.jsqlparser.expression.operators.conditional.AndExpression;
-import net.sf.jsqlparser.expression.operators.relational.EqualsTo;
-import net.sf.jsqlparser.expression.operators.relational.ExpressionList;
-import net.sf.jsqlparser.schema.Column;
-import net.sf.jsqlparser.schema.Table;
-import net.sf.jsqlparser.statement.Statement;
-import net.sf.jsqlparser.statement.delete.Delete;
-import net.sf.jsqlparser.statement.insert.Insert;
-import net.sf.jsqlparser.statement.select.*;
-import net.sf.jsqlparser.statement.update.Update;
-
-import java.util.List;
-
-/**
- * <p>
- * 租户 SQL 解析
- * </p>
- *
- * @author hubin
- * @since 2017-09-01
- */
-public class LogicDeleteSqlParser extends AbstractJsqlParser {
-
-    private LogicDeleteHandler logicDeleteHandler = new LogicDeleteDefaultHandler();
-
-    @Override
-    public SqlInfo processParser(Statement statement) {
-        if (statement instanceof Select) {
-            this.processSelectBody(((Select) statement).getSelectBody());
-        } else if (statement instanceof Update) {
-            this.processUpdate((Update) statement);
-        }
-        logger.debug("parser sql: " + statement.toString());
-        return SqlInfo.newInstance().setSql(statement.toString());
-    }
-
-    /**
-     * select 语句处理
-     */
-    protected void processSelectBody(SelectBody selectBody) {
-        if (selectBody instanceof PlainSelect) {
-            processPlainSelect((PlainSelect) selectBody);
-        } else if (selectBody instanceof WithItem) {
-            WithItem withItem = (WithItem) selectBody;
-            if (withItem.getSelectBody() != null) {
-                processSelectBody(withItem.getSelectBody());
-            }
-        } else {
-            SetOperationList operationList = (SetOperationList) selectBody;
-            if (operationList.getSelects() != null && operationList.getSelects().size() > 0) {
-                List<SelectBody> plainSelects = operationList.getSelects();
-                for (SelectBody plainSelect : plainSelects) {
-                    processSelectBody(plainSelect);
-                }
-            }
-        }
-    }
-
-    /**
-     * <p>
-     * update 语句处理
-     * </p>
-     */
-    protected void processUpdate(Update update) {
-        List<Table> tableList = update.getTables();
-        if (null == tableList || tableList.size() >= 2) {
-            throw new MybatisPlusException("Failed to process multiple-table update, please exclude the statementId");
-        }
-        Table table = tableList.get(0);
-        if (this.logicDeleteHandler.doTableFilter(table.getName())) {
-            // 过滤退出执行
-            return;
-        }
-        update.setWhere(this.andExpression(table, update.getWhere()));
-    }
-
-    /**
-     * <p>
-     * delete update 语句 where 处理
-     * </p>
-     */
-    protected BinaryExpression andExpression(Table table, Expression where) {
-        String tableName = table.getName();
-        //获得where条件表达式
-        EqualsTo equalsTo = new EqualsTo();
-        if (null != where) {
-            equalsTo.setLeftExpression(new Column(this.logicDeleteHandler.getColumn(tableName)));
-            equalsTo.setRightExpression(logicDeleteHandler.getValue(tableName));
-            return new AndExpression(where, equalsTo);
-        }
-        equalsTo.setLeftExpression(this.getAliasColumn(table));
-        equalsTo.setRightExpression(logicDeleteHandler.getValue(tableName));
-        return equalsTo;
-    }
-
-    /**
-     * <p>
-     * 处理 PlainSelect
-     * </p>
-     */
-    protected void processPlainSelect(PlainSelect plainSelect) {
-        processPlainSelect(plainSelect, false);
-    }
-
-    /**
-     * <p>
-     * 处理 PlainSelect
-     * </p>
-     *
-     * @param plainSelect
-     * @param addColumn   是否添加租户列,insert into select语句中需要
-     */
-    protected void processPlainSelect(PlainSelect plainSelect, boolean addColumn) {
-        FromItem fromItem = plainSelect.getFromItem();
-        if (fromItem instanceof Table) {
-            Table fromTable = (Table) fromItem;
-            if (this.logicDeleteHandler.doTableFilter(fromTable.getName())) {
-                // 过滤退出执行
-                return;
-            }
-            plainSelect.setWhere(builderExpression(plainSelect.getWhere(), fromTable));
-            if (addColumn) {
-                plainSelect.getSelectItems().add(new SelectExpressionItem(new Column(this.logicDeleteHandler.getColumn(fromTable.getName()))));
-            }
-        } else {
-            processFromItem(fromItem);
-        }
-        List<Join> joins = plainSelect.getJoins();
-        if (joins != null && joins.size() > 0) {
-            for (Join join : joins) {
-                processJoin(join);
-                processFromItem(join.getRightItem());
-            }
-        }
-    }
-
-    /**
-     * 处理子查询等
-     */
-    protected void processFromItem(FromItem fromItem) {
-        if (fromItem instanceof SubJoin) {
-            SubJoin subJoin = (SubJoin) fromItem;
-            if (subJoin.getJoin() != null) {
-                processJoin(subJoin.getJoin());
-            }
-            if (subJoin.getLeft() != null) {
-                processFromItem(subJoin.getLeft());
-            }
-        } else if (fromItem instanceof SubSelect) {
-            SubSelect subSelect = (SubSelect) fromItem;
-            if (subSelect.getSelectBody() != null) {
-                processSelectBody(subSelect.getSelectBody());
-            }
-        } else if (fromItem instanceof ValuesList) {
-            logger.debug("Perform a subquery, if you do not give us feedback");
-        } else if (fromItem instanceof LateralSubSelect) {
-            LateralSubSelect lateralSubSelect = (LateralSubSelect) fromItem;
-            if (lateralSubSelect.getSubSelect() != null) {
-                SubSelect subSelect = lateralSubSelect.getSubSelect();
-                if (subSelect.getSelectBody() != null) {
-                    processSelectBody(subSelect.getSelectBody());
-                }
-            }
-        }
-    }
-
-    /**
-     * 处理联接语句
-     */
-    protected void processJoin(Join join) {
-        if (join.getRightItem() instanceof Table) {
-            Table fromTable = (Table) join.getRightItem();
-            if (this.logicDeleteHandler.doTableFilter(fromTable.getName())) {
-                // 过滤退出执行
-                return;
-            }
-            join.setOnExpression(builderExpression(join.getOnExpression(), fromTable));
-        }
-    }
-
-    /**
-     * 处理条件
-     */
-    protected Expression builderExpression(Expression expression, Table table) {
-        //生成字段名
-        EqualsTo equalsTo = new EqualsTo();
-        equalsTo.setLeftExpression(this.getAliasColumn(table));
-        equalsTo.setRightExpression(logicDeleteHandler.getValue(table.getName()));
-        //加入判断防止条件为空时生成 "and null" 导致查询结果为空
-        if (expression == null) {
-            return equalsTo;
-        } else {
-            if (expression instanceof BinaryExpression) {
-                BinaryExpression binaryExpression = (BinaryExpression) expression;
-                if (binaryExpression.getLeftExpression() instanceof FromItem) {
-                    processFromItem((FromItem) binaryExpression.getLeftExpression());
-                }
-                if (binaryExpression.getRightExpression() instanceof FromItem) {
-                    processFromItem((FromItem) binaryExpression.getRightExpression());
-                }
-            }
-            return new AndExpression(expression, equalsTo);
-        }
-    }
-
-    /**
-     * <p>
-     * 字段是否添加别名设置
-     * </p>
-     *
-     * @param table 表对象
-     * @return 字段
-     */
-    protected Column getAliasColumn(Table table) {
-        String tableName = table.getName();
-        if (null == table.getAlias()) {
-            return new Column(this.logicDeleteHandler.getColumn(tableName));
-        }
-        StringBuilder column = new StringBuilder();
-        column.append(table.getAlias().getName());
-        column.append(".");
-        column.append(this.logicDeleteHandler.getColumn(tableName));
-        return new Column(column.toString());
-    }
-
-    public LogicDeleteHandler getLogicDeleteHandler() {
-        return logicDeleteHandler;
-    }
-
-    public void setLogicDeleteHandler(LogicDeleteHandler logicDeleteHandler) {
-        this.logicDeleteHandler = logicDeleteHandler;
-    }
-}

+ 1 - 1
src/main/java/com/baomidou/mybatisplus/plugins/parser/tenant/TenantHandler.java

@@ -19,7 +19,7 @@ import net.sf.jsqlparser.expression.Expression;
 
 /**
  * <p>
- * 租户处理器
+ * 租户处理器( TenantId 行级 )
  * </p>
  *
  * @author hubin

+ 4 - 8
src/main/java/com/baomidou/mybatisplus/plugins/parser/logicdelete/LogicDeleteHandler.java → src/main/java/com/baomidou/mybatisplus/plugins/parser/tenant/TenantSchemaHandler.java

@@ -13,23 +13,19 @@
  * License for the specific language governing permissions and limitations under
  * the License.
  */
-package com.baomidou.mybatisplus.plugins.parser.logicdelete;
-
-import net.sf.jsqlparser.expression.Expression;
+package com.baomidou.mybatisplus.plugins.parser.tenant;
 
 /**
  * <p>
- * 租户处理器
+ * 租户处理器( Schema 表级 )
  * </p>
  *
  * @author hubin
  * @since 2017-08-31
  */
-public interface LogicDeleteHandler {
-
-    Expression getValue(String tableName);
+public interface TenantSchemaHandler {
 
-    String getColumn(String tableName);
+    String getTenantSchema();
 
     boolean doTableFilter(String tableName);
 }

+ 64 - 0
src/main/java/com/baomidou/mybatisplus/plugins/parser/tenant/TenantSchemaSqlParser.java

@@ -0,0 +1,64 @@
+/**
+ * Copyright (c) 2011-2020, hubin (jobob@qq.com).
+ * <p>
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ * <p>
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * <p>
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package com.baomidou.mybatisplus.plugins.parser.tenant;
+
+import com.baomidou.mybatisplus.plugins.parser.AbstractJsqlParser;
+
+import net.sf.jsqlparser.statement.delete.Delete;
+import net.sf.jsqlparser.statement.insert.Insert;
+import net.sf.jsqlparser.statement.select.SelectBody;
+import net.sf.jsqlparser.statement.update.Update;
+
+/**
+ * <p>
+ * 租户 SQL 解析( Schema 表级 )
+ * </p>
+ *
+ * @author hubin
+ * @since 2017-09-01
+ */
+public class TenantSchemaSqlParser extends AbstractJsqlParser {
+
+    private TenantSchemaHandler tenantSchemaHandler;
+
+    @Override
+    public void processInsert(Insert insert) {
+
+    }
+
+    @Override
+    public void processDelete(Delete delete) {
+
+    }
+
+    @Override
+    public void processUpdate(Update update) {
+
+    }
+
+    @Override
+    public void processSelectBody(SelectBody selectBody) {
+
+    }
+
+    public TenantSchemaHandler getTenantSchemaHandler() {
+        return tenantSchemaHandler;
+    }
+
+    public void setTenantSchemaHandler(TenantSchemaHandler tenantSchemaHandler) {
+        this.tenantSchemaHandler = tenantSchemaHandler;
+    }
+}

+ 9 - 23
src/main/java/com/baomidou/mybatisplus/plugins/parser/tenant/TenantSqlParser.java

@@ -19,7 +19,6 @@ import java.util.List;
 
 import com.baomidou.mybatisplus.exceptions.MybatisPlusException;
 import com.baomidou.mybatisplus.plugins.parser.AbstractJsqlParser;
-import com.baomidou.mybatisplus.plugins.parser.SqlInfo;
 
 import net.sf.jsqlparser.expression.BinaryExpression;
 import net.sf.jsqlparser.expression.Expression;
@@ -28,14 +27,12 @@ import net.sf.jsqlparser.expression.operators.relational.EqualsTo;
 import net.sf.jsqlparser.expression.operators.relational.ExpressionList;
 import net.sf.jsqlparser.schema.Column;
 import net.sf.jsqlparser.schema.Table;
-import net.sf.jsqlparser.statement.Statement;
 import net.sf.jsqlparser.statement.delete.Delete;
 import net.sf.jsqlparser.statement.insert.Insert;
 import net.sf.jsqlparser.statement.select.FromItem;
 import net.sf.jsqlparser.statement.select.Join;
 import net.sf.jsqlparser.statement.select.LateralSubSelect;
 import net.sf.jsqlparser.statement.select.PlainSelect;
-import net.sf.jsqlparser.statement.select.Select;
 import net.sf.jsqlparser.statement.select.SelectBody;
 import net.sf.jsqlparser.statement.select.SelectExpressionItem;
 import net.sf.jsqlparser.statement.select.SetOperationList;
@@ -47,7 +44,7 @@ import net.sf.jsqlparser.statement.update.Update;
 
 /**
  * <p>
- * 租户 SQL 解析
+ * 租户 SQL 解析( TenantId 行级 )
  * </p>
  *
  * @author hubin
@@ -57,25 +54,11 @@ public class TenantSqlParser extends AbstractJsqlParser {
 
     private TenantHandler tenantHandler;
 
-    @Override
-    public SqlInfo processParser(Statement statement) {
-        if (statement instanceof Insert) {
-            this.processInsert((Insert) statement);
-        } else if (statement instanceof Select) {
-            this.processSelectBody(((Select) statement).getSelectBody());
-        } else if (statement instanceof Update) {
-            this.processUpdate((Update) statement);
-        } else if (statement instanceof Delete) {
-            this.processDelete((Delete) statement);
-        }
-        logger.debug("parser sql: " + statement.toString());
-        return SqlInfo.newInstance().setSql(statement.toString());
-    }
-
     /**
      * select 语句处理
      */
-    protected void processSelectBody(SelectBody selectBody) {
+    @Override
+    public void processSelectBody(SelectBody selectBody) {
         if (selectBody instanceof PlainSelect) {
             processPlainSelect((PlainSelect) selectBody);
         } else if (selectBody instanceof WithItem) {
@@ -99,7 +82,8 @@ public class TenantSqlParser extends AbstractJsqlParser {
      * insert 语句处理
      * </p>
      */
-    protected void processInsert(Insert insert) {
+    @Override
+    public void processInsert(Insert insert) {
         if (this.tenantHandler.doTableFilter(insert.getTable().getName())) {
             // 过滤退出执行
             return;
@@ -119,7 +103,8 @@ public class TenantSqlParser extends AbstractJsqlParser {
      * update 语句处理
      * </p>
      */
-    protected void processUpdate(Update update) {
+    @Override
+    public void processUpdate(Update update) {
         List<Table> tableList = update.getTables();
         if (null == tableList || tableList.size() >= 2) {
             throw new MybatisPlusException("Failed to process multiple-table update, please exclude the statementId");
@@ -137,7 +122,8 @@ public class TenantSqlParser extends AbstractJsqlParser {
      * delete 语句处理
      * </p>
      */
-    protected void processDelete(Delete delete) {
+    @Override
+    public void processDelete(Delete delete) {
         if (this.tenantHandler.doTableFilter(delete.getTable().getName())) {
             // 过滤退出执行
             return;