package com.taobao.tddl.executor.cursor;
import java.util.List;
import java.util.Map;
import com.taobao.tddl.common.exception.TddlException;
import com.taobao.tddl.executor.common.DuplicateKVPair;
import com.taobao.tddl.executor.common.KVPair;
import com.taobao.tddl.executor.record.CloneableRecord;
import com.taobao.tddl.executor.rowset.IRowSet;
import com.taobao.tddl.optimizer.config.table.ColumnMeta;
/**
* @author jianxing <jianxing.qx@taobao.com> 注解添加by danchen
*/
public interface Cursor {
/**
* 根据指定的key跳到指定的游标位置 如果发现匹配数据,则返回true; 否则返回false 指针跳过去的同时,current对象也进行更新。
*/
boolean skipTo(CloneableRecord key) throws TddlException;
/**
* 根据指定的key+val跳到指定的游标位置 这个skipto ,要根据KVPair里面的key和val进行查找,同时匹配的时候,才会返回true.
* 否则返回false 指针跳过去的同时,current对象也进行更新。 随机读
*/
boolean skipTo(KVPair key) throws TddlException;
/*
* 当前行的游标位置
*/
IRowSet current() throws TddlException;
/**
* 下一行的游标位置
* <P>
* 从实现来说,如果游标未初始化,那么初始化游标并将他放置在结果集的第一个位置上
* </p>
* <p>
* 如果当前映射中有重复的key的数据(比如索引,一个用户有多个商品),那么会导致指针下移,但value可能会变更 如 map : 1->0 ;
* 1->1 ; 1->2 ; 1->3 那么next会便利所有的1对应的数据,依次返回1->0, 1->1,1->2,1->3
* </p>
* <p>
* next也会让[current数据]指向当前值。比如next() 返回的是 1->0 那么再次调用current ,返回的也将是1->0
* </p>
*/
IRowSet next() throws TddlException;
/**
* 上一行的游标位置
* <P>
* 从实现来说,如果游标未初始化,那么初始化游标并将他放置在结果集的最底端位置上
* </p>
* <p>
* 如果当前映射中有重复的key的数据(比如索引,一个用户有多个商品),那么会导致指针下移,但value可能会变更 如 map : 1->0 ;
* 1->1 ; 1->2 ; 1->3 那么next会便利所有的1对应的数据,依次返回1->3, 1->2,1->1,1->0
* </p>
* <p>
* prev也会让[current数据]指向当前值。比如next() 返回的是 1->0 那么再次调用current ,返回的也将是1->0
* </p>
*/
IRowSet prev() throws TddlException;
/**
* 结果集的第一行的游标位置
* <p>
* 也会让[current数据]指向当前值。比如next() 返回的是 1->0 那么再次调用current ,返回的也将是1->0
* </p>
*/
IRowSet first() throws TddlException;
/**
* 结果集的第一行之前的游标位置
*/
void beforeFirst() throws TddlException;
/**
* 游标指向结果集的最后一行的游标位置 也会让[current数据]指向当前值。比如next() 返回的是 1->0 那么再次调用current
* ,返回的也将是1->0
*/
IRowSet last() throws TddlException;
/**
* 根据key获得结果集中的整行记录KVPair 将游标跳转到当前结果上。
* 如果有相同的key的数据[一对多索引情况],那么跳转到当前key的第一个数据上 也会让[current数据]指向当前值。比如next() 返回的是
* 1->0 那么再次调用current ,返回的也将是1->0 目前没有被使用。注释掉
*/
// KVPair get(CloneableRecord key)throws Exception;
/**
* 根据key获得结果集中的整行记录KVPair 同get(CloneableRecord key) 目前没有被使用。注释掉
*/
// KVPair get(KVPair key)throws Exception;
/**
* 关闭结果集游标
*/
List<TddlException> close(List<TddlException> exceptions);
/**
* 删除 如果当前游标有数据,那么删除这个游标所指向的数据
*/
boolean delete() throws TddlException;
/**
* 获取一个相同的值。 如果下一个值为不同值,则返回空 也会让[current数据]指向当前值。比如next() 返回的是 1->0
* 那么再次调用current ,返回的也将是1->0 简单来说 你在指针跳转的时候,只会利用key跳到值的第一个上。 比如 [0->0, 0->1
* , 0->2,1->0,1->1] 如果skipTo 0,那么指针只会在0->0这里 但第一个值之后,可能有重复的啊。
* 为了取尽0->0,0->1,0->2 就需要一个接口,如果key相同的还有数据,那么就取出,如果下一个key不同了,就返回空
*/
IRowSet getNextDup() throws TddlException;
/*
* 添加
*/
void put(CloneableRecord key, CloneableRecord value) throws TddlException;
/**
* 批量取数据的接口,返回是map,所以会有一次hash的开销 不会导致指针发生变动。 会将有相同数据的值全部取出,[按照给定keys的顺序返回]
* 比如一个索引, [0->0, 0->1 , 0->2...]
* 那么当mget(0)的时候,应该返回[1],[2]...所有与0相关的值,但这个id是否排序,要看下层实现是否排序。
* 如果有未找到的值,那么会向Map中插入空。
*
* @param keys
* @param keyFilterOrValueFilter 为true使用keyFilter,为false使用valueFilter
* @return
* @throws Exception
*/
Map<CloneableRecord, DuplicateKVPair> mgetWithDuplicate(List<CloneableRecord> keys, boolean prefixMatch,
boolean keyFilterOrValueFilter) throws TddlException;
/**
* 批量取数据的接口,返回是list,少了一次hash的开销 不会导致指针发生变动。 会将有相同数据的值全部取出,[按照给定keys的顺序返回]
* 比如一个索引, [0->0, 0->1 , 0->2...]
* 那么当mget(0)的时候,应该返回[1],[2]...所有与0相关的值,但这个id是否排序,要看下层实现是否排序。
* 如果有未找到的值,那么会向List中插入空。
*
* @param keys
* @param keyFilterOrValueFilter 为true使用keyFilter,为false使用valueFilter
* @return
* @throws Exception
*/
List<DuplicateKVPair> mgetWithDuplicateList(List<CloneableRecord> keys, boolean prefixMatch,
boolean keyFilterOrValueFilter) throws TddlException;
/**
* 用于判断数据是否已经准备好了。 刚结束查询的时候,这个值是false .直到有数据返回后,这个值会变为true.
* 并且只要变为true,就不再会回归到false的状态
*
* @return
*/
public boolean isDone();
/**
* 用于输出带缩进的字符串
*
* @param inden
* @return
*/
public String toStringWithInden(int inden);
/**
* 获取该cursor返回的所有列
*
* @return
* @throws Exception
*/
public List<ColumnMeta> getReturnColumns() throws TddlException;
}