package com.taobao.top.analysis.statistics.data.impl;
import java.util.ArrayList;
import java.util.List;
import org.apache.commons.lang.StringUtils;
import com.taobao.top.analysis.exception.AnalysisException;
import com.taobao.top.analysis.statistics.data.IFilter;
import com.taobao.top.analysis.util.AnalysisConstants;
import com.taobao.top.analysis.util.ReportUtil;
public class SimpleFilter implements IFilter {
/**
*
*/
private static final long serialVersionUID = 7515455764712362921L;
/**
* 值过滤条件
*/
private final List<Object> valuefilterStack;
/**
* 值过滤条件中的操作符列表
*/
private final List<Byte> valuefilterOpStack;
/**
* 是否需要格式化结果,在报表生成的时候格式化,当前支持round
*/
private final List<String> formatStack;
public List<Object> getValuefilterStack() {
return valuefilterStack;
}
public List<Byte> getValuefilterOpStack() {
return valuefilterOpStack;
}
public List<String> getFormatStack() {
return formatStack;
}
public SimpleFilter(String valuefilter) throws AnalysisException {
if (valuefilter != null && !"".equals(valuefilter)) {
String[] filters = StringUtils.split(valuefilter, "&");
valuefilterStack = new ArrayList<Object>();
valuefilterOpStack = new ArrayList<Byte>();
formatStack = new ArrayList<String>();
for (String f : filters) {
if (f.startsWith(AnalysisConstants.CONDITION_ROUND_STR))
formatStack.add(f);
else {
if (f.startsWith(AnalysisConstants.CONDITION_ISNUMBER_STR)) {
valuefilterOpStack.add(ReportUtil.generateOperationFlag(f));
valuefilterStack.add(f);
} else {
if (f.startsWith(AnalysisConstants.CONDITION_EQUALORGREATER_STR)
|| f.startsWith(AnalysisConstants.CONDITION_EQUALORLESSER_STR)
|| f.startsWith(AnalysisConstants.CONDITION_NOT_EQUAL_STR)) {
valuefilterOpStack.add(ReportUtil.generateOperationFlag(f.substring(0, 2)));
if (f.startsWith(AnalysisConstants.CONDITION_NOT_EQUAL_STR))
valuefilterStack.add(f.substring(2));
else
valuefilterStack.add(Double.valueOf(f.substring(2)));
} else {
if (f.startsWith(AnalysisConstants.CONDITION_EQUAL_STR)
|| f.startsWith(AnalysisConstants.CONDITION_GREATER_STR)
|| f.startsWith(AnalysisConstants.CONDITION_LESSER_STR)) {
valuefilterOpStack.add(ReportUtil.generateOperationFlag(f.substring(0, 1)));
if (f.startsWith(AnalysisConstants.CONDITION_EQUAL_STR))
valuefilterStack.add(f.substring(1));
else
valuefilterStack.add(Double.valueOf(f.substring(1)));
}
}
}
}
}
}else{
valuefilterStack = null;
valuefilterOpStack = null;
formatStack = null;
}
}
@Override
public Object filter(Object value) {
if (valuefilterStack == null
|| (valuefilterStack != null && valuefilterStack.size() == 0))
return value;
try {
for (int i = 0; i < valuefilterStack.size(); i++) {
Object filterValue = valuefilterStack.get(i);
Byte filterOpt = valuefilterOpStack.get(i);
if (filterOpt == AnalysisConstants.CONDITION_ISNUMBER) {
Double.parseDouble(value.toString());
}
if (filterOpt == AnalysisConstants.CONDITION_EQUAL) {
if (value.equals(filterValue)) {
continue;
} else
return null;
}
if (filterOpt == AnalysisConstants.CONDITION_EQUALORGREATER) {
Double v = Double.valueOf(value.toString());
Double compareValue = (Double)filterValue;
if (v >= compareValue) {
continue;
} else
return null;
}
if (filterOpt == AnalysisConstants.CONDITION_EQUALORLESSER) {
Double v = Double.valueOf(value.toString());
Double compareValue = (Double)filterValue;
if (v <= compareValue) {
continue;
} else
return null;
}
if (filterOpt == AnalysisConstants.CONDITION_GREATER) {
Double v = Double.valueOf(value.toString());
Double compareValue = (Double)filterValue;
if (v > compareValue) {
continue;
} else
return null;
}
if (filterOpt == AnalysisConstants.CONDITION_LESSER) {
Double v = Double.valueOf(value.toString());
Double compareValue = (Double)filterValue;
if (v < compareValue) {
continue;
} else
return null;
}
if (filterOpt == AnalysisConstants.CONDITION_NOT_EQUAL) {
if (!value.equals(filterValue)) {
continue;
} else
return null;
}
}
} catch (Exception ex) {
return null;
}
return value;
}
}