package com.taobao.tddl.optimizer.costbased;
import org.junit.Assert;
import org.junit.Test;
import com.taobao.tddl.optimizer.BaseOptimizerTest;
import com.taobao.tddl.optimizer.core.ast.QueryTreeNode;
import com.taobao.tddl.optimizer.core.ast.query.JoinNode;
import com.taobao.tddl.optimizer.core.ast.query.TableNode;
public class SubQueryPreProcessorTest extends BaseOptimizerTest {
@Test
public void test_等于子查询() {
TableNode table1 = new TableNode("TABLE1");
table1.query("ID = (SELECT ID FROM TABLE2)");
table1.build();
QueryTreeNode qn = SubQueryPreProcessor.optimize(table1);
Assert.assertTrue(qn instanceof JoinNode);
Assert.assertEquals("1", qn.getWhereFilter().toString());
}
@Test
public void test_In子查询() {
TableNode table1 = new TableNode("TABLE1");
table1.query("ID IN (SELECT ID FROM TABLE2)");
table1.build();
QueryTreeNode qn = SubQueryPreProcessor.optimize(table1);
Assert.assertTrue(qn instanceof JoinNode);
Assert.assertEquals("1", qn.getWhereFilter().toString());
}
@Test
public void test_NotIn子查询() {
TableNode table1 = new TableNode("TABLE1");
table1.query("ID NOT IN (SELECT ID FROM TABLE2)");
table1.build();
QueryTreeNode qn = SubQueryPreProcessor.optimize(table1);
Assert.assertTrue(qn instanceof JoinNode);
Assert.assertEquals("TABLE2.ID IS NULL", qn.getWhereFilter().toString());
}
@Test
public void test_等于子查询_存在OR查询_报错() {
TableNode table1 = new TableNode("TABLE1");
table1.query("ID = (SELECT ID FROM TABLE2 WHERE NAME = 'HELLO') OR NAME = 3");
table1.build();
try {
SubQueryPreProcessor.optimize(table1);
Assert.fail();
} catch (Exception e) {
}
}
@Test
public void test_等于子查询_存在关联条件_报错() {
TableNode table1 = new TableNode("TABLE1");
table1.query("ID = (SELECT ID FROM TABLE2 WHERE TABLE1.NAME = TABLE2.NAME)");
try {
table1.build(); // 编译出错,不支持
Assert.fail();
} catch (Exception e) {
}
}
@Test
public void test_等于子查询_存在多条件() {
TableNode table1 = new TableNode("TABLE1");
table1.query("ID = (SELECT ID FROM TABLE2 WHERE NAME = 'HELLO' AND SCHOOL = 'HELLO' ) AND NAME = 3 AND SCHOOL IN ('A','B')");
table1.build();
QueryTreeNode qn = SubQueryPreProcessor.optimize(table1);
Assert.assertTrue(qn instanceof JoinNode);
Assert.assertEquals(null, table1.getWhereFilter());
}
@Test
public void test_等于子查询_外部是个join节点() {
TableNode table1 = new TableNode("TABLE1");
TableNode table2 = new TableNode("TABLE2");
JoinNode join = table1.join(table2, "ID", "ID");
join.query("TABLE1.ID = (SELECT ID FROM TABLE3 WHERE NAME = 'HELLO' AND SCHOOL = 'HELLO' ) AND TABLE1.NAME = 3 AND TABLE1.SCHOOL IN ('A','B')");
join.build();
QueryTreeNode qn = SubQueryPreProcessor.optimize(join);
Assert.assertTrue(qn instanceof JoinNode);
Assert.assertTrue(((JoinNode) qn).getLeftNode() instanceof JoinNode);
Assert.assertEquals(null, join.getWhereFilter());
}
@Test
public void test_等于IN组合子查询_复杂条件_外部是个join节点() {
TableNode table1 = new TableNode("TABLE1");
TableNode table2 = new TableNode("TABLE2");
JoinNode join = table1.join(table2, "ID", "ID");
join.query("TABLE1.ID = (SELECT ID FROM TABLE3 WHERE NAME = 'HELLO' AND SCHOOL = 'HELLO' ) AND TABLE1.NAME = 3 AND TABLE1.SCHOOL IN (SELECT SCHOOL FROM TABLE4)");
join.build();
QueryTreeNode qn = SubQueryPreProcessor.optimize(join);
Assert.assertTrue(qn instanceof JoinNode);
Assert.assertTrue(((JoinNode) qn).getLeftNode() instanceof JoinNode);
Assert.assertTrue(((JoinNode) ((JoinNode) qn).getLeftNode()).getLeftNode() instanceof JoinNode);
Assert.assertEquals(null, join.getWhereFilter());
}
}