mirror of https://github.com/tasks/tasks
Moved SQL from external into data layer.
parent
67d8483183
commit
dd863f396d
@ -1,24 +0,0 @@
|
|||||||
package com.thoughtworks.sql;
|
|
||||||
|
|
||||||
@SuppressWarnings("nls")
|
|
||||||
public class Constants {
|
|
||||||
static final String SELECT = "SELECT";
|
|
||||||
static final String SPACE = " ";
|
|
||||||
static final String AS = "AS";
|
|
||||||
static final String COMMA = ",";
|
|
||||||
static final String FROM = "FROM";
|
|
||||||
static final String ON = "ON";
|
|
||||||
static final String JOIN = "JOIN";
|
|
||||||
static final String ALL = "*";
|
|
||||||
static final String LEFT_PARENTHESIS = "(";
|
|
||||||
static final String RIGHT_PARENTHESIS = ")";
|
|
||||||
static final String AND = "AND";
|
|
||||||
static final String BETWEEN = "BETWEEN";
|
|
||||||
static final String LIKE = "LIKE";
|
|
||||||
static final String OR = "OR";
|
|
||||||
static final String ORDER_BY = "ORDER BY";
|
|
||||||
static final String GROUP_BY = "GROUP BY";
|
|
||||||
static final String WHERE = "WHERE";
|
|
||||||
public static final String EXISTS = "EXISTS";
|
|
||||||
public static final String NOT = "NOT";
|
|
||||||
}
|
|
@ -1,75 +0,0 @@
|
|||||||
package com.thoughtworks.sql;
|
|
||||||
|
|
||||||
import static com.thoughtworks.sql.Constants.AND;
|
|
||||||
import static com.thoughtworks.sql.Constants.EXISTS;
|
|
||||||
import static com.thoughtworks.sql.Constants.LEFT_PARENTHESIS;
|
|
||||||
import static com.thoughtworks.sql.Constants.NOT;
|
|
||||||
import static com.thoughtworks.sql.Constants.OR;
|
|
||||||
import static com.thoughtworks.sql.Constants.RIGHT_PARENTHESIS;
|
|
||||||
import static com.thoughtworks.sql.Constants.SPACE;
|
|
||||||
|
|
||||||
public abstract class Criterion {
|
|
||||||
protected final Operator operator;
|
|
||||||
|
|
||||||
Criterion(Operator operator) {
|
|
||||||
this.operator = operator;
|
|
||||||
}
|
|
||||||
|
|
||||||
public static Criterion and(final Criterion criterion, final Criterion... criterions) {
|
|
||||||
return new Criterion(Operator.and) {
|
|
||||||
|
|
||||||
@Override
|
|
||||||
protected void populate(StringBuilder sb) {
|
|
||||||
sb.append(criterion);
|
|
||||||
for (Criterion c : criterions) {
|
|
||||||
sb.append(SPACE).append(AND).append(SPACE).append(c);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
};
|
|
||||||
}
|
|
||||||
|
|
||||||
public static Criterion or(final Criterion criterion, final Criterion... criterions) {
|
|
||||||
return new Criterion(Operator.or) {
|
|
||||||
|
|
||||||
@Override
|
|
||||||
protected void populate(StringBuilder sb) {
|
|
||||||
sb.append(criterion);
|
|
||||||
for (Criterion c : criterions) {
|
|
||||||
sb.append(SPACE).append(OR).append(SPACE).append(c.toString());
|
|
||||||
}
|
|
||||||
}
|
|
||||||
};
|
|
||||||
}
|
|
||||||
|
|
||||||
public static Criterion exists(final Query query) {
|
|
||||||
return new Criterion(Operator.exists) {
|
|
||||||
|
|
||||||
@Override
|
|
||||||
protected void populate(StringBuilder sb) {
|
|
||||||
sb.append(EXISTS).append(SPACE).append(LEFT_PARENTHESIS).append(query).append(RIGHT_PARENTHESIS);
|
|
||||||
}
|
|
||||||
};
|
|
||||||
}
|
|
||||||
|
|
||||||
public static Criterion not(final Criterion criterion) {
|
|
||||||
return new Criterion(Operator.not) {
|
|
||||||
|
|
||||||
@Override
|
|
||||||
protected void populate(StringBuilder sb) {
|
|
||||||
sb.append(NOT).append(SPACE);
|
|
||||||
criterion.populate(sb);
|
|
||||||
}
|
|
||||||
};
|
|
||||||
}
|
|
||||||
|
|
||||||
protected abstract void populate(StringBuilder sb);
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public String toString() {
|
|
||||||
StringBuilder builder = new StringBuilder(LEFT_PARENTHESIS);
|
|
||||||
populate(builder);
|
|
||||||
builder.append(RIGHT_PARENTHESIS);
|
|
||||||
return builder.toString();
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
@ -1,52 +0,0 @@
|
|||||||
package com.thoughtworks.sql;
|
|
||||||
|
|
||||||
import static com.thoughtworks.sql.Constants.AS;
|
|
||||||
import static com.thoughtworks.sql.Constants.SPACE;
|
|
||||||
|
|
||||||
public abstract class DBObject<T extends DBObject<?>> {
|
|
||||||
protected String alias;
|
|
||||||
protected final String expression;
|
|
||||||
|
|
||||||
protected DBObject(String expression){
|
|
||||||
this.expression = expression;
|
|
||||||
}
|
|
||||||
|
|
||||||
public T as(String newAlias) {
|
|
||||||
this.alias = newAlias;
|
|
||||||
return (T) this;
|
|
||||||
}
|
|
||||||
|
|
||||||
public boolean hasAlias() {
|
|
||||||
return alias != null;
|
|
||||||
}
|
|
||||||
|
|
||||||
@SuppressWarnings("unchecked")
|
|
||||||
@Override
|
|
||||||
public boolean equals(Object o) {
|
|
||||||
if (this == o) return true;
|
|
||||||
if (o == null || getClass() != o.getClass()) return false;
|
|
||||||
|
|
||||||
DBObject dbObject = (DBObject) o;
|
|
||||||
|
|
||||||
if (alias != null ? !alias.equals(dbObject.alias) : dbObject.alias != null) return false;
|
|
||||||
if (expression != null ? !expression.equals(dbObject.expression) : dbObject.expression != null) return false;
|
|
||||||
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public int hashCode() {
|
|
||||||
int result = alias != null ? alias.hashCode() : 0;
|
|
||||||
result = 31 * result + (expression != null ? expression.hashCode() : 0);
|
|
||||||
return result;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public final String toString() {
|
|
||||||
StringBuilder sb = new StringBuilder(expression);
|
|
||||||
if (hasAlias()) {
|
|
||||||
sb.append(SPACE).append(AS).append(SPACE).append(alias);
|
|
||||||
}
|
|
||||||
return sb.toString();
|
|
||||||
}
|
|
||||||
}
|
|
@ -1,7 +0,0 @@
|
|||||||
package com.thoughtworks.sql;
|
|
||||||
|
|
||||||
public class EqCriterion extends UnaryCriterion {
|
|
||||||
EqCriterion(Field field, Object value) {
|
|
||||||
super(field, Operator.eq, value);
|
|
||||||
}
|
|
||||||
}
|
|
@ -1,86 +0,0 @@
|
|||||||
package com.thoughtworks.sql;
|
|
||||||
|
|
||||||
import static com.thoughtworks.sql.Constants.AND;
|
|
||||||
import static com.thoughtworks.sql.Constants.BETWEEN;
|
|
||||||
import static com.thoughtworks.sql.Constants.COMMA;
|
|
||||||
import static com.thoughtworks.sql.Constants.LEFT_PARENTHESIS;
|
|
||||||
import static com.thoughtworks.sql.Constants.RIGHT_PARENTHESIS;
|
|
||||||
import static com.thoughtworks.sql.Constants.SPACE;
|
|
||||||
|
|
||||||
public class Field extends DBObject<Field> {
|
|
||||||
|
|
||||||
protected Field(String expression) {
|
|
||||||
super(expression);
|
|
||||||
}
|
|
||||||
|
|
||||||
public static Field field(String expression) {
|
|
||||||
return new Field(expression);
|
|
||||||
}
|
|
||||||
|
|
||||||
public Criterion eq(Object value) {
|
|
||||||
return UnaryCriterion.eq(this, value);
|
|
||||||
}
|
|
||||||
|
|
||||||
public Criterion neq(Object value) {
|
|
||||||
return UnaryCriterion.neq(this, value);
|
|
||||||
}
|
|
||||||
|
|
||||||
public Criterion gt(Object value) {
|
|
||||||
return UnaryCriterion.gt(this, value);
|
|
||||||
}
|
|
||||||
|
|
||||||
public Criterion lt(final Object value) {
|
|
||||||
return UnaryCriterion.lt(this, value);
|
|
||||||
}
|
|
||||||
|
|
||||||
public Criterion isNull() {
|
|
||||||
return UnaryCriterion.isNull(this);
|
|
||||||
}
|
|
||||||
|
|
||||||
public Criterion isNotNull() {
|
|
||||||
return UnaryCriterion.isNotNull(this);
|
|
||||||
}
|
|
||||||
|
|
||||||
public Criterion between(final Object lower, final Object upper) {
|
|
||||||
final Field field = this;
|
|
||||||
return new Criterion(null) {
|
|
||||||
|
|
||||||
@Override
|
|
||||||
protected void populate(StringBuilder sb) {
|
|
||||||
sb.append(field).append(SPACE).append(BETWEEN).append(SPACE).append(lower).append(SPACE).append(AND)
|
|
||||||
.append(SPACE).append(upper);
|
|
||||||
}
|
|
||||||
};
|
|
||||||
}
|
|
||||||
|
|
||||||
public Criterion like(final String value) {
|
|
||||||
return UnaryCriterion.like(this, value);
|
|
||||||
}
|
|
||||||
|
|
||||||
public <T> Criterion in(final T... value) {
|
|
||||||
final Field field = this;
|
|
||||||
return new Criterion(Operator.in) {
|
|
||||||
|
|
||||||
@Override
|
|
||||||
protected void populate(StringBuilder sb) {
|
|
||||||
sb.append(field).append(SPACE).append(Operator.in).append(SPACE).append(LEFT_PARENTHESIS);
|
|
||||||
for (T t : value) {
|
|
||||||
sb.append(t.toString()).append(COMMA);
|
|
||||||
}
|
|
||||||
sb.deleteCharAt(sb.length() - 1).append(RIGHT_PARENTHESIS);
|
|
||||||
}
|
|
||||||
};
|
|
||||||
}
|
|
||||||
|
|
||||||
public Criterion in(final Query query) {
|
|
||||||
final Field field = this;
|
|
||||||
return new Criterion(Operator.in) {
|
|
||||||
|
|
||||||
@Override
|
|
||||||
protected void populate(StringBuilder sb) {
|
|
||||||
sb.append(field).append(SPACE).append(Operator.in).append(SPACE).append(LEFT_PARENTHESIS).append(query)
|
|
||||||
.append(RIGHT_PARENTHESIS);
|
|
||||||
}
|
|
||||||
};
|
|
||||||
}
|
|
||||||
}
|
|
@ -1,14 +0,0 @@
|
|||||||
package com.thoughtworks.sql;
|
|
||||||
|
|
||||||
import java.util.List;
|
|
||||||
import java.util.ArrayList;
|
|
||||||
|
|
||||||
public class GroupBy {
|
|
||||||
private List<Field> fields = new ArrayList<Field>();
|
|
||||||
|
|
||||||
public static GroupBy groupBy(Field field) {
|
|
||||||
GroupBy groupBy = new GroupBy();
|
|
||||||
groupBy.fields.add(field);
|
|
||||||
return groupBy;
|
|
||||||
}
|
|
||||||
}
|
|
@ -1,43 +0,0 @@
|
|||||||
package com.thoughtworks.sql;
|
|
||||||
|
|
||||||
import static com.thoughtworks.sql.Constants.SPACE;
|
|
||||||
import static com.thoughtworks.sql.Constants.JOIN;
|
|
||||||
import static com.thoughtworks.sql.Constants.ON;
|
|
||||||
|
|
||||||
public class Join {
|
|
||||||
private final Table joinTable;
|
|
||||||
private final JoinType joinType;
|
|
||||||
private final Criterion[] criterions;
|
|
||||||
|
|
||||||
private Join(Table table, JoinType joinType, Criterion... criterions) {
|
|
||||||
joinTable = table;
|
|
||||||
this.joinType = joinType;
|
|
||||||
this.criterions = criterions;
|
|
||||||
}
|
|
||||||
|
|
||||||
public static Join inner(Table expression, Criterion... criterions) {
|
|
||||||
return new Join(expression, JoinType.INNER, criterions);
|
|
||||||
}
|
|
||||||
|
|
||||||
public static Join left(Table table, Criterion... criterions) {
|
|
||||||
return new Join(table, JoinType.LEFT, criterions);
|
|
||||||
}
|
|
||||||
|
|
||||||
public static Join right(Table table, Criterion... criterions) {
|
|
||||||
return new Join(table, JoinType.RIGHT, criterions);
|
|
||||||
}
|
|
||||||
|
|
||||||
public static Join out(Table table, Criterion... criterions) {
|
|
||||||
return new Join(table, JoinType.OUT, criterions);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public String toString() {
|
|
||||||
StringBuilder sb = new StringBuilder();
|
|
||||||
sb.append(joinType).append(SPACE).append(JOIN).append(SPACE).append(joinTable).append(SPACE).append(ON);
|
|
||||||
for (Criterion criterion : criterions) {
|
|
||||||
sb.append(SPACE).append(criterion);
|
|
||||||
}
|
|
||||||
return sb.toString();
|
|
||||||
}
|
|
||||||
}
|
|
@ -1,5 +0,0 @@
|
|||||||
package com.thoughtworks.sql;
|
|
||||||
|
|
||||||
public enum JoinType {
|
|
||||||
INNER, LEFT, RIGHT, OUT
|
|
||||||
}
|
|
@ -1,57 +0,0 @@
|
|||||||
package com.thoughtworks.sql;
|
|
||||||
|
|
||||||
import static com.thoughtworks.sql.Constants.SPACE;
|
|
||||||
|
|
||||||
import java.util.HashMap;
|
|
||||||
import java.util.Map;
|
|
||||||
|
|
||||||
@SuppressWarnings("nls")
|
|
||||||
public final class Operator {
|
|
||||||
|
|
||||||
private final String operator;
|
|
||||||
public static final Operator eq = new Operator("=");
|
|
||||||
public static final Operator neq = new Operator("<>");
|
|
||||||
public static final Operator isNull = new Operator("IS NULL");
|
|
||||||
public static final Operator isNotNull = new Operator("IS NOT NULL");
|
|
||||||
public static final Operator gt = new Operator(">");
|
|
||||||
public static final Operator lt = new Operator("<");
|
|
||||||
public static final Operator gte = new Operator(">=");
|
|
||||||
public static final Operator lte = new Operator("<=");
|
|
||||||
public static final Operator and = new Operator("AND");
|
|
||||||
public static final Operator or = new Operator("OR");
|
|
||||||
public static final Operator not = new Operator("NOT");
|
|
||||||
public static final Operator exists = new Operator("EXISTS");
|
|
||||||
public static final Operator like = new Operator("LIKE");
|
|
||||||
public static final Operator in = new Operator("IN");
|
|
||||||
|
|
||||||
private static final Map<Operator, Operator> contraryRegistry = new HashMap<Operator, Operator>();
|
|
||||||
|
|
||||||
static {
|
|
||||||
contraryRegistry.put(eq, neq);
|
|
||||||
contraryRegistry.put(neq, eq);
|
|
||||||
contraryRegistry.put(isNull, isNotNull);
|
|
||||||
contraryRegistry.put(isNotNull, isNull);
|
|
||||||
contraryRegistry.put(gt, lte);
|
|
||||||
contraryRegistry.put(lte, gt);
|
|
||||||
contraryRegistry.put(lt, gte);
|
|
||||||
contraryRegistry.put(gte, lt);
|
|
||||||
}
|
|
||||||
|
|
||||||
private Operator(String operator) {
|
|
||||||
this.operator = operator;
|
|
||||||
}
|
|
||||||
|
|
||||||
public Operator getContrary() {
|
|
||||||
if(!contraryRegistry.containsKey(this)){
|
|
||||||
Operator opposite = new Operator(not.toString() + SPACE + this.toString());
|
|
||||||
contraryRegistry.put(this, opposite);
|
|
||||||
contraryRegistry.put(opposite, this);
|
|
||||||
}
|
|
||||||
return contraryRegistry.get(this);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public String toString() {
|
|
||||||
return this.operator.toString();
|
|
||||||
}
|
|
||||||
}
|
|
@ -1,30 +0,0 @@
|
|||||||
package com.thoughtworks.sql;
|
|
||||||
|
|
||||||
import static com.thoughtworks.sql.Constants.SPACE;
|
|
||||||
|
|
||||||
public class Order {
|
|
||||||
private final Field expression;
|
|
||||||
private final OrderType orderType;
|
|
||||||
|
|
||||||
private Order(Field expression) {
|
|
||||||
this(expression, OrderType.ASC);
|
|
||||||
}
|
|
||||||
|
|
||||||
private Order(Field expression, OrderType orderType) {
|
|
||||||
this.expression = expression;
|
|
||||||
this.orderType = orderType;
|
|
||||||
}
|
|
||||||
|
|
||||||
public static Order asc(Field expression) {
|
|
||||||
return new Order(expression);
|
|
||||||
}
|
|
||||||
|
|
||||||
public static Order desc(Field expression) {
|
|
||||||
return new Order(expression, OrderType.DESC);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public String toString() {
|
|
||||||
return expression + SPACE + orderType;
|
|
||||||
}
|
|
||||||
}
|
|
@ -1,5 +0,0 @@
|
|||||||
package com.thoughtworks.sql;
|
|
||||||
|
|
||||||
public enum OrderType {
|
|
||||||
DESC, ASC
|
|
||||||
}
|
|
@ -1,163 +0,0 @@
|
|||||||
package com.thoughtworks.sql;
|
|
||||||
|
|
||||||
import static com.thoughtworks.sql.Constants.ALL;
|
|
||||||
import static com.thoughtworks.sql.Constants.COMMA;
|
|
||||||
import static com.thoughtworks.sql.Constants.FROM;
|
|
||||||
import static com.thoughtworks.sql.Constants.GROUP_BY;
|
|
||||||
import static com.thoughtworks.sql.Constants.LEFT_PARENTHESIS;
|
|
||||||
import static com.thoughtworks.sql.Constants.ORDER_BY;
|
|
||||||
import static com.thoughtworks.sql.Constants.RIGHT_PARENTHESIS;
|
|
||||||
import static com.thoughtworks.sql.Constants.SELECT;
|
|
||||||
import static com.thoughtworks.sql.Constants.SPACE;
|
|
||||||
import static com.thoughtworks.sql.Constants.WHERE;
|
|
||||||
import static com.thoughtworks.sql.Table.table;
|
|
||||||
import static java.util.Arrays.asList;
|
|
||||||
|
|
||||||
import java.util.ArrayList;
|
|
||||||
import java.util.List;
|
|
||||||
|
|
||||||
public class Query {
|
|
||||||
|
|
||||||
private Table table;
|
|
||||||
private List<Criterion> criterions = new ArrayList<Criterion>();
|
|
||||||
private List<Field> fields = new ArrayList<Field>();
|
|
||||||
private List<Join> joins = new ArrayList<Join>();
|
|
||||||
private List<Field> groupBies = new ArrayList<Field>();
|
|
||||||
private List<Order> orders = new ArrayList<Order>();
|
|
||||||
private List<Criterion> havings = new ArrayList<Criterion>();
|
|
||||||
|
|
||||||
private Query(Field... fields) {
|
|
||||||
this.fields.addAll(asList(fields));
|
|
||||||
}
|
|
||||||
|
|
||||||
public static Query select(Field... fields) {
|
|
||||||
return new Query(fields);
|
|
||||||
}
|
|
||||||
|
|
||||||
public Query from(Table fromTable) {
|
|
||||||
this.table = fromTable;
|
|
||||||
return this;
|
|
||||||
}
|
|
||||||
|
|
||||||
public Query join(Join... join) {
|
|
||||||
joins.addAll(asList(join));
|
|
||||||
return this;
|
|
||||||
}
|
|
||||||
|
|
||||||
public Query where(Criterion criterion) {
|
|
||||||
criterions.add(criterion);
|
|
||||||
return this;
|
|
||||||
}
|
|
||||||
|
|
||||||
public Query groupBy(Field... groupBy) {
|
|
||||||
groupBies.addAll(asList(groupBy));
|
|
||||||
return this;
|
|
||||||
}
|
|
||||||
|
|
||||||
public Query orderBy(Order... order) {
|
|
||||||
orders.addAll(asList(order));
|
|
||||||
return this;
|
|
||||||
}
|
|
||||||
|
|
||||||
public Query appendSelectFields(Field... selectFields) {
|
|
||||||
this.fields.addAll(asList(selectFields));
|
|
||||||
return this;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public boolean equals(Object o) {
|
|
||||||
return this == o || !(o == null || getClass() != o.getClass()) && this.toString().equals(o.toString());
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public int hashCode() {
|
|
||||||
return toString().hashCode();
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public String toString() {
|
|
||||||
StringBuilder sql = new StringBuilder();
|
|
||||||
visitSelectClause(sql);
|
|
||||||
visitFromClause(sql);
|
|
||||||
visitJoinClause(sql);
|
|
||||||
visitWhereClause(sql);
|
|
||||||
visitGroupByClause(sql);
|
|
||||||
visitOrderByClause(sql);
|
|
||||||
return sql.toString();
|
|
||||||
}
|
|
||||||
|
|
||||||
private void visitOrderByClause(StringBuilder sql) {
|
|
||||||
if (orders.isEmpty()) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
sql.append(ORDER_BY);
|
|
||||||
for (Order order : orders) {
|
|
||||||
sql.append(SPACE).append(order).append(COMMA);
|
|
||||||
}
|
|
||||||
sql.deleteCharAt(sql.length() - 1).append(SPACE);
|
|
||||||
}
|
|
||||||
|
|
||||||
@SuppressWarnings("nls")
|
|
||||||
private void visitGroupByClause(StringBuilder sql) {
|
|
||||||
if (groupBies.isEmpty()) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
sql.append(GROUP_BY);
|
|
||||||
for (Field groupBy : groupBies) {
|
|
||||||
sql.append(SPACE).append(groupBy).append(COMMA);
|
|
||||||
}
|
|
||||||
sql.deleteCharAt(sql.length() - 1).append(SPACE);
|
|
||||||
if (havings.isEmpty()) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
sql.append("HAVING");
|
|
||||||
for (Criterion havingCriterion : havings) {
|
|
||||||
sql.append(SPACE).append(havingCriterion).append(COMMA);
|
|
||||||
}
|
|
||||||
sql.deleteCharAt(sql.length() - 1).append(SPACE);
|
|
||||||
}
|
|
||||||
|
|
||||||
private void visitWhereClause(StringBuilder sql) {
|
|
||||||
if (criterions.isEmpty()) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
sql.append(WHERE);
|
|
||||||
for (Criterion criterion : criterions) {
|
|
||||||
sql.append(SPACE).append(criterion).append(SPACE);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
private void visitJoinClause(StringBuilder sql) {
|
|
||||||
for (Join join : joins) {
|
|
||||||
sql.append(join).append(SPACE);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
private void visitFromClause(StringBuilder sql) {
|
|
||||||
if (table == null) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
sql.append(FROM).append(SPACE).append(table).append(SPACE);
|
|
||||||
}
|
|
||||||
|
|
||||||
private void visitSelectClause(StringBuilder sql) {
|
|
||||||
sql.append(SELECT).append(SPACE);
|
|
||||||
if (fields.isEmpty()) {
|
|
||||||
sql.append(ALL).append(SPACE);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
for (Field field : fields) {
|
|
||||||
sql.append(field).append(COMMA);
|
|
||||||
}
|
|
||||||
sql.deleteCharAt(sql.length() - 1).append(SPACE);
|
|
||||||
}
|
|
||||||
|
|
||||||
public Table as(String alias) {
|
|
||||||
return table(LEFT_PARENTHESIS + this.toString() + RIGHT_PARENTHESIS).as(alias);
|
|
||||||
}
|
|
||||||
|
|
||||||
public Query having(Criterion criterion) {
|
|
||||||
this.havings.add(criterion);
|
|
||||||
return this;
|
|
||||||
}
|
|
||||||
}
|
|
@ -1,20 +0,0 @@
|
|||||||
package com.thoughtworks.sql;
|
|
||||||
|
|
||||||
public class Table extends DBObject<Table> {
|
|
||||||
|
|
||||||
protected Table(String expression) {
|
|
||||||
super(expression);
|
|
||||||
}
|
|
||||||
|
|
||||||
public static Table table(String table) {
|
|
||||||
return new Table(table);
|
|
||||||
}
|
|
||||||
|
|
||||||
@SuppressWarnings("nls")
|
|
||||||
protected String fieldExpression(String fieldName) {
|
|
||||||
if (hasAlias()) {
|
|
||||||
return alias + "." + fieldName;
|
|
||||||
}
|
|
||||||
return expression+"."+fieldName;
|
|
||||||
}
|
|
||||||
}
|
|
@ -1,92 +0,0 @@
|
|||||||
package com.thoughtworks.sql;
|
|
||||||
|
|
||||||
import static com.thoughtworks.sql.Constants.SPACE;
|
|
||||||
|
|
||||||
public class UnaryCriterion extends Criterion {
|
|
||||||
protected final Field expression;
|
|
||||||
protected final Object value;
|
|
||||||
|
|
||||||
UnaryCriterion(Field expression, Operator operator, Object value) {
|
|
||||||
super(operator);
|
|
||||||
this.expression = expression;
|
|
||||||
this.value = value;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
protected void populate(StringBuilder sb) {
|
|
||||||
beforePopulateOperator(sb);
|
|
||||||
populateOperator(sb);
|
|
||||||
afterPopulateOperator(sb);
|
|
||||||
}
|
|
||||||
|
|
||||||
public static Criterion eq(Field expression, Object value) {
|
|
||||||
return new UnaryCriterion(expression, Operator.eq, value);
|
|
||||||
}
|
|
||||||
|
|
||||||
protected void beforePopulateOperator(StringBuilder sb) {
|
|
||||||
sb.append(expression);
|
|
||||||
}
|
|
||||||
|
|
||||||
protected void populateOperator(StringBuilder sb) {
|
|
||||||
sb.append(operator);
|
|
||||||
}
|
|
||||||
|
|
||||||
@SuppressWarnings("nls")
|
|
||||||
protected void afterPopulateOperator(StringBuilder sb) {
|
|
||||||
if(value == null)
|
|
||||||
return;
|
|
||||||
else if(value instanceof String)
|
|
||||||
sb.append("'").append(sanitize((String) value)).append("'");
|
|
||||||
else
|
|
||||||
sb.append(value);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Sanitize the given input for SQL
|
|
||||||
* @param input
|
|
||||||
* @return
|
|
||||||
*/
|
|
||||||
@SuppressWarnings("nls")
|
|
||||||
public static String sanitize(String input) {
|
|
||||||
return input.replace("\\", "\\\\").replace("'", "\\'");
|
|
||||||
}
|
|
||||||
|
|
||||||
public static Criterion neq(Field field, Object value) {
|
|
||||||
return new UnaryCriterion(field, Operator.neq, value);
|
|
||||||
}
|
|
||||||
|
|
||||||
public static Criterion gt(Field field, Object value) {
|
|
||||||
return new UnaryCriterion(field, Operator.gt, value);
|
|
||||||
}
|
|
||||||
|
|
||||||
public static Criterion lt(Field field, Object value) {
|
|
||||||
return new UnaryCriterion(field, Operator.lt, value);
|
|
||||||
}
|
|
||||||
|
|
||||||
public static Criterion isNull(Field field) {
|
|
||||||
return new UnaryCriterion(field, Operator.isNull, null) {
|
|
||||||
@Override
|
|
||||||
protected void populateOperator(StringBuilder sb) {
|
|
||||||
sb.append(SPACE).append(operator);
|
|
||||||
}
|
|
||||||
};
|
|
||||||
}
|
|
||||||
|
|
||||||
public static Criterion isNotNull(Field field) {
|
|
||||||
return new UnaryCriterion(field, Operator.isNotNull, null) {
|
|
||||||
@Override
|
|
||||||
protected void populateOperator(StringBuilder sb) {
|
|
||||||
sb.append(SPACE).append(operator);
|
|
||||||
}
|
|
||||||
};
|
|
||||||
}
|
|
||||||
|
|
||||||
public static Criterion like(Field field, String value) {
|
|
||||||
return new UnaryCriterion(field, Operator.like, value) {
|
|
||||||
@Override
|
|
||||||
protected void populateOperator(StringBuilder sb) {
|
|
||||||
sb.append(SPACE).append(operator).append(SPACE);
|
|
||||||
}
|
|
||||||
};
|
|
||||||
}
|
|
||||||
}
|
|
Loading…
Reference in New Issue