package com.github.walker.easydb.criterion; import com.github.walker.easydb.exception.CriteriaException; import java.util.HashSet; import java.util.Iterator; import java.util.Vector; /** * 复合表达式类 * * @author HuQingmiao */ public class CriteriaGroup extends Criteria { public final static String and = "AND"; public final static String or = "OR"; private static HashSet<String> opSet = new HashSet<String>(4); static { opSet.add(and); opSet.add(or); } private Vector<Criteria> vec = new Vector<Criteria>(5); private String op;// 运算符 /** * 构造条件组 * * @param operator 二元运算符, 如 "AND","OR" */ public CriteriaGroup(String operator) { operator = operator.toUpperCase(); // CriteriaGroup只支持如下运算符:'AND','OR' 。 if (!opSet.contains(operator)) { new CriteriaException(CriteriaException.NOT_SUPPORTED_OP, ""); } this.op = operator; } /** * 添加子条件 * * @param c 子条件表达示 */ public CriteriaGroup add(Criteria c) throws CriteriaException { if (c == this) { throw new CriteriaException(CriteriaException.CANNOT_ADD_THIS, ""); } vec.add(c); return this; } /** * 删除子条件 * * @param c 子条件表达示 */ public CriteriaGroup remove(Criteria c) throws CriteriaException { if (!vec.contains(c)) { throw new CriteriaException(CriteriaException.REMOVE_NOTEXIST, ""); } vec.remove(c); return this; } /** * 取得表达式中操作符左边字符串对应的值 * * @param left 表达式中操作符左边的字符串 * @return 表达式左边字符串对应的值 */ public String getValueByLeft(String left) { String upColName = left.toUpperCase(); for (Iterator<Criteria> it = vec.iterator(); it.hasNext(); ) { Criteria c = it.next(); if (c instanceof SimpleExpression) { SimpleExpression c1 = (SimpleExpression) c; // if the operator is '=', and the column name equals the // parameter if (c1.getOp().equals("=") && c1.getLeft().equals(upColName)) { return c1.getValue(); } } else if (c instanceof CriteriaGroup) { CriteriaGroup cg = (CriteriaGroup) c; // 只有条件组的操作符为AND,才能取得某列的精确值 if (cg.op.equals(CriteriaGroup.and)) { String value = cg.getValueByLeft(left); if (value != null) { return value; } } } } return null; } public String toSqlString() { StringBuffer buff = new StringBuffer(); buff.append("("); for (Iterator<Criteria> it = vec.iterator(); it.hasNext(); ) { Criteria c = it.next(); buff.append(c.toString()).append(" "); buff.append(this.op).append(" "); } // 删除最后的操作符及其前后空格 if (buff.indexOf(this.op) > 0) { buff.delete(buff.length() - this.op.length() - 2, buff.length()); } buff.append(")"); return buff.toString(); } }