package jef.database.annotation;
import java.util.Collection;
import jef.database.query.RegexpDimension;
/**
* 描述一个分表字段的处理逻辑。
* 例如:表 BILL结构如下:(
* BILL_ID NUMBER(10),
* BILL_CUSTOM NUMBER(10),
* BILL_AMOUNT NUMBER(10,2),
* BILL_START_DATE DATE,
* BILL_END_DATE DATE
* }
* 此时我们设置<code><pre>@PartitionTable(key = {
* @PartitionKey(field = "billStartDate", length = 1,function=KeyFunction.WEEKDAY)
*})</pre></code>
*
* 表示对billStartDate中的日期进行星期运算,然后将星期几作为表名的后缀来处理。
* 我们还可以自行编写很多分表字段的逻辑处理函数,例如
* <pre><code>@PartitionTable(key = {
* @PartitionKey(field = "billId", length = 1,function=ModulusFunction.class,functionClassConstructorParams="50")
*})</code></pre>
*表示对billId使用ModulusFunction这个类进行处理(即取模运算),取模的参数值是50.
*
*/
public interface PartitionFunction<T> {
/**
* 计算分表的表名文本片段
* @param value DB操作对象的字段值
* @return 分表维度值
*/
String eval(T value);
/**
* 由用户实现:
* 计算min到max之间的分布值
* 输入的四个参数构成一个区间,left,right分别表示左右区间是否为闭区间。
* 比如min=2 max=7,left=right=true,那么这个区间即为[2,7],实际返回2,3,4,5,6,7。
* 而当min=2011-1-1,max=2011-3-10,那么有些实现(按月)返回2011-1到2011-3的三个值,
* 有些实现(按天)返回这期间的所有天。
*
* 实现的时候要注意min和max都有可能为null,从而表示无边界
* @param min
* @param max
* @param left 左闭区间
* @param right 右闭区间
* @return
*/
Collection<T> iterator(T min,T max,boolean left,boolean right);
/**
* 是否支持传入正则
* @return
* @deprecated
*/
boolean acceptRegexp();
/**
* 按正则枚举
* @param regexp
* @return
* @deprecated
*/
Collection<T> iterator(RegexpDimension regexp);
}