miemie 4 年 前
コミット
67c85d5966

+ 10 - 15
mybatis-plus-extension/src/main/java/com/baomidou/mybatisplus/extension/plugins/inner/TenantLineInnerInterceptor.java

@@ -89,6 +89,10 @@ public class TenantLineInnerInterceptor extends JsqlParserSupport implements Inn
     @Override
     protected void processSelect(Select select, int index, Object obj) {
         processSelectBody(select.getSelectBody());
+//        List<WithItem> withItemsList = select.getWithItemsList();
+//        if (!CollectionUtils.isEmpty(withItemsList)){
+//            withItemsList.forEach(this::processSelectBody);
+//        }
     }
 
     protected void processSelectBody(SelectBody selectBody) {
@@ -261,10 +265,11 @@ public class TenantLineInnerInterceptor extends JsqlParserSupport implements Inn
      * 处理条件
      */
     protected Expression builderExpression(Expression currentExpression, Table table) {
-        final Expression tenantExpression = tenantLineHandler.getTenantId();
-        Expression appendExpression = this.processTableAlias4CustomizedTenantIdExpression(tenantExpression, table);
+        EqualsTo equalsTo = new EqualsTo();
+        equalsTo.setLeftExpression(this.getAliasColumn(table));
+        equalsTo.setRightExpression(tenantLineHandler.getTenantId());
         if (currentExpression == null) {
-            return appendExpression;
+            return equalsTo;
         }
         if (currentExpression instanceof BinaryExpression) {
             BinaryExpression binaryExpression = (BinaryExpression) currentExpression;
@@ -278,9 +283,9 @@ public class TenantLineInnerInterceptor extends JsqlParserSupport implements Inn
             }
         }
         if (currentExpression instanceof OrExpression) {
-            return new AndExpression(new Parenthesis(currentExpression), appendExpression);
+            return new AndExpression(new Parenthesis(currentExpression), equalsTo);
         } else {
-            return new AndExpression(currentExpression, appendExpression);
+            return new AndExpression(currentExpression, equalsTo);
         }
     }
 
@@ -296,16 +301,6 @@ public class TenantLineInnerInterceptor extends JsqlParserSupport implements Inn
         }
     }
 
