package com.fourinone;
import java.util.Date;
import java.lang.reflect.Array;
public interface Filter<T,S> extends CoolHashBase{
T getFilterKey();
S[] getFilterValue();
boolean match(byte[] vb);
public class ValueFilter<T,S> implements Filter<T,S>{
private T filterKey;
private S[] filterValue;
Condition valuecd;
ValueFilter(T filterKey, S filterValue) throws CoolHashException{
this.filterKey=filterKey;
this.filterValue=(S[])Array.newInstance(filterValue.getClass(), 1);
this.filterValue[0]=filterValue;
defineValueException();
}
ValueFilter(T filterKey, S fromObj, S toObj) throws CoolHashException{
this.filterKey=filterKey;
this.filterValue=(S[])Array.newInstance(fromObj.getClass(), 2);
this.filterValue[0]=fromObj;
this.filterValue[1]=toObj;
defineValueException();
}
ValueFilter(T filterKey, S[] filterValue) throws CoolHashException{
this.filterKey=filterKey;
this.filterValue=filterValue;
defineValueException();
}
public T getFilterKey(){
return filterKey;
}
public S[] getFilterValue(){
return filterValue;
}
public static <T extends Number> Filter greater(T targetObj) throws CoolHashException{
return new ValueFilter<String, T>(Condition.Action.OP_GREATER.name(), targetObj);
}
public static <T extends Number> Filter less(T targetObj) throws CoolHashException{
return new ValueFilter<String, T>(Condition.Action.OP_LESS.name(), targetObj);
}
public static <T extends Number> Filter equals(T targetObj) throws CoolHashException{
return new ValueFilter<String, T>(Condition.Action.OP_EQUALS.name(), targetObj);
}
public static <T extends Number> Filter notEquals(T targetObj) throws CoolHashException{
return new ValueFilter<String, T>(Condition.Action.OP_NOTEQUALS.name(), targetObj);
}
public static <T extends Number> Filter between(T fromObj, T toObj) throws CoolHashException{
return new ValueFilter<String, T>(Condition.Action.OP_BETWEEN.name(), fromObj, toObj);
}
public static <T extends Number> Filter betweenEquals(T fromObj, T toObj) throws CoolHashException{
return new ValueFilter<String, T>(Condition.Action.OP_BETWEEN_EQUALS.name(), fromObj, toObj);
}
public static Filter earlier(Date targetDate) throws CoolHashException{
return greater(targetDate.getTime());
}
public static Filter later(Date targetDate) throws CoolHashException{
return less(targetDate.getTime());
}
public static Filter same(Date targetDate) throws CoolHashException{
return equals(targetDate.getTime());
}
public static Filter notSame(Date targetDate) throws CoolHashException{
return notEquals(targetDate.getTime());
}
public static Filter during(Date fromDate, Date toDate) throws CoolHashException{
return between(fromDate.getTime(), toDate.getTime());
}
public static Filter duringInclude(Date fromDate, Date toDate) throws CoolHashException{
return betweenEquals(fromDate.getTime(), toDate.getTime());
}
public static Filter equalsString(String targetObj) throws CoolHashException{
return new ValueFilter<String, String>(Condition.Action.OP_EQUALS_STR.name(), targetObj);
}
public static Filter notEqualsString(String targetObj) throws CoolHashException{
return new ValueFilter<String, String>(Condition.Action.OP_NOTEQUALS_STR.name(), targetObj);
}
public static Filter startsWith(String targetObj) throws CoolHashException{
return new ValueFilter<String, String>(Condition.Action.OP_STARTSWITH.name(), targetObj);
}
public static Filter endsWith(String targetObj) throws CoolHashException{
return new ValueFilter<String, String>(Condition.Action.OP_ENDSWITH.name(), targetObj);
}
public static Filter contains(String targetObj) throws CoolHashException{
return new ValueFilter<String, String>(Condition.Action.OP_CONTAINS.name(), targetObj);
}
public static Filter beContained(String targetObj) throws CoolHashException{
return new ValueFilter<String, String>(Condition.Action.OP_BECONTAINED.name(), targetObj);
}
public static Filter matches(String regex) throws CoolHashException{
chex.checkingRegex(regex);
return new ValueFilter<String, String>(Condition.Action.OP_MATCHES.name(), regex);
}
private void defineValueException() throws CoolHashException{
for(int i=1;i<filterValue.length;i++)
if(!filterValue[0].getClass().equals(filterValue[i].getClass()))
throw new CoolHashException("the parameter object class type are not same!");
chex.checkTargetMatch(filterValue[0].getClass());
valuecd=ConstantBit.Target.getTargetMatch(filterValue[0].getClass());
}
public boolean match(byte[] vb){
return valuecd.matchAction(this, vb);
}
public static void main(String[] args){
}
}
interface Condition<T,S> {
boolean matchAction(T key, S value);
enum Action implements Condition{
OP_GREATER{
public boolean matchAction(Object key, Object value){
return (((Number)key).doubleValue()>(((Number[])value)[0]).doubleValue());
}
},
OP_LESS{
public boolean matchAction(Object key, Object value){
return (((Number)key).doubleValue()<(((Number[])value)[0]).doubleValue());
}
},
OP_EQUALS{
public boolean matchAction(Object key, Object value){
return (((Number)key).doubleValue()==(((Number[])value)[0]).doubleValue());
}
},
OP_NOTEQUALS{
public boolean matchAction(Object key, Object value){
return (((Number)key).doubleValue()!=(((Number[])value)[0]).doubleValue());
}
},
OP_GREATER_EQUALS{
public boolean matchAction(Object key, Object value){
return (((Number)key).doubleValue()>=(((Number[])value)[0]).doubleValue());
}
},
OP_LESS_EQUALS{
public boolean matchAction(Object key, Object value){
return (((Number)key).doubleValue()<=(((Number[])value)[0]).doubleValue());
}
},
OP_BETWEEN{
public boolean matchAction(Object key, Object value){
return (((Number)key).doubleValue()>(((Number[])value)[0]).doubleValue()&&((Number)key).doubleValue()<(((Number[])value)[1]).doubleValue());
}
},
OP_BETWEEN_EQUALS{
public boolean matchAction(Object key, Object value){
return (((Number)key).doubleValue()>=(((Number[])value)[0]).doubleValue()&&((Number)key).doubleValue()<=(((Number[])value)[1]).doubleValue());
}
},
OP_EQUALS_STR{
public boolean matchAction(Object key, Object value){
return ((String)key).equals(((String[])value)[0]);
}
},
OP_NOTEQUALS_STR{
public boolean matchAction(Object key, Object value){
return !((String)key).equals(((String[])value)[0]);
}
},
OP_STARTSWITH{
public boolean matchAction(Object key, Object value){
return ((String)key).startsWith(((String[])value)[0]);
}
},
OP_ENDSWITH{
public boolean matchAction(Object key, Object value){
return ((String)key).endsWith(((String[])value)[0]);
}
},
OP_CONTAINS{
public boolean matchAction(Object key, Object value){
return ((String)key).contains(((String[])value)[0]);
}
},
OP_BECONTAINED{
public boolean matchAction(Object key, Object value){
return ((String[])value)[0].contains((String)key);
}
},
OP_MATCHES{
public boolean matchAction(Object key, Object value){
return ((String)key).matches(((String[])value)[0]);
}
};
};
}
}