package org.nutz.dao.util.cri; import static org.nutz.dao.util.cri.Exps.eq; import static org.nutz.dao.util.cri.Exps.gt; import static org.nutz.dao.util.cri.Exps.gte; import static org.nutz.dao.util.cri.Exps.inInt; import static org.nutz.dao.util.cri.Exps.inLong; import static org.nutz.dao.util.cri.Exps.inStr; import static org.nutz.dao.util.cri.Exps.inSql; import static org.nutz.dao.util.cri.Exps.isNull; import static org.nutz.dao.util.cri.Exps.like; import static org.nutz.dao.util.cri.Exps.lt; import static org.nutz.dao.util.cri.Exps.lte; import java.util.ArrayList; import java.util.List; import org.nutz.dao.entity.Entity; import org.nutz.dao.impl.sql.pojo.AbstractPItem; import org.nutz.dao.jdbc.ValueAdaptor; import org.nutz.dao.sql.Pojo; /** * 组合一组表达式,只能增加,不能减少 */ public class SqlExpressionGroup extends AbstractPItem implements SqlExpression { private List<SqlExpression> exps; private boolean top; public SqlExpressionGroup() { exps = new ArrayList<SqlExpression>(); // 默认就是10个,能放5个条件,够了吧 top = true; } public SqlExpressionGroup and(String name, String op, Object value) { return and(Exps.create(name, op, value)); } public SqlExpressionGroup and(SqlExpression exp) { if (!exps.isEmpty()) _add(new Static("AND")); return _add(exp); } public SqlExpressionGroup andEquals(String name, Object val) { if (null == val) return andIsNull(name); return and(eq(name, val)); } public SqlExpressionGroup andNotEquals(String name, Object val) { if (null == val) return andNotIsNull(name); return and(eq(name, val).not()); } public SqlExpressionGroup andIsNull(String name) { return and(isNull(name)); } public SqlExpressionGroup andNotIsNull(String name) { return and(isNull(name).not()); } public SqlExpressionGroup andGT(String name, long val) { return and(gt(name, val)); } public SqlExpressionGroup andGTE(String name, long val) { return and(gte(name, val)); } public SqlExpressionGroup andLT(String name, long val) { return and(lt(name, val)); } public SqlExpressionGroup andLTE(String name, long val) { return and(lte(name, val)); } public SqlExpressionGroup andIn(String name, long... ids) { return and(inLong(name, ids)); } public SqlExpressionGroup andInIntArray(String name, int... ids) { return and(inInt(name, ids)); } public SqlExpressionGroup andIn(String name, String... names) { return and(inStr(name, names)); } public SqlExpressionGroup andInBySql(String name, String subSql, Object... args) { return and(inSql(name, subSql, args)); } public SqlExpressionGroup andNotInBySql(String name, String subSql, Object... args) { return and(inSql(name, subSql, args).not()); } public SqlExpressionGroup andNotIn(String name, long... ids) { return and(inLong(name, ids).not()); } public SqlExpressionGroup andNotIn(String name, int... ids) { return and(inInt(name, ids).not()); } public SqlExpressionGroup andNotIn(String name, String... names) { return and(inStr(name, names).not()); } public SqlExpressionGroup andLike(String name, String value) { return and(like(name, value)); } public SqlExpressionGroup andNotLike(String name, String value) { return and(like(name, value).not()); } public SqlExpressionGroup andLike(String name, String value, boolean ignoreCase) { return and(like(name, value, ignoreCase)); } public SqlExpressionGroup andNotLike(String name, String value, boolean ignoreCase) { return and(like(name, value, ignoreCase).not()); } public SqlExpressionGroup or(String name, String op, Object value) { return or(Exps.create(name, op, value)); } public SqlExpressionGroup or(SqlExpression exp) { if (!exps.isEmpty()) _add(new Static("OR")); return _add(exp); } public SqlExpressionGroup orEquals(String name, Object val) { return or(eq(name, val)); } public SqlExpressionGroup orNotEquals(String name, Object val) { return or(eq(name, val).not()); } public SqlExpressionGroup orIsNull(String name) { return or(isNull(name)); } public SqlExpressionGroup orNotIsNull(String name) { return or(isNull(name).not()); } public SqlExpressionGroup orGT(String name, long val) { return or(gt(name, val)); } public SqlExpressionGroup orGTE(String name, long val) { return or(gte(name, val)); } public SqlExpressionGroup orLT(String name, long val) { return or(lt(name, val)); } public SqlExpressionGroup orLTE(String name, long val) { return or(lte(name, val)); } public SqlExpressionGroup orIn(String name, long... ids) { return or(inLong(name, ids)); } public SqlExpressionGroup orIn(String name, int... ids) { return or(inInt(name, ids)); } public SqlExpressionGroup orIn(String name, String... names) { return or(inStr(name, names)); } public SqlExpressionGroup orInBySql(String name, String subSql, Object... args) { return or(inSql(name, subSql, args)); } public SqlExpressionGroup orNotInBySql(String name, String subSql, Object... args) { return or(inSql(name, subSql, args).not()); } public SqlExpressionGroup orNotIn(String name, long... ids) { return or(inLong(name, ids).not()); } public SqlExpressionGroup orNotIn(String name, int... ids) { return or(inInt(name, ids).not()); } public SqlExpressionGroup orNotIn(String name, String... names) { return or(inStr(name, names).not()); } public SqlExpressionGroup orLike(String name, String value) { return or(like(name, value)); } public SqlExpressionGroup orNotLike(String name, String value) { return or(like(name, value).not()); } public SqlExpressionGroup orLike(String name, String value, boolean ignoreCase) { return or(like(name, value, ignoreCase)); } public SqlExpressionGroup orNotLike(String name, String value, boolean ignoreCase) { return or(like(name, value, ignoreCase).not()); } @Override public void setPojo(Pojo pojo) { super.setPojo(pojo); for (SqlExpression exp : exps) exp.setPojo(pojo); } private SqlExpressionGroup _add(SqlExpression exp) { if (null != exp) { exps.add(exp); exp.setPojo(pojo); if (exp instanceof SqlExpressionGroup) ((SqlExpressionGroup) exp).top = false; } return this; } public void joinSql(Entity<?> en, StringBuilder sb) { if (!exps.isEmpty()) { if (top) { sb.append(" WHERE "); for (SqlExpression exp : exps) exp.joinSql(en, sb); } else { sb.append('('); for (SqlExpression exp : exps) exp.joinSql(en, sb); sb.append(')'); } } } public int joinAdaptor(Entity<?> en, ValueAdaptor[] adaptors, int off) { for (SqlExpression exp : exps) off = exp.joinAdaptor(en, adaptors, off); return off; } public int joinParams(Entity<?> en, Object obj, Object[] params, int off) { for (SqlExpression exp : exps) off = exp.joinParams(en, obj, params, off); return off; } public int paramCount(Entity<?> en) { int re = 0; for (SqlExpression exp : exps) re += exp.paramCount(en); return re; } public SqlExpression setNot(boolean not) { return this; } public boolean isEmpty() { return exps.isEmpty(); } public List<SqlExpression> cloneExps() { return new ArrayList<SqlExpression>(exps); } public void setTop(boolean top) { this.top = top; } public List<SqlExpression> getExps() { return exps; } }