package org.nutz.dao.util.cri;
import java.util.Collection;
import org.nutz.castor.Castors;
import org.nutz.lang.Lang;
import org.nutz.lang.Mirror;
import org.nutz.lang.Strings;
/**
* 表达式的帮助函数
*
* @author zozoh(zozohtnt@gmail.com)
*/
public abstract class Exps {
public static SqlExpressionGroup begin() {
return new SqlExpressionGroup();
}
public static Like like(String name, String value) {
return Like.create(name, value, true);
}
public static Like like(String name, String value, boolean ignoreCase) {
return Like.create(name, value, ignoreCase);
}
public static IsNull isNull(String name) {
return new IsNull(name);
}
public static SimpleExpression eq(String name, Object val) {
return new SimpleExpression(name, "=", val);
}
public static SimpleExpression gt(String name, long val) {
return new SimpleExpression(name, ">", val);
}
public static SimpleExpression lt(String name, long val) {
return new SimpleExpression(name, "<", val);
}
public static SimpleExpression gte(String name, long val) {
return new SimpleExpression(name, ">=", val);
}
public static SimpleExpression lte(String name, long val) {
return new SimpleExpression(name, "<=", val);
}
public static IntRange inInt(String name, int... ids) {
return new IntRange(name, ids);
}
public static LongRange inLong(String name, long... ids) {
return new LongRange(name, ids);
}
public static NameRange inStr(String name, String... names) {
return new NameRange(name, names);
}
public static SqlRange inSql(String name, String subSql, Object... args) {
return new SqlRange(name, subSql, args);
}
public static SqlExpression create(String name, String op, Object value) {
op = Strings.trim(op.toUpperCase());
// NULL
if (null == value) {
SqlExpression re;
// IS NULL
if ("=".equals(op) || "IS".equals(op) || "NOT IS".equals(op) || "IS NOT".equals(op)) {
re = isNull(name);
}
// !!!
else {
throw Lang.makeThrow("null can only use 'IS' or 'NOT IS'");
}
return re.setNot(op.startsWith("NOT") || op.endsWith("NOT"));
}
// IN
else if ("IN".equals(op) || "NOT IN".equals(op)) {
Class<?> type = value.getClass();
SqlExpression re;
// 数组
if (type.isArray()) {
re = _evalRange((Mirror<?>) Mirror.me(type.getComponentType()), name, value);
}
// 集合
else if (Collection.class.isAssignableFrom(type)) {
Object first = Lang.first(value);
if (null == first)
return null;
re = _evalRange((Mirror<?>) Mirror.me(first), name, value);
}
// Sql Range
else {
re = inSql(name, value.toString());
}
return re.setNot(op.startsWith("NOT"));
}
// LIKE || IS
else if ("LIKE".equals(op) || "NOT LIKE".equals(op)) {
String v = value.toString();
Like re;
if (v.length() == 1) {
re = like(name, v);
} else {
re = like(name, v.substring(1, v.length() - 1));
re.left(v.substring(0, 1));
re.right(v.substring(v.length() - 1, v.length()));
}
return re.ignoreCase(false).setNot(op.startsWith("NOT"));
}
// =
else if ("=".equals(op)) {
return eq(name, value);
}
// !=
else if ("!=".equals(op) || "<>".equals(op)) {// TODO 检查一下,原本是&&, 明显永远成立
return eq(name, value).setNot(true);
}
// Others
return new SimpleExpression(name, op, value);
}
private static SqlExpression _evalRange(Mirror<?> mirror, String name, Object value) {
if (mirror.isInt())
return inInt(name, Castors.me().castTo(value, int[].class));
else if (mirror.isLong())
return inLong(name, Castors.me().castTo(value, long[].class));
return inStr(name, Castors.me().castTo(value, String[].class));
}
}