-    /**
-     *
-     */
-    protected Expression processTableAlias4CustomizedTenantIdExpression(Expression expression, Table table) {
-        EqualsTo equalsTo = new EqualsTo();
-        equalsTo.setLeftExpression(this.getAliasColumn(table));
-        equalsTo.setRightExpression(expression);
-        return equalsTo;
-    }
-
     /**
      * 租户字段别名设置
      * <p>tenantId 或 tableAlias.tenantId</p>

+ 3 - 4
mybatis-plus-extension/src/test/java/com/baomidou/mybatisplus/extension/plugins/inner/PaginationInnerInterceptorTest.java

@@ -1,9 +1,10 @@
 package com.baomidou.mybatisplus.extension.plugins.inner;
 
 import com.baomidou.mybatisplus.core.metadata.OrderItem;
-import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import org.junit.jupiter.api.Test;
 
+import java.util.Arrays;
+
 import static org.assertj.core.api.Assertions.assertThat;
 
 /**
@@ -75,8 +76,6 @@ class PaginationInnerInterceptorTest {
     }
 
     void assertsConcatOrderBy(String sql, String targetSql, OrderItem... orderItems) {
-        Page<?> page = new Page<>();
-        page.addOrder(orderItems);
-        assertThat(interceptor.concatOrderBy(sql, page)).isEqualTo(targetSql);
+        assertThat(interceptor.concatOrderBy(sql, Arrays.asList(orderItems))).isEqualTo(targetSql);
     }
 }

+ 93 - 0
mybatis-plus-extension/src/test/java/com/baomidou/mybatisplus/extension/plugins/inner/TenantLineInnerInterceptorTest.java

@@ -0,0 +1,93 @@
+package com.baomidou.mybatisplus.extension.plugins.inner;
+
+import net.sf.jsqlparser.expression.LongValue;
+import org.junit.jupiter.api.Test;
+
+import static org.assertj.core.api.Assertions.assertThat;
+
+/**
+ * @author miemie
+ * @since 2020-07-30
+ */
+class TenantLineInnerInterceptorTest {
+
+    private final TenantLineInnerInterceptor interceptor = new TenantLineInnerInterceptor(() -> new LongValue(1));
+
+    @Test
+    void insert() {
+        assertSql("insert into entity (id,name) value (?,?)",
+            "INSERT INTO entity (id, name, tenant_id) VALUES (?, ?, 1)");
+    }
+
+    @Test
+    void delete() {
+        assertSql("delete from entity where id = ?",
+            "DELETE FROM entity WHERE tenant_id = 1 AND id = ?");
+    }
+
+    @Test
+    void update() {
+        assertSql("update entity set name = ? where id = ?",
+            "UPDATE entity SET name = ? WHERE tenant_id = 1 AND id = ?");
+    }
+
+    @Test
+    void selectSingle() {
+        // 单表
+        assertSql("select * from entity where id = ?",
+            "SELECT * FROM entity WHERE id = ? AND tenant_id = 1");
+
+        assertSql("select * from entity where id = ? or name = ?",
+            "SELECT * FROM entity WHERE (id = ? OR name = ?) AND tenant_id = 1");
+
+        assertSql("SELECT * FROM entity WHERE (id = ? OR name = ?)",
+            "SELECT * FROM entity WHERE (id = ? OR name = ?) AND tenant_id = 1");
+    }
+
+    @Test
+    void selectLeftJoin() {
+        // left join
+        assertSql("SELECT * FROM entity e " +
+                "left join entity1 e1 on e1.id = e.id " +
+                "WHERE e.id = ? OR e.name = ?",
+            "SELECT * FROM entity e " +
+                "LEFT JOIN entity1 e1 ON e1.id = e.id AND e1.tenant_id = 1 " +
+                "WHERE (e.id = ? OR e.name = ?) AND e.tenant_id = 1");
+
+        assertSql("SELECT * FROM entity e " +
+                "left join entity1 e1 on e1.id = e.id " +
+                "WHERE (e.id = ? OR e.name = ?)",
+            "SELECT * FROM entity e " +
+                "LEFT JOIN entity1 e1 ON e1.id = e.id AND e1.tenant_id = 1 " +
+                "WHERE (e.id = ? OR e.name = ?) AND e.tenant_id = 1");
+    }
+
+    @Test
+    void selectInnerJoin() {
+        // inner join
+        assertSql("SELECT * FROM entity e " +
+                "inner join entity1 e1 on e1.id = e.id " +
+                "WHERE e.id = ? OR e.name = ?",
+            "SELECT * FROM entity e " +
+                "INNER JOIN entity1 e1 ON e1.id = e.id AND e1.tenant_id = 1 " +
+                "WHERE (e.id = ? OR e.name = ?) AND e.tenant_id = 1");
+
+        assertSql("SELECT * FROM entity e " +
+                "inner join entity1 e1 on e1.id = e.id " +
+                "WHERE (e.id = ? OR e.name = ?)",
+            "SELECT * FROM entity e " +
+                "INNER JOIN entity1 e1 ON e1.id = e.id AND e1.tenant_id = 1 " +
+                "WHERE (e.id = ? OR e.name = ?) AND e.tenant_id = 1");
+
+        // 垃圾 inner join todo
+//        assertSql("SELECT * FROM entity,entity1 " +
+//                "WHERE entity.id = entity1.id",
+//            "SELECT * FROM entity e " +
+//                "INNER JOIN entity1 e1 ON e1.id = e.id AND e1.tenant_id = 1 " +
+//                "WHERE (e.id = ? OR e.name = ?) AND e.tenant_id = 1");
+    }
+
+    void assertSql(String sql, String targetSql) {
+        assertThat(interceptor.parserSingle(sql, null)).isEqualTo(targetSql);
+    }
+}