package com.taobao.tddl.optimizer.core.ast;
import java.util.Map;
import com.taobao.tddl.common.exception.NotSupportException;
import com.taobao.tddl.common.jdbc.ParameterContext;
import com.taobao.tddl.optimizer.core.plan.IDataNodeExecutor;
import com.taobao.tddl.optimizer.exceptions.QueryException;
/**
* 可优化的语法树
*
* @since 5.0.0
*/
public abstract class ASTNode<RT extends ASTNode> implements Comparable {
protected String dataNode = null; // 数据处理节点,比如group name
protected Object extra; // 比如唯一标识,join merge join中使用
protected boolean broadcast = false; // 是否为广播表
protected String sql;
/**
* <pre>
* 1. 结合table meta信息构建结构树中完整的column字段
* 2. 处理join/merge的下推处理
* </pre>
*/
public abstract void build();
/**
* 需要预先执行build.构造执行计划
*/
public abstract IDataNodeExecutor toDataNodeExecutor() throws QueryException;
/**
* 处理bind val
*/
public abstract void assignment(Map<Integer, ParameterContext> parameterSettings);
public abstract boolean isNeedBuild();
public String getDataNode() {
return dataNode;
}
public RT executeOn(String dataNode) {
this.dataNode = dataNode;
return (RT) this;
}
public String getSql() {
return this.sql;
}
public RT setSql(String sql) {
this.sql = sql;
return (RT) this;
}
public Object getExtra() {
return this.extra;
}
public void setExtra(Object obj) {
this.extra = obj;
}
public boolean isBroadcast() {
return broadcast;
}
public void setBroadcast(boolean broadcast) {
this.broadcast = broadcast;
}
public int compareTo(Object arg) {
// 主要是将自己包装为Comparable对象,可以和Number/string类型具有相同的父类,构建嵌套的查询树
throw new NotSupportException();
}
public abstract String toString(int inden);
// ----------------- 复制 ----------------
public abstract RT deepCopy();
public abstract RT copy();
}