houzhongyi
2024-07-11 e7c1260db32209a078a962aaa0ad5492c35774fb
提交 | 用户 | 时间
e7c126 1 package com.iailab.framework.datapermission.core.db;
H 2
3 import com.iailab.framework.datapermission.core.rule.DataPermissionRule;
4 import com.iailab.framework.datapermission.core.rule.DataPermissionRuleFactory;
5 import com.iailab.framework.mybatis.core.util.MyBatisUtils;
6 import com.iailab.framework.test.core.ut.BaseMockitoUnitTest;
7 import net.sf.jsqlparser.expression.Alias;
8 import net.sf.jsqlparser.expression.Expression;
9 import net.sf.jsqlparser.expression.LongValue;
10 import net.sf.jsqlparser.expression.operators.relational.EqualsTo;
11 import net.sf.jsqlparser.expression.operators.relational.ExpressionList;
12 import net.sf.jsqlparser.expression.operators.relational.InExpression;
13 import net.sf.jsqlparser.schema.Column;
14 import org.junit.jupiter.api.BeforeEach;
15 import org.junit.jupiter.api.Test;
16 import org.mockito.InjectMocks;
17 import org.mockito.Mock;
18
19 import java.util.Arrays;
20 import java.util.Set;
21
22 import static com.iailab.framework.common.util.collection.SetUtils.asSet;
23 import static org.junit.jupiter.api.Assertions.assertEquals;
24
25 /**
26  * {@link DataPermissionDatabaseInterceptor} 的单元测试
27  * 主要复用了 MyBatis Plus 的 TenantLineInnerInterceptorTest 的单元测试
28  * 不过它的单元测试不是很规范,考虑到是复用的,所以暂时不进行修改~
29  *
30  * @author iailab
31  */
32 public class DataPermissionDatabaseInterceptorTest2 extends BaseMockitoUnitTest {
33
34     @InjectMocks
35     private DataPermissionDatabaseInterceptor interceptor;
36
37     @Mock
38     private DataPermissionRuleFactory ruleFactory;
39
40     @BeforeEach
41     public void setUp() {
42         // 租户的数据权限规则
43         DataPermissionRule tenantRule = new DataPermissionRule() {
44
45             private static final String COLUMN = "tenant_id";
46
47             @Override
48             public Set<String> getTableNames() {
49                 return asSet("entity", "entity1", "entity2", "entity3", "t1", "t2", "sys_dict_item", // 支持 MyBatis Plus 的单元测试
50                         "t_user", "t_role"); // 满足自己的单元测试
51             }
52
53             @Override
54             public Expression getExpression(String tableName, Alias tableAlias) {
55                 Column column = MyBatisUtils.buildColumn(tableName, tableAlias, COLUMN);
56                 LongValue value = new LongValue(1L);
57                 return new EqualsTo(column, value);
58             }
59
60         };
61         // 部门的数据权限规则
62         DataPermissionRule deptRule = new DataPermissionRule() {
63
64             private static final String COLUMN = "dept_id";
65
66             @Override
67             public Set<String> getTableNames() {
68                 return asSet("t_user");  // 满足自己的单元测试
69             }
70
71             @Override
72             public Expression getExpression(String tableName, Alias tableAlias) {
73                 Column column = MyBatisUtils.buildColumn(tableName, tableAlias, COLUMN);
74                 ExpressionList values = new ExpressionList(new LongValue(10L),
75                         new LongValue(20L));
76                 return new InExpression(column, values);
77             }
78
79         };
80         // 设置到上下文,保证
81         DataPermissionDatabaseInterceptor.ContextHolder.init(Arrays.asList(tenantRule, deptRule));
82     }
83
84     @Test
85     void delete() {
86         assertSql("delete from entity where id = ?",
87                 "DELETE FROM entity WHERE id = ? AND entity.tenant_id = 1");
88     }
89
90     @Test
91     void update() {
92         assertSql("update entity set name = ? where id = ?",
93                 "UPDATE entity SET name = ? WHERE id = ? AND entity.tenant_id = 1");
94     }
95
96     @Test
97     void selectSingle() {
98         // 单表
99         assertSql("select * from entity where id = ?",
100                 "SELECT * FROM entity WHERE id = ? AND entity.tenant_id = 1");
101
102         assertSql("select * from entity where id = ? or name = ?",
103                 "SELECT * FROM entity WHERE (id = ? OR name = ?) AND entity.tenant_id = 1");
104
105         assertSql("SELECT * FROM entity WHERE (id = ? OR name = ?)",
106                 "SELECT * FROM entity WHERE (id = ? OR name = ?) AND entity.tenant_id = 1");
107
108         /* not */
109         assertSql("SELECT * FROM entity WHERE not (id = ? OR name = ?)",
110                 "SELECT * FROM entity WHERE NOT (id = ? OR name = ?) AND entity.tenant_id = 1");
111     }
112
113     @Test
114     void selectSubSelectIn() {
115         /* in */
116         assertSql("SELECT * FROM entity e WHERE e.id IN (select e1.id from entity1 e1 where e1.id = ?)",
117                 "SELECT * FROM entity e WHERE e.id IN (SELECT e1.id FROM entity1 e1 WHERE e1.id = ? AND e1.tenant_id = 1) AND e.tenant_id = 1");
118         // 在最前
119         assertSql("SELECT * FROM entity e WHERE e.id IN " +
120                         "(select e1.id from entity1 e1 where e1.id = ?) and e.id = ?",
121                 "SELECT * FROM entity e WHERE e.id IN " +
122                         "(SELECT e1.id FROM entity1 e1 WHERE e1.id = ? AND e1.tenant_id = 1) AND e.id = ? AND e.tenant_id = 1");
123         // 在最后
124         assertSql("SELECT * FROM entity e WHERE e.id = ? and e.id IN " +
125                         "(select e1.id from entity1 e1 where e1.id = ?)",
126                 "SELECT * FROM entity e WHERE e.id = ? AND e.id IN " +
127                         "(SELECT e1.id FROM entity1 e1 WHERE e1.id = ? AND e1.tenant_id = 1) AND e.tenant_id = 1");
128         // 在中间
129         assertSql("SELECT * FROM entity e WHERE e.id = ? and e.id IN " +
130                         "(select e1.id from entity1 e1 where e1.id = ?) and e.id = ?",
131                 "SELECT * FROM entity e WHERE e.id = ? AND e.id IN " +
132                         "(SELECT e1.id FROM entity1 e1 WHERE e1.id = ? AND e1.tenant_id = 1) AND e.id = ? AND e.tenant_id = 1");
133     }
134
135     @Test
136     void selectSubSelectEq() {
137         /* = */
138         assertSql("SELECT * FROM entity e WHERE e.id = (select e1.id from entity1 e1 where e1.id = ?)",
139                 "SELECT * FROM entity e WHERE e.id = (SELECT e1.id FROM entity1 e1 WHERE e1.id = ? AND e1.tenant_id = 1) AND e.tenant_id = 1");
140     }
141
142     @Test
143     void selectSubSelectInnerNotEq() {
144         /* inner not = */
145         assertSql("SELECT * FROM entity e WHERE not (e.id = (select e1.id from entity1 e1 where e1.id = ?))",
146                 "SELECT * FROM entity e WHERE NOT (e.id = (SELECT e1.id FROM entity1 e1 WHERE e1.id = ? AND e1.tenant_id = 1)) AND e.tenant_id = 1");
147
148         assertSql("SELECT * FROM entity e WHERE not (e.id = (select e1.id from entity1 e1 where e1.id = ?) and e.id = ?)",
149                 "SELECT * FROM entity e WHERE NOT (e.id = (SELECT e1.id FROM entity1 e1 WHERE e1.id = ? AND e1.tenant_id = 1) AND e.id = ?) AND e.tenant_id = 1");
150     }
151
152     @Test
153     void selectSubSelectExists() {
154         /* EXISTS */
155         assertSql("SELECT * FROM entity e WHERE EXISTS (select e1.id from entity1 e1 where e1.id = ?)",
156                 "SELECT * FROM entity e WHERE EXISTS (SELECT e1.id FROM entity1 e1 WHERE e1.id = ? AND e1.tenant_id = 1) AND e.tenant_id = 1");
157
158
159         /* NOT EXISTS */
160         assertSql("SELECT * FROM entity e WHERE NOT EXISTS (select e1.id from entity1 e1 where e1.id = ?)",
161                 "SELECT * FROM entity e WHERE NOT EXISTS (SELECT e1.id FROM entity1 e1 WHERE e1.id = ? AND e1.tenant_id = 1) AND e.tenant_id = 1");
162     }
163
164     @Test
165     void selectSubSelect() {
166         /* >= */
167         assertSql("SELECT * FROM entity e WHERE e.id >= (select e1.id from entity1 e1 where e1.id = ?)",
168                 "SELECT * FROM entity e WHERE e.id >= (SELECT e1.id FROM entity1 e1 WHERE e1.id = ? AND e1.tenant_id = 1) AND e.tenant_id = 1");
169
170
171         /* <= */
172         assertSql("SELECT * FROM entity e WHERE e.id <= (select e1.id from entity1 e1 where e1.id = ?)",
173                 "SELECT * FROM entity e WHERE e.id <= (SELECT e1.id FROM entity1 e1 WHERE e1.id = ? AND e1.tenant_id = 1) AND e.tenant_id = 1");
174
175
176         /* <> */
177         assertSql("SELECT * FROM entity e WHERE e.id <> (select e1.id from entity1 e1 where e1.id = ?)",
178                 "SELECT * FROM entity e WHERE e.id <> (SELECT e1.id FROM entity1 e1 WHERE e1.id = ? AND e1.tenant_id = 1) AND e.tenant_id = 1");
179     }
180
181     @Test
182     void selectFromSelect() {
183         assertSql("SELECT * FROM (select e.id from entity e WHERE e.id = (select e1.id from entity1 e1 where e1.id = ?))",
184                 "SELECT * FROM (SELECT e.id FROM entity e WHERE e.id = (SELECT e1.id FROM entity1 e1 WHERE e1.id = ? AND e1.tenant_id = 1) AND e.tenant_id = 1)");
185     }
186
187     @Test
188     void selectBodySubSelect() {
189         assertSql("select t1.col1,(select t2.col2 from t2 t2 where t1.col1=t2.col1) from t1 t1",
190                 "SELECT t1.col1, (SELECT t2.col2 FROM t2 t2 WHERE t1.col1 = t2.col1 AND t2.tenant_id = 1) FROM t1 t1 WHERE t1.tenant_id = 1");
191     }
192
193     @Test
194     void selectLeftJoin() {
195         // left join
196         assertSql("SELECT * FROM entity e " +
197                         "left join entity1 e1 on e1.id = e.id " +
198                         "WHERE e.id = ? OR e.name = ?",
199                 "SELECT * FROM entity e " +
200                         "LEFT JOIN entity1 e1 ON e1.id = e.id AND e1.tenant_id = 1 " +
201                         "WHERE (e.id = ? OR e.name = ?) AND e.tenant_id = 1");
202
203         assertSql("SELECT * FROM entity e " +
204                         "left join entity1 e1 on e1.id = e.id " +
205                         "WHERE (e.id = ? OR e.name = ?)",
206                 "SELECT * FROM entity e " +
207                         "LEFT JOIN entity1 e1 ON e1.id = e.id AND e1.tenant_id = 1 " +
208                         "WHERE (e.id = ? OR e.name = ?) AND e.tenant_id = 1");
209
210         assertSql("SELECT * FROM entity e " +
211                         "left join entity1 e1 on e1.id = e.id " +
212                         "left join entity2 e2 on e1.id = e2.id",
213                 "SELECT * FROM entity e " +
214                         "LEFT JOIN entity1 e1 ON e1.id = e.id AND e1.tenant_id = 1 " +
215                         "LEFT JOIN entity2 e2 ON e1.id = e2.id AND e2.tenant_id = 1 " +
216                         "WHERE e.tenant_id = 1");
217     }
218
219     @Test
220     void selectRightJoin() {
221         // right join
222         assertSql("SELECT * FROM entity e " +
223                         "right join entity1 e1 on e1.id = e.id",
224                 "SELECT * FROM entity e " +
225                         "RIGHT JOIN entity1 e1 ON e1.id = e.id AND e.tenant_id = 1 " +
226                         "WHERE e1.tenant_id = 1");
227
228         assertSql("SELECT * FROM with_as_1 e " +
229                         "right join entity1 e1 on e1.id = e.id",
230                 "SELECT * FROM with_as_1 e " +
231                         "RIGHT JOIN entity1 e1 ON e1.id = e.id " +
232                         "WHERE e1.tenant_id = 1");
233
234         assertSql("SELECT * FROM entity e " +
235                         "right join entity1 e1 on e1.id = e.id " +
236                         "WHERE e.id = ? OR e.name = ?",
237                 "SELECT * FROM entity e " +
238                         "RIGHT JOIN entity1 e1 ON e1.id = e.id AND e.tenant_id = 1 " +
239                         "WHERE (e.id = ? OR e.name = ?) AND e1.tenant_id = 1");
240
241         assertSql("SELECT * FROM entity e " +
242                         "right join entity1 e1 on e1.id = e.id " +
243                         "right join entity2 e2 on e1.id = e2.id ",
244                 "SELECT * FROM entity e " +
245                         "RIGHT JOIN entity1 e1 ON e1.id = e.id AND e.tenant_id = 1 " +
246                         "RIGHT JOIN entity2 e2 ON e1.id = e2.id AND e1.tenant_id = 1 " +
247                         "WHERE e2.tenant_id = 1");
248     }
249
250     @Test
251     void selectMixJoin() {
252         assertSql("SELECT * FROM entity e " +
253                         "right join entity1 e1 on e1.id = e.id " +
254                         "left join entity2 e2 on e1.id = e2.id",
255                 "SELECT * FROM entity e " +
256                         "RIGHT JOIN entity1 e1 ON e1.id = e.id AND e.tenant_id = 1 " +
257                         "LEFT JOIN entity2 e2 ON e1.id = e2.id AND e2.tenant_id = 1 " +
258                         "WHERE e1.tenant_id = 1");
259
260         assertSql("SELECT * FROM entity e " +
261                         "left join entity1 e1 on e1.id = e.id " +
262                         "right join entity2 e2 on e1.id = e2.id",
263                 "SELECT * FROM entity e " +
264                         "LEFT JOIN entity1 e1 ON e1.id = e.id AND e1.tenant_id = 1 " +
265                         "RIGHT JOIN entity2 e2 ON e1.id = e2.id AND e1.tenant_id = 1 " +
266                         "WHERE e2.tenant_id = 1");
267
268         assertSql("SELECT * FROM entity e " +
269                         "left join entity1 e1 on e1.id = e.id " +
270                         "inner join entity2 e2 on e1.id = e2.id",
271                 "SELECT * FROM entity e " +
272                         "LEFT JOIN entity1 e1 ON e1.id = e.id AND e1.tenant_id = 1 " +
273                         "INNER JOIN entity2 e2 ON e1.id = e2.id AND e.tenant_id = 1 AND e2.tenant_id = 1");
274     }
275
276
277     @Test
278     void selectJoinSubSelect() {
279         assertSql("select * from (select * from entity) e1 " +
280                         "left join entity2 e2 on e1.id = e2.id",
281                 "SELECT * FROM (SELECT * FROM entity WHERE entity.tenant_id = 1) e1 " +
282                         "LEFT JOIN entity2 e2 ON e1.id = e2.id AND e2.tenant_id = 1");
283
284         assertSql("select * from entity1 e1 " +
285                         "left join (select * from entity2) e2 " +
286                         "on e1.id = e2.id",
287                 "SELECT * FROM entity1 e1 " +
288                         "LEFT JOIN (SELECT * FROM entity2 WHERE entity2.tenant_id = 1) e2 " +
289                         "ON e1.id = e2.id " +
290                         "WHERE e1.tenant_id = 1");
291     }
292
293     @Test
294     void selectSubJoin() {
295
296         assertSql("select * FROM " +
297                         "(entity1 e1 right JOIN entity2 e2 ON e1.id = e2.id)",
298                 "SELECT * FROM " +
299                         "(entity1 e1 RIGHT JOIN entity2 e2 ON e1.id = e2.id AND e1.tenant_id = 1) " +
300                         "WHERE e2.tenant_id = 1");
301
302         assertSql("select * FROM " +
303                         "(entity1 e1 LEFT JOIN entity2 e2 ON e1.id = e2.id)",
304                 "SELECT * FROM " +
305                         "(entity1 e1 LEFT JOIN entity2 e2 ON e1.id = e2.id AND e2.tenant_id = 1) " +
306                         "WHERE e1.tenant_id = 1");
307
308
309         assertSql("select * FROM " +
310                         "(entity1 e1 LEFT JOIN entity2 e2 ON e1.id = e2.id) " +
311                         "right join entity3 e3 on e1.id = e3.id",
312                 "SELECT * FROM " +
313                         "(entity1 e1 LEFT JOIN entity2 e2 ON e1.id = e2.id AND e2.tenant_id = 1) " +
314                         "RIGHT JOIN entity3 e3 ON e1.id = e3.id AND e1.tenant_id = 1 " +
315                         "WHERE e3.tenant_id = 1");
316
317
318         assertSql("select * FROM entity e " +
319                         "LEFT JOIN (entity1 e1 right join entity2 e2 ON e1.id = e2.id) " +
320                         "on e.id = e2.id",
321                 "SELECT * FROM entity e " +
322                         "LEFT JOIN (entity1 e1 RIGHT JOIN entity2 e2 ON e1.id = e2.id AND e1.tenant_id = 1) " +
323                         "ON e.id = e2.id AND e2.tenant_id = 1 " +
324                         "WHERE e.tenant_id = 1");
325
326         assertSql("select * FROM entity e " +
327                         "LEFT JOIN (entity1 e1 left join entity2 e2 ON e1.id = e2.id) " +
328                         "on e.id = e2.id",
329                 "SELECT * FROM entity e " +
330                         "LEFT JOIN (entity1 e1 LEFT JOIN entity2 e2 ON e1.id = e2.id AND e2.tenant_id = 1) " +
331                         "ON e.id = e2.id AND e1.tenant_id = 1 " +
332                         "WHERE e.tenant_id = 1");
333
334         assertSql("select * FROM entity e " +
335                         "RIGHT JOIN (entity1 e1 left join entity2 e2 ON e1.id = e2.id) " +
336                         "on e.id = e2.id",
337                 "SELECT * FROM entity e " +
338                         "RIGHT JOIN (entity1 e1 LEFT JOIN entity2 e2 ON e1.id = e2.id AND e2.tenant_id = 1) " +
339                         "ON e.id = e2.id AND e.tenant_id = 1 " +
340                         "WHERE e1.tenant_id = 1");
341     }
342
343
344     @Test
345     void selectLeftJoinMultipleTrailingOn() {
346         // 多个 on 尾缀的
347         assertSql("SELECT * FROM entity e " +
348                         "LEFT JOIN entity1 e1 " +
349                         "LEFT JOIN entity2 e2 ON e2.id = e1.id " +
350                         "ON e1.id = e.id " +
351                         "WHERE (e.id = ? OR e.NAME = ?)",
352                 "SELECT * FROM entity e " +
353                         "LEFT JOIN entity1 e1 " +
354                         "LEFT JOIN entity2 e2 ON e2.id = e1.id AND e2.tenant_id = 1 " +
355                         "ON e1.id = e.id AND e1.tenant_id = 1 " +
356                         "WHERE (e.id = ? OR e.NAME = ?) AND e.tenant_id = 1");
357
358         assertSql("SELECT * FROM entity e " +
359                         "LEFT JOIN entity1 e1 " +
360                         "LEFT JOIN with_as_A e2 ON e2.id = e1.id " +
361                         "ON e1.id = e.id " +
362                         "WHERE (e.id = ? OR e.NAME = ?)",
363                 "SELECT * FROM entity e " +
364                         "LEFT JOIN entity1 e1 " +
365                         "LEFT JOIN with_as_A e2 ON e2.id = e1.id " +
366                         "ON e1.id = e.id AND e1.tenant_id = 1 " +
367                         "WHERE (e.id = ? OR e.NAME = ?) AND e.tenant_id = 1");
368     }
369
370     @Test
371     void selectInnerJoin() {
372         // inner join
373         assertSql("SELECT * FROM entity e " +
374                         "inner join entity1 e1 on e1.id = e.id " +
375                         "WHERE e.id = ? OR e.name = ?",
376                 "SELECT * FROM entity e " +
377                         "INNER JOIN entity1 e1 ON e1.id = e.id AND e.tenant_id = 1 AND e1.tenant_id = 1 " +
378                         "WHERE e.id = ? OR e.name = ?");
379
380         assertSql("SELECT * FROM entity e " +
381                         "inner join entity1 e1 on e1.id = e.id " +
382                         "WHERE (e.id = ? OR e.name = ?)",
383                 "SELECT * FROM entity e " +
384                         "INNER JOIN entity1 e1 ON e1.id = e.id AND e.tenant_id = 1 AND e1.tenant_id = 1 " +
385                         "WHERE (e.id = ? OR e.name = ?)");
386
387         // 隐式内连接
388         assertSql("SELECT * FROM entity,entity1 " +
389                         "WHERE entity.id = entity1.id",
390                 "SELECT * FROM entity, entity1 " +
391                         "WHERE entity.id = entity1.id AND entity.tenant_id = 1 AND entity1.tenant_id = 1");
392
393         // 隐式内连接
394         assertSql("SELECT * FROM entity a, with_as_entity1 b " +
395                         "WHERE a.id = b.id",
396                 "SELECT * FROM entity a, with_as_entity1 b " +
397                         "WHERE a.id = b.id AND a.tenant_id = 1");
398
399         assertSql("SELECT * FROM with_as_entity a, with_as_entity1 b " +
400                         "WHERE a.id = b.id",
401                 "SELECT * FROM with_as_entity a, with_as_entity1 b " +
402                         "WHERE a.id = b.id");
403
404         // SubJoin with 隐式内连接
405         assertSql("SELECT * FROM (entity,entity1) " +
406                         "WHERE entity.id = entity1.id",
407                 "SELECT * FROM (entity, entity1) " +
408                         "WHERE entity.id = entity1.id " +
409                         "AND entity.tenant_id = 1 AND entity1.tenant_id = 1");
410
411         assertSql("SELECT * FROM ((entity,entity1),entity2) " +
412                         "WHERE entity.id = entity1.id and entity.id = entity2.id",
413                 "SELECT * FROM ((entity, entity1), entity2) " +
414                         "WHERE entity.id = entity1.id AND entity.id = entity2.id " +
415                         "AND entity.tenant_id = 1 AND entity1.tenant_id = 1 AND entity2.tenant_id = 1");
416
417         assertSql("SELECT * FROM (entity,(entity1,entity2)) " +
418                         "WHERE entity.id = entity1.id and entity.id = entity2.id",
419                 "SELECT * FROM (entity, (entity1, entity2)) " +
420                         "WHERE entity.id = entity1.id AND entity.id = entity2.id " +
421                         "AND entity.tenant_id = 1 AND entity1.tenant_id = 1 AND entity2.tenant_id = 1");
422
423         // 沙雕的括号写法
424         assertSql("SELECT * FROM (((entity,entity1))) " +
425                         "WHERE entity.id = entity1.id",
426                 "SELECT * FROM (((entity, entity1))) " +
427                         "WHERE entity.id = entity1.id " +
428                         "AND entity.tenant_id = 1 AND entity1.tenant_id = 1");
429
430     }
431
432
433     @Test
434     void selectWithAs() {
435         assertSql("with with_as_A as (select * from entity) select * from with_as_A",
436                 "WITH with_as_A AS (SELECT * FROM entity WHERE entity.tenant_id = 1) SELECT * FROM with_as_A");
437     }
438
439
440     @Test
441     void selectIgnoreTable() {
442         assertSql(" SELECT dict.dict_code, item.item_text AS \"text\", item.item_value AS \"value\" FROM sys_dict_item item INNER JOIN sys_dict dict ON dict.id = item.dict_id WHERE dict.dict_code IN (1, 2, 3) AND item.item_value IN (1, 2, 3)",
443                 "SELECT dict.dict_code, item.item_text AS \"text\", item.item_value AS \"value\" FROM sys_dict_item item INNER JOIN sys_dict dict ON dict.id = item.dict_id AND item.tenant_id = 1 WHERE dict.dict_code IN (1, 2, 3) AND item.item_value IN (1, 2, 3)");
444     }
445
446     private void assertSql(String sql, String targetSql) {
447         assertEquals(targetSql, interceptor.parserSingle(sql, null));
448     }
449
450
451     // ========== 额外的测试 ==========
452
453     @Test
454     public void testSelectSingle() {
455         // 单表
456         assertSql("select * from t_user where id = ?",
457                 "SELECT * FROM t_user WHERE id = ? AND t_user.tenant_id = 1 AND t_user.dept_id IN (10, 20)");
458
459         assertSql("select * from t_user where id = ? or name = ?",
460                 "SELECT * FROM t_user WHERE (id = ? OR name = ?) AND t_user.tenant_id = 1 AND t_user.dept_id IN (10, 20)");
461
462         assertSql("SELECT * FROM t_user WHERE (id = ? OR name = ?)",
463                 "SELECT * FROM t_user WHERE (id = ? OR name = ?) AND t_user.tenant_id = 1 AND t_user.dept_id IN (10, 20)");
464
465         /* not */
466         assertSql("SELECT * FROM t_user WHERE not (id = ? OR name = ?)",
467                 "SELECT * FROM t_user WHERE NOT (id = ? OR name = ?) AND t_user.tenant_id = 1 AND t_user.dept_id IN (10, 20)");
468     }
469
470     @Test
471     public void testSelectLeftJoin() {
472         // left join
473         assertSql("SELECT * FROM t_user e " +
474                         "left join t_role e1 on e1.id = e.id " +
475                         "WHERE e.id = ? OR e.name = ?",
476                 "SELECT * FROM t_user e " +
477                         "LEFT JOIN t_role e1 ON e1.id = e.id AND e1.tenant_id = 1 " +
478                         "WHERE (e.id = ? OR e.name = ?) AND e.tenant_id = 1 AND e.dept_id IN (10, 20)");
479
480         // 条件 e.id = ? OR e.name = ? 带括号
481         assertSql("SELECT * FROM t_user e " +
482                         "left join t_role e1 on e1.id = e.id " +
483                         "WHERE (e.id = ? OR e.name = ?)",
484                 "SELECT * FROM t_user e " +
485                         "LEFT JOIN t_role e1 ON e1.id = e.id AND e1.tenant_id = 1 " +
486                         "WHERE (e.id = ? OR e.name = ?) AND e.tenant_id = 1 AND e.dept_id IN (10, 20)");
487     }
488
489     @Test
490     public void testSelectRightJoin() {
491         // right join
492         assertSql("SELECT * FROM t_user e " +
493                         "right join t_role e1 on e1.id = e.id " +
494                         "WHERE e.id = ? OR e.name = ?",
495                 "SELECT * FROM t_user e " +
496                         "RIGHT JOIN t_role e1 ON e1.id = e.id AND e.tenant_id = 1 AND e.dept_id IN (10, 20) " +
497                         "WHERE (e.id = ? OR e.name = ?) AND e1.tenant_id = 1");
498
499         // 条件 e.id = ? OR e.name = ? 带括号
500         assertSql("SELECT * FROM t_user e " +
501                         "right join t_role e1 on e1.id = e.id " +
502                         "WHERE (e.id = ? OR e.name = ?)",
503                 "SELECT * FROM t_user e " +
504                         "RIGHT JOIN t_role e1 ON e1.id = e.id AND e.tenant_id = 1 AND e.dept_id IN (10, 20) " +
505                         "WHERE (e.id = ? OR e.name = ?) AND e1.tenant_id = 1");
506     }
507
508     @Test
509     public void testSelectInnerJoin() {
510         // inner join
511         assertSql("SELECT * FROM t_user e " +
512                         "inner join entity1 e1 on e1.id = e.id " +
513                         "WHERE e.id = ? OR e.name = ?",
514                 "SELECT * FROM t_user e " +
515                         "INNER JOIN entity1 e1 ON e1.id = e.id AND e.tenant_id = 1 AND e.dept_id IN (10, 20) AND e1.tenant_id = 1 " +
516                         "WHERE e.id = ? OR e.name = ?");
517
518         // 条件 e.id = ? OR e.name = ? 带括号
519         assertSql("SELECT * FROM t_user e " +
520                         "inner join entity1 e1 on e1.id = e.id " +
521                         "WHERE (e.id = ? OR e.name = ?)",
522                 "SELECT * FROM t_user e " +
523                         "INNER JOIN entity1 e1 ON e1.id = e.id AND e.tenant_id = 1 AND e.dept_id IN (10, 20) AND e1.tenant_id = 1 " +
524                         "WHERE (e.id = ? OR e.name = ?)");
525
526         // 没有 On 的 inner join
527         assertSql("SELECT * FROM entity,entity1 " +
528                 "WHERE entity.id = entity1.id",
529             "SELECT * FROM entity, entity1 " +
530                     "WHERE entity.id = entity1.id AND entity.tenant_id = 1 AND entity1.tenant_id = 1");
531     }
532
533 }