package com.taobao.tddl.optimizer.core.plan;
import java.util.List;
import java.util.Map;
import com.taobao.tddl.common.jdbc.ParameterContext;
import com.taobao.tddl.optimizer.core.expression.IFilter;
import com.taobao.tddl.optimizer.core.expression.IOrderBy;
import com.taobao.tddl.optimizer.core.expression.ISelectable;
/**
* @since 5.0.0
*/
public interface IQueryTree<RT extends IQueryTree> extends IDataNodeExecutor<RT> {
public enum LOCK_MODEL {
SHARED_LOCK, EXCLUSIVE_LOCK;
}
/**
* valueFilter 简单来说就是对所有数据,一行一行进行检索的filter.
* 可以保证所有bool条件都能够查询,但性能较慢,一般来说尽可能先使用key filter之后再使用value filter
*
* @return
*/
public IFilter getValueFilter();
/**
* valueFilter 简单来说就是对所有数据,一行一行进行检索的filter.
* 可以保证所有bool条件都能够查询,但性能较慢,一般来说尽可能先使用key filter之后再使用value filter
*
* @param valueFilter
* @return
*/
public RT setValueFilter(IFilter valueFilter);
/**
* 当前查询中应该使用的查询列。只有在这个出现的列,才会被允许展现
*
* @return
*/
public List<ISelectable> getColumns();
/**
* 设置当前查询节点的column filters ,只有出现在columnFilters里面的列,才可以出现在这个结果集的展现列中。
*
* @param columns
* @return
*/
public RT setColumns(List<ISelectable> columns);
/**
* 设置当前查询节点的column filters ,只有出现在columnFilters里面的列,才可以出现在这个结果集的展现列中。
*
* @param column_filter
* @return
*/
public RT setColumns(ISelectable... column_filter);
public List<IOrderBy> getOrderBys();
/**
* 设置order by条件 如果有order by ,那么数据必须按照order by
* 条件进行数据重排,除非数据本身key就是按照该数据结构进行排列的。
*
* @param orderBy
* @return
*/
public RT setOrderBys(List<IOrderBy> orderBys);
/**
* 从哪里开始
*
* @return
*/
public Comparable getLimitFrom();
/**
* 设置这次数据从第几个开始取
*
* @param limitFrom
* @return
*/
public RT setLimitFrom(Comparable limitFrom);
/**
* 到哪里结束
*
* @return
*/
public Comparable getLimitTo();
/**
* 设置这次数据取到第几个。
*
* @param limitTo
* @return
*/
public RT setLimitTo(Comparable limitTo);
/**
* 结果集按照什么进行排序。 如果无序,那么order by里面的asc或desc是空
*
* @return
*/
public List<IOrderBy> getGroupBys();
/**
* 设置按照什么函数进行聚类
*
* @param groupBy
* @return
*/
public RT setGroupBys(List<IOrderBy> groupBys);
/**
* 设置当前query的别名
*
* @param alias
* @return
*/
public RT setAlias(String alias);
/**
* 获取别名
*
* @return
*/
public String getAlias();
public RT assignment(Map<Integer, ParameterContext> parameterSettings);
/**
* <pre>
* 在处理join的时候,会出现未决节点 比如 数据IDX_PRI: pk - > col1,col2,col3.
* 数据按照pk进行切分索引IDX_COL1: col1->pk 数据按照col1进行切分
* 1. 那么索引查找的时候,会生成一个join 先查询IDX_COL1.
* 2. 然后根据IDX_COL1的"结果",来决定应该去哪些pk索引的数据节点上进行查询(因为IDX_PRI也是分了多个机器的)。
* 所以这时候IDX_PRI是不能预先知道自己在这次查询中应该去查哪些节点的。 这时候。 针对IDX_PRI的查询节点,就是未决节点,这时候canMerge为true.
* </pre>
*
* @param canMerge
*/
public RT setCanMerge(Boolean canMerge);
/**
* <pre>
* 在处理join的时候,会出现未决节点 比如 数据IDX_PRI: pk - > col1,col2,col3.
* 数据按照pk进行切分索引IDX_COL1: col1->pk 数据按照col1进行切分
* 1. 那么索引查找的时候,会生成一个join 先查询IDX_COL1.
* 2. 然后根据IDX_COL1的"结果",来决定应该去哪些pk索引的数据节点上进行查询(因为IDX_PRI也是分了多个机器的)。
* 所以这时候IDX_PRI是不能预先知道自己在这次查询中应该去查哪些节点的。 这时候。 针对IDX_PRI的查询节点,就是未决节点,这时候canMerge为true.
* </pre>
*
* @return
*/
public Boolean canMerge();
/**
* 是否显式指定使用临时表
*
* @param isUseTempTable
*/
public RT setUseTempTableExplicit(Boolean isUseTempTable);
/**
* 是否显式指定使用临时表
*
* @return
*/
public Boolean isUseTempTableExplicit();
/**
* 是否是个子查询
*
* @return
*/
public Boolean isSubQuery();
public RT setIsSubQuery(Boolean isSubQuery);
/**
* having 子句支持
*
* @return
*/
public IFilter getHavingFilter();
/**
* having 子句支持。用在groupby 后面
*
* @param having
* @return
*/
public RT having(IFilter having);
/**
* 是否是最外层的查询
*
* @return
*/
public boolean isTopQuery();
public RT setTopQuery(boolean topQuery);
}