package jef.database.query;
import java.util.ArrayList;
import java.util.Collection;
import java.util.HashSet;
import java.util.List;
import java.util.Set;
import jef.database.annotation.PartitionFunction;
import jef.tools.string.CharUtils;
public class RegexpDimension implements Dimension,Comparable<Object>{
private String baseExp;
public RegexpDimension(String baseExp){
this.baseExp=baseExp;
}
public boolean isValid() {
return baseExp!=null;
}
public Dimension mergeAnd(Dimension d) {
throw new UnsupportedOperationException();
}
public Dimension mergeOr(Dimension d) {
ComplexDimension com=new ComplexDimension(this);
return com.mergeOr(d);
}
public Dimension mergeNot() {
throw new UnsupportedOperationException();
}
@SuppressWarnings("rawtypes")
public Collection<?> toEnumationValue(Collection<PartitionFunction> function) {
if(function.size()==1){
return process(function.iterator().next());
}
Set<?> result=new HashSet();
for(PartitionFunction<?> f:function){
Collection c=process(f);
if(c.isEmpty())return c;
result.addAll(c);
}
return result;
}
private Collection<?> process(PartitionFunction<?> next) {
if(next.acceptRegexp()){
return next.iterator(this);
}
List<String> list=new ArrayList<String>(100);
for(char c: CharUtils.ALPHA_NUM_UNDERLINE){
list.add(baseExp+c);
}
return list;
}
public String getBaseExp() {
return baseExp;
}
public int compareTo(Object o) {
if(o instanceof RegexpDimension){
return this.baseExp.compareTo(((RegexpDimension) o).baseExp);
}else if(o instanceof String){
return this.baseExp.compareTo((String)o);
}
return 1;
}
}