package com.taobao.tddl.optimizer.utils.range;
import java.util.ArrayList;
import java.util.LinkedList;
import java.util.List;
import com.google.common.collect.Lists;
import com.taobao.tddl.optimizer.core.expression.IBooleanFilter;
import com.taobao.tddl.optimizer.core.expression.IFilter;
import com.taobao.tddl.optimizer.core.expression.ISelectable;
/**
* @author jianghang 2013-11-13 下午4:08:47
* @since 5.0.0
*/
public class AndRangeProcessor extends AbstractRangeProcessor {
private final Comparable column;
private Range wholeRange = null;
private final List<IFilter> otherFilters = new ArrayList();
boolean emptySet = false;
public AndRangeProcessor(Comparable c){
this.column = c;
}
@Override
public boolean process(IFilter f) {
if (f != null && ((IBooleanFilter) f).getValue() instanceof ISelectable) {
// 不处理column = column的filter
otherFilters.add(f);
return true;
}
if (!(((IBooleanFilter) f).getColumn() instanceof ISelectable)) {
// 不处理value=value的filter
otherFilters.add(f);
return true;
}
Range range = getRange((IBooleanFilter) f);
// 类似like noteq等操作符
if (range == null) {
otherFilters.add(f);
return true;
}
if (this.wholeRange == null) {
this.wholeRange = range;
return true;
}
// 若有交集,则交
// 否则为空集,直接返回
if (wholeRange.intersects(range)) {
wholeRange = wholeRange.intersect(range);
return true;
} else {
emptySet = true;
return false;
}
}
public List<IFilter> toFilterList() {
if (this.emptySet) {
return Lists.newLinkedList();
}
List<IFilter> boolNodes = new LinkedList();
boolNodes.addAll(otherFilters);
boolNodes.addAll(buildFilter(wholeRange, column));
return boolNodes;
}
}