package org.sothis.dal.query; import java.util.Collections; import java.util.LinkedList; import java.util.List; /** * 查询条件类。通过本类可以简便的生成查询条件。 * * @author velna * */ public class Cnd implements OrderBy { private Object left; private Object op; private Object right; private boolean not; private List<Sort> sorts; private Cnd() { this.left = null; this.op = null; this.right = null; } private Cnd(Object left, Object op, Object right) { if (null == op) { throw new IllegalArgumentException("op can not be null"); } this.left = left; this.op = op; this.right = right; } /** * 生成一个由简单表达式开始的查询条件 * * @param field * 字段名 * @param op * 操作符 * @param value * 字段值 * @return */ public static Cnd make(String field, Object op, Object value) { return new Cnd(field, op, value); } /** * 相当于Cnd.make(field, Op.EQ, value); * * @param field * @param value * @return */ public static Cnd make(String field, Object value) { return new Cnd(field, Op.EQ, value); } /** * 创建一个只有排序的条件 * * @param field * @param asc * @return */ public static Cnd orderBy(String field, boolean asc) { if (asc) { return new Cnd().asc(field); } else { return new Cnd().desc(field); } } private List<Sort> sorts() { if (null == this.sorts) { this.sorts = new LinkedList<Sort>(); } return sorts; } private void append(Cnd cnd, Logic logic) { if (null == this.op) { this.left = cnd.left; this.right = cnd.right; this.op = cnd.op; } else { Cnd left = new Cnd(this.left, this.op, this.right); this.left = left; this.right = cnd; this.op = logic; } if (null != cnd.sorts) { this.sorts().addAll(cnd.sorts); } } /** * 向当前条件添加一个条件,并用and逻辑运算符进行连接 * * @param cnd * @return */ public Cnd and(Cnd cnd) { append(cnd, Logic.AND); return this; } /** * 向当前条件添加一个简单表达式,并用and逻辑运算符进行连接 * * @param field * @param op * @param value * @return */ public Cnd and(String field, Object op, Object value) { append(new Cnd(field, op, value), Logic.AND); return this; } /** * 相当于cnd.and(field, Op.EQ, value); * * @param field * @param value * @return */ public Cnd and(String field, Object value) { append(new Cnd(field, Op.EQ, value), Logic.AND); return this; } /** * 向当前条件添加一个条件,并用or逻辑运算符进行连接 * * @param cnd * @return */ public Cnd or(Cnd cnd) { append(cnd, Logic.OR); return this; } /** * 向当前条件添加一个简单表达式,并用or逻辑运算符进行连接 * * @param field * @param op * @param value * @return */ public Cnd or(String field, Object op, Object value) { append(new Cnd(field, op, value), Logic.OR); return this; } /** * 相当于cnd.or(field, Op.EQ, value); * * @param field * @param value * @return */ public Cnd or(String field, Object value) { append(new Cnd(field, Op.EQ, value), Logic.OR); return this; } /** * 对当前条件进行取反逻辑运算 * * @return */ public Cnd not() { this.not = true; return this; } @Override public Cnd asc(String field) { this.sorts().add(new Sort(field, true)); return this; } @Override public Cnd desc(String field) { this.sorts().add(new Sort(field, false)); return this; } @Override public String toString() { StringBuilder ret = new StringBuilder(); if (not) { ret.append('!'); } if (not || op instanceof Logic) { ret.append("("); } ret.append(left).append(' ').append(op).append(' ').append(right); if (not || op instanceof Logic) { ret.append(")"); } return ret.toString(); } /** * 得到条件的左运算符 * * @return */ public Object getLeft() { return left; } /** * 得到条件的操作符 * * @return */ public Object getOp() { return op; } /** * 得到条件的右运算符 * * @return */ public Object getRight() { return right; } /** * 得到当前条件是否已取反 * * @return */ public boolean isNot() { return not; } /** * 得到当前条件是否只有排序 * * @return */ public boolean isOrderByOnly() { return op == null; } @Override public List<Sort> getSorts() { if (null == this.sorts) { return Collections.emptyList(); } return Collections.unmodifiableList(sorts); } }