package com.taobao.tddl.optimizer.core.plan.bean; 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.LinkedList; import java.util.List; import java.util.Map; import com.taobao.tddl.common.jdbc.ParameterContext; import com.taobao.tddl.optimizer.core.ASTNodeFactory; import com.taobao.tddl.optimizer.core.PlanVisitor; import com.taobao.tddl.optimizer.core.plan.IDataNodeExecutor; import com.taobao.tddl.optimizer.core.plan.IQueryTree; import com.taobao.tddl.optimizer.core.plan.query.IMerge; import com.taobao.tddl.optimizer.utils.OptimizerToString; public class Merge extends QueryTree implements IMerge { protected List<IDataNodeExecutor> subNodes = new LinkedList<IDataNodeExecutor>(); protected Boolean isSharded = true; protected Boolean isUnion = false; public IMerge assignment(Map<Integer, ParameterContext> parameterSettings) { super.assignment(parameterSettings); for (IDataNodeExecutor iDataNodeExecutor : getSubNode()) { iDataNodeExecutor.assignment(parameterSettings); } return this; } public IQueryTree copy() { IMerge merge = ASTNodeFactory.getInstance().createMerge(); this.copySelfTo((QueryTree) merge); merge.setSubNode(this.getSubNode()); merge.setSharded(this.isSharded); merge.setUnion(this.isUnion); return merge; } public void accept(PlanVisitor visitor) { visitor.visit(this); } public List<IDataNodeExecutor> getSubNode() { return subNodes; } public IMerge setSubNode(List<IDataNodeExecutor> subNodes) { this.subNodes = subNodes; return this; } public IMerge addSubNode(IDataNodeExecutor subNode) { subNodes.add(subNode); return this; } public Boolean isSharded() { return isSharded; } public IMerge setSharded(boolean isSharded) { this.isSharded = isSharded; return this; } public Boolean isUnion() { return isUnion; } public IMerge setUnion(boolean isUnion) { this.isUnion = isUnion; return this; } public String toStringWithInden(int inden) { String tabTittle = OptimizerToString.getTab(inden); String tabContent = OptimizerToString.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, "valueFilter", printFilterString(this.getValueFilter()), tabContent); appendField(sb, "having", printFilterString(this.getHavingFilter()), tabContent); if (!(this.getLimitFrom() != null && this.getLimitFrom().equals(-1L) && this.getLimitTo() != null && this.getLimitTo() .equals(-1L))) { appendField(sb, "limitFrom", this.getLimitFrom(), tabContent); appendField(sb, "limitTo", this.getLimitTo(), tabContent); } if (this.isSubQuery() != null && this.isSubQuery()) { appendField(sb, "isSubQuery", this.isSubQuery(), tabContent); } appendField(sb, "orderBy", this.getOrderBys(), tabContent); appendField(sb, "queryConcurrency", this.getQueryConcurrency(), tabContent); appendField(sb, "columns", this.getColumns(), tabContent); appendField(sb, "groupBys", this.getGroupBys(), tabContent); appendField(sb, "executeOn", this.getDataNode(), tabContent); // if(this.getThread()!=null) // appendField(sb, "thread", // this.getThread(), tabContent); // appendField(sb, "requestID", // this.getRequestID(), tabContent); // appendField(sb, "subRequestID", // this.getSubRequestID(), tabContent); appendln(sb, tabContent + "subQueries"); for (IDataNodeExecutor s : this.getSubNode()) { sb.append(s.toStringWithInden(inden + 2)); } return sb.toString(); } }