package com.taobao.tddl.optimizer.parse.hint;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Set;
import com.taobao.tddl.rule.model.sqljep.Comparative;
import com.taobao.tddl.rule.model.sqljep.ComparativeMapChoicer;
/**
* 基于tddl-rule的hint条件
*
* @author jianghang 2014-1-13 下午5:09:34
* @since 5.0.0
*/
public class RuleRouteCondition extends ExtraCmdRouteCondition implements RouteCondition, ComparativeMapChoicer {
private Map<String, Comparative> parameters = new HashMap<String, Comparative>();
/**
* 添加一个默认为=的参数对
*
* @param str 参数项名字
* @param comp 参数项值,一般为基本类型或可比较类型
*/
public void put(String key, Comparable<?> parameter) {
if (key == null) {
throw new IllegalArgumentException("key为null");
}
if (parameter instanceof Comparative) {
parameters.put(key.toUpperCase(), (Comparative) parameter);
} else {
// (parameter instanceof Comparable<?>
parameters.put(key.toUpperCase(), getComparative(Comparative.Equivalent, parameter));
}
}
public Comparative getComparative(int i, Comparable<?> c) {
return new Comparative(i, c);
}
public Map<String, Comparative> getColumnsMap(List<Object> arguments, Set<String> partnationSet) {
Map<String, Comparative> retMap = new HashMap<String, Comparative>(parameters.size());
for (String str : partnationSet) {
if (str != null) {
// 因为groovy是大小写敏感的,因此这里只是在匹配的时候转为小写,放入map中的时候仍然使用原来的大小写
Comparative comp = parameters.get(str.toUpperCase());
if (comp != null) {
retMap.put(str, comp);
}
}
}
return retMap;
}
public Comparative getColumnComparative(List<Object> arguments, String colName) {
Comparative res = null;
if (colName != null) {
// 因为groovy是大小写敏感的,因此这里只是在匹配的时候转为小写,放入map中的时候仍然使用原来的大小写
Comparative comp = parameters.get(colName.toUpperCase());
if (comp != null) {
res = comp;
}
}
return res;
}
public Map<String, Comparative> getParameters() {
return parameters;
}
public ComparativeMapChoicer getCompMapChoicer() {
return this;
}
}