package jef.database.query;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Iterator;
import java.util.List;
import java.util.TreeSet;
import jef.database.annotation.PartitionFunction;
import org.apache.commons.lang.StringUtils;
/**
* 描述一个非连续区间
* @author jiyi
*
*/
public class ComplexDimension implements Dimension {
private final List<Dimension> ranges=new ArrayList<Dimension>();
@SuppressWarnings({ "rawtypes", "unchecked" })
public static ComplexDimension create(Comparable[] objs){
if(objs.length==0)return null;
ComplexDimension result=new ComplexDimension(new RangeDimension(objs[0]));
for(int i=1;i<objs.length;i++){
result.mergeOr(new RangeDimension(objs[i]));
}
return result;
}
public ComplexDimension(Dimension dimensions){
ranges.add(dimensions);
}
public Dimension mergeAnd(Dimension d) {
for(int i=0;i<ranges.size();i++){
ranges.set(i,ranges.get(i).mergeAnd(d));
}
check();
return this;
}
public Dimension mergeOr(Dimension d) {
ranges.add(d);
check();
return this;
}
public Dimension mergeNot() {
Dimension result=null;
for(int i=0;i<ranges.size();i++){
if(result==null){
result=ranges.get(i).mergeNot();
}else{
result=result.mergeAnd(ranges.get(i).mergeNot());
}
}
return result;
}
@SuppressWarnings({ "rawtypes", "unchecked" })
public Collection<?> toEnumationValue(Collection<PartitionFunction> function) {
Collection set=new TreeSet();
for(Dimension d: ranges){
Collection<?> objs=d.toEnumationValue(function);
// if(objs.length==2 && (objs[0]==null || objs[1]==null)){//出现正负无穷的枚举就不处理
// break;
// }
set.addAll(objs);
}
return set;
}
@Override
public String toString() {
if(ranges.size()>0)return StringUtils.join(ranges," || ");
return "invalid!";
}
/**
* 合并出现重叠的区间.清除无效的区间
*/
private void check() {
for(Iterator<Dimension> iter=ranges.iterator();iter.hasNext();){
Dimension d=iter.next();
if(!d.isValid()){
iter.remove();
}
}
}
public boolean isValid() {
return ranges.size()>0;
}
}