package com.taobao.tddl.optimizer.costbased;
import org.codehaus.groovy.syntax.ParserException;
import org.junit.Test;
import com.taobao.tddl.optimizer.BaseOptimizerTest;
import com.taobao.tddl.optimizer.core.ASTNodeFactory;
import com.taobao.tddl.optimizer.core.plan.IQueryTree;
import com.taobao.tddl.optimizer.core.plan.query.IJoin;
import com.taobao.tddl.optimizer.core.plan.query.IMerge;
import com.taobao.tddl.optimizer.core.plan.query.IQuery;
import com.taobao.tddl.optimizer.costbased.after.MergeJoinMergeOptimizer;
import com.taobao.tddl.optimizer.exceptions.QueryException;
public class MergeJoinMergeOptimizerTest extends BaseOptimizerTest {
private MergeJoinMergeOptimizer o = new MergeJoinMergeOptimizer();
@Test
public void testExpandLeft() throws ParserException, QueryException {
System.out.println("==========testExpandLeft==============");
IJoin j = this.getMergeJoinMerge();
System.out.println(j);
IQueryTree res = o.expandLeft(j);
System.out.println(res);
System.out.println("========================");
j = this.getMergeJoinQuery();
System.out.println(j);
res = o.expandLeft(j);
System.out.println(res);
System.out.println("========================");
j = this.getQueryJoinMerge();
System.out.println(j);
res = o.expandLeft(j);
System.out.println(res);
System.out.println("========================");
j = this.getQueryJoinQuery();
System.out.println(j);
res = o.expandLeft(j);
System.out.println(res);
System.out.println("========================");
}
@Test
public void testExpandRight() throws ParserException, QueryException {
System.out.println("==========testExpandRight==============");
IJoin j = this.getMergeJoinMerge();
System.out.println(j);
IQueryTree res = o.expandRight(j);
System.out.println(res);
System.out.println("========================");
j = this.getMergeJoinQuery();
System.out.println(j);
res = o.expandRight(j);
System.out.println(res);
System.out.println("========================");
j = this.getQueryJoinMerge();
System.out.println(j);
res = o.expandRight(j);
System.out.println(res);
System.out.println("========================");
j = this.getQueryJoinQuery();
System.out.println(j);
res = o.expandRight(j);
System.out.println(res);
System.out.println("========================");
}
@Test
public void testCartesianProduct() throws ParserException, QueryException {
System.out.println("==========testCartesianProduct==============");
IJoin j = this.getMergeJoinMerge();
System.out.println(j);
IQueryTree res = o.cartesianProduct(j);
System.out.println(res);
System.out.println("========================");
j = this.getMergeJoinQuery();
System.out.println(j);
res = o.cartesianProduct(j);
System.out.println(res);
System.out.println("========================");
j = this.getQueryJoinMerge();
System.out.println(j);
res = o.cartesianProduct(j);
System.out.println(res);
System.out.println("========================");
j = this.getQueryJoinQuery();
System.out.println(j);
res = o.cartesianProduct(j);
System.out.println(res);
System.out.println("========================");
}
private IJoin getMergeJoinMerge() {
IJoin j = this.getJoin();
j.setLeftOuter(true);
j.setRightOuter(true);
IQuery q1 = this.getQuery(1);
IQuery q2 = this.getQuery(2);
IQuery q3 = this.getQuery(3);
IQuery q4 = this.getQuery(4);
IQuery q5 = this.getQuery(5);
IQuery q6 = this.getQuery(6);
IMerge leftMerge = this.getMerge(7);
IMerge rightMerge = this.getMerge(8);
leftMerge.addSubNode(q1).addSubNode(q2).addSubNode(q3);
rightMerge.addSubNode(q4).addSubNode(q5).addSubNode(q6);
j.setLeftNode(leftMerge);
j.setRightNode(rightMerge);
return j;
}
private IJoin getQueryJoinMerge() {
IJoin j = this.getJoin();
j.setLeftOuter(true);
j.setRightOuter(true);
IQuery q1 = this.getQuery(1);
IQuery q4 = this.getQuery(4);
IQuery q5 = this.getQuery(5);
IQuery q6 = this.getQuery(6);
IMerge rightMerge = this.getMerge(8);
rightMerge.addSubNode(q4).addSubNode(q5).addSubNode(q6);
j.setLeftNode(q1);
j.setRightNode(rightMerge);
return j;
}
private IJoin getMergeJoinQuery() {
IJoin j = this.getJoin();
j.setLeftOuter(true);
j.setRightOuter(true);
IQuery q1 = this.getQuery(1);
IQuery q2 = this.getQuery(2);
IQuery q3 = this.getQuery(3);
IQuery q4 = this.getQuery(4);
IMerge leftMerge = this.getMerge(7);
leftMerge.addSubNode(q1).addSubNode(q2).addSubNode(q3);
j.setLeftNode(leftMerge);
j.setRightNode(q4);
return j;
}
private IJoin getQueryJoinQuery() {
IJoin j = this.getJoin();
j.setLeftOuter(true);
j.setRightOuter(true);
IQuery q1 = this.getQuery(1);
IQuery q4 = this.getQuery(4);
j.setLeftNode(q1);
j.setRightNode(q4);
return j;
}
private IQuery getQuery(Integer id) {
IQuery q = ASTNodeFactory.getInstance().createQuery();
q.setAlias(id.toString());
return q;
}
private IMerge getMerge(Integer id) {
IMerge m = ASTNodeFactory.getInstance().createMerge();
m.setAlias(id.toString());
return m;
}
private IJoin getJoin() {
return ASTNodeFactory.getInstance().createJoin();
}
}