package com.github.ltsopensource.store.jdbc.builder;
import com.github.ltsopensource.core.commons.utils.StringUtils;
import java.util.LinkedList;
import java.util.List;
/**
* @author Robert HG (254963746@qq.com) on 3/9/16.
*/
public class WhereSql {
private StringBuilder sql = new StringBuilder();
private List<Object> params = new LinkedList<Object>();
private boolean isFirstCondition = true;
private static final String PREFIX = " WHERE ";
public WhereSql() {
sql.append(PREFIX);
}
public WhereSql and(String condition, Object value) {
if (!isFirstCondition) {
sql.append(" AND ");
}
isFirstCondition = false;
sql.append(condition);
params.add(value);
return this;
}
public WhereSql or(String condition, Object value) {
if (!isFirstCondition) {
sql.append(" OR ");
}
isFirstCondition = false;
sql.append(condition);
params.add(value);
return this;
}
public WhereSql and(String condition) {
if (!isFirstCondition) {
sql.append(" AND ");
}
isFirstCondition = false;
sql.append(condition);
return this;
}
public WhereSql or(String condition) {
if (!isFirstCondition) {
sql.append(" OR ");
}
isFirstCondition = false;
sql.append(condition);
return this;
}
public WhereSql andOnNotEmpty(String condition, String value) {
if (StringUtils.isEmpty(value)) {
return this;
}
return and(condition, value);
}
public WhereSql orOnNotEmpty(String condition, String value) {
if (StringUtils.isEmpty(value)) {
return this;
}
return or(condition, value);
}
public WhereSql andOnNotNull(String condition, Object value) {
if (value == null) {
return this;
}
return and(condition, value);
}
public WhereSql orOnNotNull(String condition, Object value) {
if (value == null) {
return this;
}
return or(condition, value);
}
public WhereSql andBetween(String column, Object start, Object end) {
if (start == null && end == null) {
return this;
}
if (!isFirstCondition) {
sql.append(" AND ");
}
isFirstCondition = false;
if (start != null && end != null) {
sql.append(" (").append(column).append(" BETWEEN ? AND ? ").append(")");
params.add(start);
params.add(end);
return this;
}
if (start == null) {
sql.append(column).append(" <= ? ");
params.add(end);
return this;
}
sql.append(column).append(" >= ? ");
params.add(start);
return this;
}
public WhereSql orBetween(String column, Object start, Object end) {
if (start == null && end == null) {
return this;
}
if (!isFirstCondition) {
sql.append(" OR ");
}
isFirstCondition = false;
if (start != null && end != null) {
sql.append(" (").append(column).append(" BETWEEN ? AND ? ").append(")");
params.add(start);
params.add(end);
return this;
}
if (start == null) {
sql.append(column).append(" <= ? ");
params.add(end);
return this;
}
sql.append(column).append(" >= ? ");
params.add(start);
return this;
}
public List<Object> params() {
return params;
}
public String getSQL() {
String finalSQL = sql.toString();
if (finalSQL.length() == PREFIX.length()) {
// 表示没有where条件
return "";
}
return sql.toString();
}
}