package com.tomclaw.mandarin.util;
import android.content.ContentResolver;
import android.content.ContentValues;
import android.content.Context;
import android.content.CursorLoader;
import android.database.Cursor;
import android.net.Uri;
import android.text.TextUtils;
/**
* Created with IntelliJ IDEA.
* User: Solkin
* Date: 03.10.13
* Time: 11:09
*/
public class QueryBuilder {
private StringBuilder select;
private StringBuilder sort;
public QueryBuilder() {
recycle();
}
private QueryBuilder expression(String column, String action, Object object) {
select.append(StringUtil.escapeSql(column)).append(action).append(StringUtil.escapeSqlWithQuotes(object.toString()));
return this;
}
public QueryBuilder columnEquals(String column, Object object) {
return expression(column, "=", object);
}
public QueryBuilder columnNotEquals(String column, Object object) {
return expression(column, "!=", object);
}
public QueryBuilder more(String column, Object object) {
return expression(column, ">", object);
}
public QueryBuilder less(String column, Object object) {
return expression(column, "<", object);
}
public QueryBuilder moreOrEquals(String column, Object object) {
return expression(column, ">=", object);
}
public QueryBuilder lessOrEquals(String column, Object object) {
return expression(column, "<=", object);
}
public QueryBuilder like(String column, Object object) {
select.append(StringUtil.escapeSql(column)).append(" LIKE ")
.append("'%").append(StringUtil.escapeSql(object.toString())).append("%'");
return this;
}
public QueryBuilder likeIgnoreCase(String column, Object object) {
select.append("UPPER(").append(StringUtil.escapeSql(column)).append(")").append(" LIKE ").append("'%")
.append(StringUtil.escapeSql(object.toString())).append("%'");
return this;
}
public QueryBuilder and() {
if (!TextUtils.isEmpty(select)) {
select.append(" AND ");
}
return this;
}
public QueryBuilder or() {
if (!TextUtils.isEmpty(select)) {
select.append(" OR ");
}
return this;
}
private QueryBuilder sortOrder(String column, String order) {
sortOrderRaw(StringUtil.escapeSql(column), order);
return this;
}
public QueryBuilder sortOrderRaw(String column, String order) {
sort.append(column).append(' ').append(order);
return this;
}
public QueryBuilder andOrder() {
sort.append(", ");
return this;
}
public QueryBuilder ascending(String column) {
return sortOrder(column, "ASC");
}
public QueryBuilder descending(String column) {
return sortOrder(column, "DESC");
}
public QueryBuilder limit(int limit) {
sort.append(" LIMIT ").append(limit);
return this;
}
public QueryBuilder startComplexExpression() {
select.append("(");
return this;
}
public QueryBuilder finishComplexExpression() {
select.append(")");
return this;
}
public Cursor query(ContentResolver contentResolver, Uri uri) {
return query(contentResolver, uri, null);
}
public Cursor query(ContentResolver contentResolver, Uri uri, String[] projection) {
return contentResolver.query(uri, projection, select.toString(), null, sort.toString());
}
public int delete(ContentResolver contentResolver, Uri uri) {
return contentResolver.delete(uri, select.toString(), null);
}
public int update(ContentResolver contentResolver, ContentValues contentValues, Uri uri) {
return contentResolver.update(uri, contentValues, select.toString(), null);
}
public CursorLoader createCursorLoader(Context context, Uri uri) {
return new CursorLoader(context, uri, null, select.toString(), null, sort.toString());
}
public QueryBuilder recycle() {
select = new StringBuilder();
sort = new StringBuilder();
return this;
}
public String getSelect() {
return select.toString();
}
public String getSort() {
return sort.toString();
}
}