package jef.database.routing.function;
import java.math.BigInteger;
import java.util.ArrayList;
import java.util.Collection;
import java.util.List;
import jef.database.query.RegexpDimension;
import jef.tools.StringUtils;
/**
* 分表字段处理函数:ModulusFunction
* 对指定字段取摸
*
* @author Administrator
*
*/
public class ModulusFunction extends AbstractNumberFunction{
private BigInteger mod;
public ModulusFunction(String string) {
long l=StringUtils.toLong(string, 0L);
this.mod=BigInteger.valueOf(l);
}
public ModulusFunction(int i) {
this.mod=BigInteger.valueOf(i);
}
public String eval(Number value) {
BigInteger l=BigInteger.valueOf(value.longValue());
return l.mod(mod).toString();
}
public List<Number> iterator(Number minn, Number maxn, boolean left, boolean right) {
if(minn==null || maxn==null){
return allModulus(); //任何一侧没有限制的话,都返回无限的取模区间.
//但是如果考虑到一般来说,分表维度值都是正数的话,那么这里还能优化:比如 where a<5,此时实际上只要查0,1,2,3,4等五张表就够了
}
List<Number> ret=new ArrayList<Number>();
if(minn instanceof Integer){//按int计算
int min=minn.intValue();
int max=maxn.intValue();
if (!left)
min++;
if (!right)
max--;
for (int i = min; i <= max; i++) {
ret.add(i);
}
}else{
long min = minn.longValue();
long max = maxn.longValue();
if (!left)
min++;
if (!right)
max--;
for (long i = min; i <= max; i++) {
ret.add(i);
}
}
return ret;
}
private List<Number> allModulus() {
List<Number> ret=new ArrayList<Number>();
for(int i=0;i<mod.intValue();i++){
ret.add(i);
}
return ret;
}
private static ModulusFunction DEFAULT;
public static ModulusFunction getDefault(){
if(DEFAULT==null){
DEFAULT=new ModulusFunction(10);
}
return DEFAULT;
}
public boolean acceptRegexp() {
return false;
}
public Collection<Number> iterator(RegexpDimension regexp) {
throw new UnsupportedOperationException();
}
}