diff --git a/README.md b/README.md index b897fc181..a471dc6db 100644 --- a/README.md +++ b/README.md @@ -16,7 +16,7 @@ repositories { mavenCentral() } -compile 'com.github.vicpinm:activeandroidrx:3.1.1' +compile 'com.github.vicpinm:activeandroidrx:3.1.5' ``` ## Documentation diff --git a/src/com/activeandroid/rx/RxSelect.java b/src/com/activeandroid/rx/RxSelect.java index a35eebfed..f2763c258 100644 --- a/src/com/activeandroid/rx/RxSelect.java +++ b/src/com/activeandroid/rx/RxSelect.java @@ -8,10 +8,13 @@ import com.activeandroid.Model; import com.activeandroid.rxschedulers.AndroidSchedulers; import com.activeandroid.sqlbrite.SqlBrite; +import com.activeandroid.util.Log; import com.activeandroid.util.SQLiteUtils; +import java.util.ArrayList; import java.util.List; +import rx.Observable; import rx.functions.Func1; import rx.schedulers.Schedulers; @@ -22,15 +25,17 @@ public class RxSelect { private Class mType; private String mAlias; - private String mWhere; + private StringBuilder mWhere = new StringBuilder(); private String mLimit; private String mGroupBy; private String mHaving; private String mOrderBy; private String mOffset; + private List mArguments; private RxSelect(Class type) { this.mType = type; + mArguments = new ArrayList<>(); } public static RxSelect from(Class type) { @@ -47,8 +52,17 @@ public RxSelect groupBy(String groupBy) { return this; } - public RxSelect where(String where) { - this.mWhere = where; + public RxSelect where(String clause) { + // Chain conditions if a previous condition exists. + if (mWhere.length() > 0) { + mWhere.append(" AND "); + } + mWhere.append(clause); + return this; + } + + public RxSelect where(String clause, Object... args) { + where(clause).addArguments(args); return this; } @@ -84,7 +98,7 @@ public rx.Observable> execute() { String sql = buildSql(); - return Cache.openDatabase().createQuery(Cache.getTableName(mType), sql) + return Cache.openDatabase().createQuery(Cache.getTableName(mType), sql, getArguments()) .subscribeOn(Schedulers.io()) .map(new Func1>() { @Override @@ -108,7 +122,7 @@ public rx.Observable executeSingle() { String sql = buildSql(); - return Cache.openDatabase().createQuery(Cache.getTableName(mType), sql) + return Cache.openDatabase().createQuery(Cache.getTableName(mType), sql, getArguments()) .subscribeOn(Schedulers.io()) .map(new Func1() { @Override @@ -138,9 +152,28 @@ private String buildSql() { buildSelect(sql); addFrom(sql); addWhere(sql); + addGroupBy(sql); + addHaving(sql); + addOrderBy(sql); addLimit(sql); + addOffset(sql); - return sql.toString(); + return sqlString(sql); + } + + public String toCountSql() { + + final StringBuilder sql = new StringBuilder(); + sql.append("SELECT COUNT(*) "); + + addFrom(sql); + addWhere(sql); + addGroupBy(sql); + addHaving(sql); + addLimit(sql); + addOffset(sql); + + return sqlString(sql); } private void buildSelect(final StringBuilder sql) { @@ -205,4 +238,46 @@ private void addOffset(final StringBuilder sql) { sql.append(" "); } } + + /** + * Gets the number of rows returned by the query. + */ + public Observable count() { + return Cache.openDatabase().createQuery(Cache.getTableName(mType), toCountSql(), getArguments()) + .subscribeOn(Schedulers.io()) + .map(new Func1() { + @Override public Integer call(SqlBrite.Query query) { + Cursor cursor = query.run(); + if (cursor.moveToFirst()) { + return cursor.getInt(cursor.getColumnIndex(cursor.getColumnName(0))); + } + return 0; + } + }) + .observeOn(AndroidSchedulers.mainThread()); + } + + private String sqlString(final StringBuilder sql) { + return sql.toString().trim(); + } + + void addArguments(Object[] args) { + for(Object arg : args) { + if (arg.getClass() == boolean.class || arg.getClass() == Boolean.class) { + arg = (arg.equals(true) ? 1 : 0); + } + mArguments.add(arg); + } + } + + public String[] getArguments() { + final int size = mArguments.size(); + final String[] args = new String[size]; + + for (int i = 0; i < size; i++) { + args[i] = mArguments.get(i).toString(); + } + + return args; + } }