package play.db.helper; import java.util.ArrayList; import java.util.List; public abstract class SqlQuery { protected List<Object> params; protected SqlQuery() { params = new ArrayList<Object>(); } public SqlQuery param(Object obj) { params.add(obj); return this; } public SqlQuery params(Object ... objs) { for (Object obj : objs) params.add(obj); return this; } public List<Object> getParams() { return params; } public int paramCurrentIndex() { return params.size()+1; } public String pmark() { return "?"+Integer.toString(paramCurrentIndex()); } public String pmark(int offset) { return "?"+Integer.toString(paramCurrentIndex()+offset); } public static class Concat { private String prefix, separator, suffix; private String defaultValue; private String expr; public Concat(String prefix, String separator, String suffix) { this.prefix = prefix; this.separator = separator; this.suffix = suffix; this.defaultValue = ""; this.expr = ""; } public Concat(String prefix, String separator) { this(prefix, separator, ""); } public Concat(Concat src) { this.prefix = src.prefix; this.separator = src.separator; this.suffix = src.suffix; this.defaultValue = src.defaultValue; this.expr = src.expr; } public Concat defaultValue(String defaultValue) { this.defaultValue = defaultValue; return this; } public Concat prefix(String prefix) { this.prefix = prefix; return this; } public Concat separator(String separator) { this.separator = separator; return this; } public Concat append(Object obj) { final String text; if (obj != null) { String objStr = obj.toString(); if (objStr.length() > 0) text = objStr; else text = defaultValue; } else text = defaultValue; if (text != null) { if (expr.length() > 0) { if (separator == null) throw new NullPointerException(); expr += separator; } expr += text; } return this; } public Concat add(String ... texts) { for (String text : texts) append(text); return this; } public boolean isEmpty() { return expr.length()<=0; } @Override public String toString() { if (isEmpty()) return ""; if (prefix == null || suffix == null) throw new NullPointerException(); return prefix + expr + suffix; } } public static String quote(String str) { return "'" + str.replace("'","\\'") + "'"; } public static String inlineParam(Object param) { if (param == null) return "NULL"; String str; if (param instanceof String) str = quote(param.toString()); else if (param instanceof Iterable<?>) { Concat list = new Concat("(", ", ", ")"); for (Object p : (Iterable<?>)param) list.append(inlineParam(p)); str = list.toString(); } else if (param instanceof Object[]) { Concat list = new Concat("(", ", ", ")"); for (Object p : (Object[])param) list.append(inlineParam(p)); str = list.toString(); } else if (param instanceof Enum<?>) { str = quote(param.toString()); } else str = param.toString(); return str; } public static String whereIn(String column, Object param) { String value = inlineParam(param); if (value.length() == 0) return value; String operator; if (param instanceof Object[]) { operator = " in "; } else if (param instanceof Iterable<?>) { operator = " in "; } else { operator = "="; } return column + operator + value; } }