package com.raizlabs.android.dbflow.rx.language;
import android.database.Cursor;
import android.support.annotation.NonNull;
import com.raizlabs.android.dbflow.config.FlowManager;
import com.raizlabs.android.dbflow.sql.language.BaseQueriable;
import com.raizlabs.android.dbflow.sql.queriable.Queriable;
import com.raizlabs.android.dbflow.structure.database.DatabaseStatement;
import com.raizlabs.android.dbflow.structure.database.DatabaseWrapper;
import java.util.concurrent.Callable;
import rx.Single;
import static rx.Single.fromCallable;
/**
* Description: Represents {@link BaseQueriable} with RX constructs.
*/
public class RXQueriableImpl<T> implements RXQueriable {
private final Class<T> table;
private final Queriable queriable;
RXQueriableImpl(Class<T> table, Queriable queriable) {
this.table = table;
this.queriable = queriable;
}
private Queriable getInnerQueriable() {
return queriable;
}
@NonNull
@Override
public Single<Cursor> query() {
return fromCallable(new Callable<Cursor>() {
@Override
public Cursor call() throws Exception {
return getInnerQueriable().query();
}
});
}
@NonNull
@Override
public Single<Cursor> query(final DatabaseWrapper databaseWrapper) {
return fromCallable(new Callable<Cursor>() {
@Override
public Cursor call() throws Exception {
return getInnerQueriable().query(databaseWrapper);
}
});
}
@NonNull
@Override
public Single<DatabaseStatement> compileStatement() {
return fromCallable(new Callable<DatabaseStatement>() {
@Override
public DatabaseStatement call() throws Exception {
return getInnerQueriable().compileStatement();
}
});
}
@NonNull
@Override
public Single<DatabaseStatement> compileStatement(final DatabaseWrapper databaseWrapper) {
return fromCallable(new Callable<DatabaseStatement>() {
@Override
public DatabaseStatement call() throws Exception {
return getInnerQueriable().compileStatement(databaseWrapper);
}
});
}
@NonNull
@Override
public Single<Long> count() {
return fromCallable(new Callable<Long>() {
@Override
public Long call() throws Exception {
return getInnerQueriable().count();
}
});
}
@NonNull
@Override
public Single<Long> count(final DatabaseWrapper databaseWrapper) {
return fromCallable(new Callable<Long>() {
@Override
public Long call() throws Exception {
return getInnerQueriable().count(databaseWrapper);
}
});
}
@NonNull
@Override
public Single<Long> executeInsert() {
return fromCallable(new Callable<Long>() {
@Override
public Long call() throws Exception {
return getInnerQueriable().executeInsert(FlowManager.getWritableDatabaseForTable(table));
}
});
}
@NonNull
@Override
public Single<Long> executeInsert(final DatabaseWrapper databaseWrapper) {
return fromCallable(new Callable<Long>() {
@Override
public Long call() throws Exception {
return getInnerQueriable().executeInsert(databaseWrapper);
}
});
}
@NonNull
@Override
public Single<Long> executeUpdateDelete(final DatabaseWrapper databaseWrapper) {
return fromCallable(new Callable<Long>() {
@Override
public Long call() throws Exception {
return getInnerQueriable().executeUpdateDelete(databaseWrapper);
}
});
}
@NonNull
@Override
public Single<Long> executeUpdateDelete() {
return fromCallable(new Callable<Long>() {
@Override
public Long call() throws Exception {
return getInnerQueriable().executeUpdateDelete();
}
});
}
@NonNull
@Override
public Single<Boolean> hasData() {
return fromCallable(new Callable<Boolean>() {
@Override
public Boolean call() throws Exception {
return getInnerQueriable().hasData();
}
});
}
@NonNull
@Override
public Single<Boolean> hasData(final DatabaseWrapper databaseWrapper) {
return fromCallable(new Callable<Boolean>() {
@Override
public Boolean call() throws Exception {
return getInnerQueriable().hasData(databaseWrapper);
}
});
}
@NonNull
@Override
public Single<Void> execute() {
return fromCallable(new Callable<Void>() {
@Override
public Void call() throws Exception {
getInnerQueriable().execute();
return null;
}
});
}
@NonNull
@Override
public Single<Void> execute(final DatabaseWrapper databaseWrapper) {
return fromCallable(new Callable<Void>() {
@Override
public Void call() throws Exception {
getInnerQueriable().execute(databaseWrapper);
return null;
}
});
}
}