package com.taobao.tddl.optimizer.core.ast.query; import static com.taobao.tddl.optimizer.utils.OptimizerToString.appendField; import static com.taobao.tddl.optimizer.utils.OptimizerToString.appendln; import static com.taobao.tddl.optimizer.utils.OptimizerToString.printFilterString; import java.util.ArrayList; import java.util.List; import com.taobao.tddl.common.utils.GeneralUtil; import com.taobao.tddl.optimizer.core.ASTNodeFactory; import com.taobao.tddl.optimizer.core.ast.ASTNode; import com.taobao.tddl.optimizer.core.ast.QueryTreeNode; import com.taobao.tddl.optimizer.core.ast.build.MergeNodeBuilder; import com.taobao.tddl.optimizer.core.ast.build.QueryTreeNodeBuilder; import com.taobao.tddl.optimizer.core.expression.IOrderBy; import com.taobao.tddl.optimizer.core.plan.IQueryTree; import com.taobao.tddl.optimizer.core.plan.query.IMerge; import com.taobao.tddl.optimizer.exceptions.QueryException; public class MergeNode extends QueryTreeNode { private MergeNodeBuilder builder; private boolean sharded = true; private boolean union = false; public MergeNode(){ this.builder = new MergeNodeBuilder(this); } public void build() { if (this.isNeedBuild()) { this.builder.build(); } setNeedBuild(false); } public MergeNode merge(ASTNode o) { this.addChild(o); return this; } public MergeNode merge(List<ASTNode> os) { this.getChildren().addAll(os); return this; } public IQueryTree toDataNodeExecutor() throws QueryException { IMerge merge = ASTNodeFactory.getInstance().createMerge(); merge.setLimitFrom(this.getLimitFrom()); merge.setLimitTo(this.getLimitTo()); merge.executeOn(this.getDataNode()); merge.setColumns(this.getColumnsSelected()); merge.setAlias(this.getAlias()); merge.setIsSubQuery(this.isSubQuery()); merge.setUnion(this.isUnion()); for (ASTNode subQuery : this.getChildren()) { merge.addSubNode(subQuery.toDataNodeExecutor()); } merge.setOrderBys(this.getOrderBys()).setLimitFrom(this.getLimitFrom()).setLimitTo(this.getLimitTo()); merge.setGroupBys(this.getGroupBys()); merge.setSharded(this.isSharded()); merge.having(this.getHavingFilter()); return merge; } public List getImplicitOrderBys() { if (!(this.getChild() instanceof QueryTreeNode)) { return new ArrayList<IOrderBy>(0); } List<IOrderBy> orderByCombineWithGroupBy = getOrderByCombineWithGroupBy(); if (orderByCombineWithGroupBy != null) { return orderByCombineWithGroupBy; } else { return new ArrayList<IOrderBy>(0); } } public QueryTreeNodeBuilder getBuilder() { return builder; } public String getName() { return this.getAlias(); } public void setSharded(boolean b) { this.sharded = b; } public boolean isSharded() { return this.sharded; } public boolean isUnion() { return union; } public void setUnion(boolean union) { this.union = union; } public MergeNode copy() { MergeNode newMergeNode = new MergeNode(); this.copySelfTo(newMergeNode); newMergeNode.setSharded(sharded); newMergeNode.setUnion(union); return newMergeNode; } public MergeNode deepCopy() { MergeNode newMergeNode = new MergeNode(); this.deepCopySelfTo(newMergeNode); newMergeNode.setSharded(sharded); newMergeNode.setUnion(union); return newMergeNode; } public String toString(int inden) { String tabTittle = GeneralUtil.getTab(inden); String tabContent = GeneralUtil.getTab(inden + 1); StringBuilder sb = new StringBuilder(); if (this.getAlias() != null) { appendln(sb, tabTittle + (this.isUnion() ? "Union" : "Merge") + " as " + this.getAlias()); } else { appendln(sb, tabTittle + (this.isUnion() ? "Union" : "Merge")); } appendField(sb, "resultFilter", printFilterString(this.getResultFilter(), inden + 2), tabContent); appendField(sb, "having", printFilterString(this.getHavingFilter(), inden + 2), tabContent); if (!(this.getLimitFrom() != null && this.getLimitFrom().equals(0L) && this.getLimitTo() != null && this.getLimitTo() .equals(0L))) { appendField(sb, "limitFrom", this.getLimitFrom(), tabContent); appendField(sb, "limitTo", this.getLimitTo(), tabContent); } if (this.isSubQuery()) { appendField(sb, "isSubQuery", this.isSubQuery(), tabContent); } appendField(sb, "orderBy", this.getOrderBys(), tabContent); appendField(sb, "queryConcurrency", this.getQueryConcurrency(), tabContent); appendField(sb, "columns", this.getColumnsSelected(), tabContent); appendField(sb, "groupBys", this.getGroupBys(), tabContent); appendField(sb, "executeOn", this.getDataNode(), tabContent); appendln(sb, tabContent + "subQueries"); for (Object s : this.getChildren()) { ASTNode node = (ASTNode) s; sb.append(node.toString(inden + 2)); } return sb.toString(); } }