package com.raizlabs.android.dbflow.rx2.language;
import android.support.annotation.NonNull;
import com.raizlabs.android.dbflow.list.FlowCursorList;
import com.raizlabs.android.dbflow.list.FlowQueryList;
import com.raizlabs.android.dbflow.sql.language.BaseModelQueriable;
import com.raizlabs.android.dbflow.sql.language.CursorResult;
import com.raizlabs.android.dbflow.sql.queriable.ModelQueriable;
import com.raizlabs.android.dbflow.structure.database.DatabaseWrapper;
import java.util.List;
import java.util.concurrent.Callable;
import io.reactivex.BackpressureStrategy;
import io.reactivex.Flowable;
import io.reactivex.Single;
import static io.reactivex.Single.fromCallable;
/**
* Description: Represents {@link BaseModelQueriable} in RX form.
*/
public class RXModelQueriableImpl<T> extends RXQueriableImpl<T>
implements RXModelQueriable<T> {
private final ModelQueriable<T> modelQueriable;
public RXModelQueriableImpl(ModelQueriable<T> modelQueriable) {
super(modelQueriable.getTable(), modelQueriable);
this.modelQueriable = modelQueriable;
}
private ModelQueriable<T> getInnerModelQueriable() {
return modelQueriable;
}
@NonNull
@Override
public Flowable<T> queryStreamResults() {
return new CursorResultFlowable<>(this);
}
@NonNull
@Override
public Single<CursorResult<T>> queryResults() {
return fromCallable(new Callable<CursorResult<T>>() {
@Override
public CursorResult<T> call() throws Exception {
return getInnerModelQueriable().queryResults();
}
});
}
@NonNull
@Override
public Single<List<T>> queryList() {
return fromCallable(new Callable<List<T>>() {
@Override
public List<T> call() throws Exception {
return getInnerModelQueriable().queryList();
}
});
}
@NonNull
@Override
public Single<List<T>> queryList(final DatabaseWrapper wrapper) {
return fromCallable(new Callable<List<T>>() {
@Override
public List<T> call() throws Exception {
return getInnerModelQueriable().queryList(wrapper);
}
});
}
@NonNull
@Override
public Single<T> querySingle() {
return fromCallable(new Callable<T>() {
@Override
public T call() throws Exception {
return getInnerModelQueriable().querySingle();
}
});
}
@NonNull
@Override
public Single<T> querySingle(final DatabaseWrapper wrapper) {
return fromCallable(new Callable<T>() {
@Override
public T call() throws Exception {
return getInnerModelQueriable().querySingle(wrapper);
}
});
}
@NonNull
@Override
public Class<T> getTable() {
return getInnerModelQueriable().getTable();
}
@NonNull
@Override
public Single<FlowCursorList<T>> cursorList() {
return fromCallable(new Callable<FlowCursorList<T>>() {
@Override
public FlowCursorList<T> call() throws Exception {
return getInnerModelQueriable().cursorList();
}
});
}
@NonNull
@Override
public Single<FlowQueryList<T>> flowQueryList() {
return fromCallable(new Callable<FlowQueryList<T>>() {
@Override
public FlowQueryList<T> call() throws Exception {
return getInnerModelQueriable().flowQueryList();
}
});
}
@NonNull
@Override
public <TQueryModel> Single<List<TQueryModel>> queryCustomList(
final Class<TQueryModel> tQueryModelClass) {
return fromCallable(new Callable<List<TQueryModel>>() {
@Override
public List<TQueryModel> call() throws Exception {
return getInnerModelQueriable().queryCustomList(tQueryModelClass);
}
});
}
@NonNull
@Override
public <TQueryModel> Single<TQueryModel> queryCustomSingle(
final Class<TQueryModel> tQueryModelClass) {
return fromCallable(new Callable<TQueryModel>() {
@Override
public TQueryModel call() throws Exception {
return getInnerModelQueriable().queryCustomSingle(tQueryModelClass);
}
});
}
@NonNull
@Override
public RXModelQueriable<T> disableCaching() {
getInnerModelQueriable().disableCaching();
return this;
}
@NonNull
@Override
public Flowable<ModelQueriable<T>> observeOnTableChanges() {
return Flowable.create(new TableChangeOnSubscribe<>(getInnerModelQueriable()),
BackpressureStrategy.LATEST);
}
}