package com.taobao.tddl.optimizer.utils.range;
import java.util.ArrayList;
import java.util.List;
import com.taobao.tddl.optimizer.core.ASTNodeFactory;
import com.taobao.tddl.optimizer.core.datatype.DataType;
import com.taobao.tddl.optimizer.core.datatype.DataTypeUtil;
import com.taobao.tddl.optimizer.core.expression.IBooleanFilter;
import com.taobao.tddl.optimizer.core.expression.IFilter;
import com.taobao.tddl.optimizer.core.expression.IFilter.OPERATION;
import com.taobao.tddl.optimizer.core.expression.ISelectable;
/**
* @author jianghang 2013-11-13 下午4:11:25
* @since 5.0.0
*/
public abstract class AbstractRangeProcessor {
/**
* 处理下filter
*/
public abstract boolean process(IFilter f);
/**
* 构造Range对象
*
* @param f
* @return
*/
protected Range getRange(IBooleanFilter f) {
DataType type = getColumn(f).getDataType();
if (type == null) {
type = DataTypeUtil.getTypeOfObject(f.getValue());
}
switch (f.getOperation()) {
case EQ:
return new Range(null, type, getValue(f), getValue(f));
case GT:
return new Range(null, type, getValue(f), false, null, true);
case GT_EQ:
return new Range(null, type, getValue(f), true, null, true);
case LT:
return new Range(null, type, null, true, getValue(f), false);
case LT_EQ:
return new Range(null, type, null, true, getValue(f), true);
default:
return null;
}
}
protected Comparable getValue(IBooleanFilter f) {
return (Comparable) f.getValue();
}
protected ISelectable getColumn(IBooleanFilter f) {
return (ISelectable) f.getColumn();
}
/**
* 根据range结果,构造filter
*
* @param range
* @param column
* @return
*/
protected List<IFilter> buildFilter(Range range, Object column) {
List<IFilter> filters = new ArrayList(2);
if (range == null) {
return filters;
}
if (range.isSingleValue()) {
IBooleanFilter en = ASTNodeFactory.getInstance().createBooleanFilter().setOperation(OPERATION.EQ);
en.setColumn(column);
en.setValue(range.getMaxValue());
filters.add(en);
return filters;
}
if (range.getMinValue() != null) {
IBooleanFilter gn;
if (range.isMinIncluded()) {
gn = ASTNodeFactory.getInstance().createBooleanFilter().setOperation(OPERATION.GT_EQ);
} else {
gn = ASTNodeFactory.getInstance().createBooleanFilter().setOperation(OPERATION.GT);
}
gn.setColumn(column);
gn.setValue(range.getMinValue());
filters.add(gn);
}
if (range.getMaxValue() != null) {
IBooleanFilter ln;
if (range.isMaxIncluded()) {
ln = ASTNodeFactory.getInstance().createBooleanFilter().setOperation(OPERATION.LT_EQ);
} else {
ln = ASTNodeFactory.getInstance().createBooleanFilter().setOperation(OPERATION.LT);
}
ln.setColumn(column);
ln.setValue(range.getMaxValue());
filters.add(ln);
}
return filters;
}
}