package com.taobao.tddl.executor.spi; import java.util.List; import com.taobao.tddl.common.exception.TddlException; import com.taobao.tddl.executor.common.ExecutionContext; import com.taobao.tddl.executor.cursor.Cursor; import com.taobao.tddl.executor.cursor.IAffectRowCursor; import com.taobao.tddl.executor.cursor.IAggregateCursor; import com.taobao.tddl.executor.cursor.IBlockNestedLoopCursor; import com.taobao.tddl.executor.cursor.IColumnAliasCursor; import com.taobao.tddl.executor.cursor.ICursorMeta; import com.taobao.tddl.executor.cursor.IInCursor; import com.taobao.tddl.executor.cursor.IIndexNestLoopCursor; import com.taobao.tddl.executor.cursor.ILimitFromToCursor; import com.taobao.tddl.executor.cursor.IMergeCursor; import com.taobao.tddl.executor.cursor.IMergeSortJoinCursor; import com.taobao.tddl.executor.cursor.IRangeCursor; import com.taobao.tddl.executor.cursor.IReverseOrderCursor; import com.taobao.tddl.executor.cursor.ISchematicCursor; import com.taobao.tddl.executor.cursor.ISetOrderCursor; import com.taobao.tddl.executor.cursor.ITempTableSortCursor; import com.taobao.tddl.executor.cursor.IValueFilterCursor; import com.taobao.tddl.executor.cursor.ResultCursor; import com.taobao.tddl.executor.cursor.impl.SortCursor; import com.taobao.tddl.optimizer.core.expression.IColumn; import com.taobao.tddl.optimizer.core.expression.IFilter; import com.taobao.tddl.optimizer.core.expression.IFilter.OPERATION; import com.taobao.tddl.optimizer.core.expression.IFunction; import com.taobao.tddl.optimizer.core.expression.IOrderBy; import com.taobao.tddl.optimizer.core.expression.ISelectable; import com.taobao.tddl.optimizer.core.plan.IDataNodeExecutor; import com.taobao.tddl.optimizer.core.plan.query.IJoin; /** * 这个接口的作用,就是用来进行各种基于cursor的转换处理的。 比如,如果sql中出现了alias * 那么这里就会有个aliasCursor做对应转换关系的这个逻辑。 * 这层接口的作用在于,在优化时,可以复写这些实现,从而能够做到可以按照自己的存储特点,对特定查询进行优化的目的。 * * @author whisper */ public interface ICursorFactory { /** * 用来处理合并的cursor . 对应QueryNode里面的Merge node. * * @param cursors * @param orderBys * @return */ IMergeCursor mergeCursor(ExecutionContext context, List<ISchematicCursor> cursors, ICursorMeta indexMeta, IDataNodeExecutor currentExecotor, List<IOrderBy> orderBys) throws TddlException; /** * 用来处理合并的cursor . 对应QueryNode里面的Merge node. * 和上面的方法不同点在于,他会自动从cursors里面取第一个,然后取他的indexMeta * * @param cursors * @return */ IMergeCursor mergeCursor(ExecutionContext context, List<ISchematicCursor> cursors, IDataNodeExecutor currentExecotor) throws TddlException; /** * 用于处理count max min avg 等函数的cursor * * @param cursor * @param aggregates * @param groupBycols * @param isMerge * @return */ IAggregateCursor aggregateCursor(ExecutionContext context, ISchematicCursor cursor, List<IFunction> aggregates, List<IOrderBy> groupBycols, List<ISelectable> retColumns, boolean isMerge) throws TddlException; /** * @param cursor * @param retColumns 选择列 * @param name 表别名 * @return */ IColumnAliasCursor columnAliasCursor(ExecutionContext context, ISchematicCursor cursor, List<ISelectable> retColumns, String name) throws TddlException; /** * 用来针对每一个值进行过滤的cursor. 将join merge query得到的结果中的每一行,放入这个value * cursor里面进行匹配,为true则认为成功。 * * @param cursor * @param filter * @param executionContext TODO * @return */ IValueFilterCursor valueFilterCursor(ExecutionContext context, ISchematicCursor cursor, IFilter filter) throws TddlException; /** * 最基本的cursor对象,用于给指定的cursor赋予对应的schema描述之用。 * * @param cursor * @param meta * @param orderBys * @return */ ISchematicCursor schematicCursor(ExecutionContext context, Cursor cursor, ICursorMeta meta, List<IOrderBy> orderBys) throws TddlException; IAffectRowCursor affectRowCursor(ExecutionContext context, int affectRow) throws TddlException; /** * 结果集对象,封装结果集对象,用于网络传输 * * @param cursor * @param context * @param retColumns * @return */ ResultCursor resultCursor(ExecutionContext context, ISchematicCursor cursor, List<Object> retColumns) throws TddlException; /** * 临时表的排序用cursor ,将数据拿出写入临时表中,并进行排序。 * * @param context * @param cursor * @param orderBys * @param sortedDuplicates * @param requestID * @return * @throws TddlException */ ITempTableSortCursor tempTableSortCursor(ExecutionContext context, ISchematicCursor cursor, List<IOrderBy> orderBys, boolean sortedDuplicates, long requestID) throws TddlException; /** * 对应执行计划join节点 假定右表有序,以左表的每一个值去和右表进行 join. * * @param left_cursor * @param right_cursor * @param left_columns * @param right_columns * @param columns * @return * @throws TddlException */ IMergeSortJoinCursor sortMergeJoinCursor(ExecutionContext context, ISchematicCursor left_cursor, ISchematicCursor right_cursor, List left_columns, List right_columns, IJoin join) throws TddlException; /** * join的Block Nested Loop实现 * * @param left_cursor * @param right_cursor * @param left_columns * @param right_columns * @param columns * @param join * @param executionContext TODO * @return * @throws TddlException */ public IBlockNestedLoopCursor blockNestedLoopJoinCursor(ExecutionContext context, ISchematicCursor left_cursor, ISchematicCursor right_cursor, List left_columns, List right_columns, List columns, IJoin join) throws TddlException; /** * 如果order by col中的列,不是数据库的正常排序列,那么这个cursor会将数据查询进行颠倒操作。 * * @param cursor * @return */ IReverseOrderCursor reverseOrderCursor(ExecutionContext context, ISchematicCursor cursor) throws TddlException; /** * 范围查询cursor . 对于key filter来说,这个cursor可以进行范围查询。 用于处理 * 索引的key查询里面的and和or条件查找。与andCursor和orCursor不同的地方在于。 * 这个cursor用来处理能够进行二分查找的查询的。对应keyFilter。 * * @param cursor * @param rangeFilters * @return */ IRangeCursor rangeCursor(ExecutionContext context, ISchematicCursor cursor, IFilter lf) throws TddlException; /** * 默认右边有序,左面无序的join查询时,会调用这个cursor.一般来说,主要的用例是二级索引, * 所有二级索引的回表操作都是使用indexNestLoop完成的 * * @param leftCursor * @param rightCursor * @param leftColumns * @param rightColumns * @param columns * @return * @throws TddlException */ IIndexNestLoopCursor indexNestLoopCursor(ExecutionContext context, ISchematicCursor leftCursor, ISchematicCursor rightCursor, List leftColumns, List rightColumns, List columns, boolean prefix, IJoin executor) throws TddlException; /** * 从哪个值开始取,取多少个。 * * @param cursor * @param limitFrom * @param limitTo * @return */ ILimitFromToCursor limitFromToCursor(ExecutionContext context, ISchematicCursor cursor, Long limitFrom, Long limitTo) throws TddlException; /** * id in 的优化。 会尽可能自动的将数据做分隔,比如有一组值 {0,1,2,3,4} 按照id % 2 切分的数据,那么得到的是 0 -> 0 * , 2 , 4 1 -> 1 , 3 这样可以减少查到空值的情况,提升性能 * * @param cursor * @param orderBys * @param c * @param v * @param op * @return */ IInCursor inCursor(ExecutionContext context, Cursor cursor, List<IOrderBy> orderBys, IColumn c, List<Object> v, OPERATION op) throws TddlException; /** * set request order by when cursor's orderBy tableName is not equals * request orderBy tableName * * @param cursor * @param ordersInRequest * @return */ ISetOrderCursor setOrderCursor(ExecutionContext context, ISchematicCursor cursor, List<IOrderBy> ordersInRequest) throws TddlException; SortCursor mergeSortedCursor(ExecutionContext context, List<ISchematicCursor> cursors, boolean duplicated) throws TddlException; }