package io.github.droidkaigi.confsched.dao;
import java.util.List;
import javax.inject.Inject;
import javax.inject.Singleton;
import io.github.droidkaigi.confsched.model.Category;
import io.github.droidkaigi.confsched.model.Category_Relation;
import io.github.droidkaigi.confsched.model.OrmaDatabase;
import io.github.droidkaigi.confsched.model.Place;
import io.github.droidkaigi.confsched.model.Place_Relation;
import io.github.droidkaigi.confsched.model.Session;
import io.github.droidkaigi.confsched.model.Session_Relation;
import io.github.droidkaigi.confsched.model.Speaker;
import io.github.droidkaigi.confsched.model.Speaker_Relation;
import rx.Observable;
@Singleton
public class SessionDao {
OrmaDatabase orma;
@Inject
public SessionDao(OrmaDatabase orma) {
this.orma = orma;
}
public Session_Relation sessionRelation() {
return orma.relationOfSession();
}
private Speaker_Relation speakerRelation() {
return orma.relationOfSpeaker();
}
private Place_Relation placeRelation() {
return orma.relationOfPlace();
}
private Category_Relation categoryRelation() {
return orma.relationOfCategory();
}
private void insertSpeaker(Speaker speaker) {
if (speaker != null && speakerRelation().selector().idEq(speaker.id).isEmpty()) {
speakerRelation().inserter().execute(speaker);
}
}
private void insertPlace(Place place) {
if (place != null && placeRelation().selector().idEq(place.id).isEmpty()) {
placeRelation().inserter().execute(place);
}
}
private void insertCategory(Category category) {
if (category != null && categoryRelation().selector().idEq(category.id).isEmpty()) {
categoryRelation().inserter().execute(category);
}
}
public Observable<List<Session>> findAll() {
return sessionRelation().selector().executeAsObservable()
.toList();
}
public Observable<List<Session>> findByChecked() {
return sessionRelation().selector().checkedEq(true).executeAsObservable()
.toList();
}
public Observable<List<Session>> findByPlace(int placeId) {
return sessionRelation().selector().placeEq(placeId).executeAsObservable()
.toList();
}
public Observable<List<Session>> findByCategory(int categoryId) {
return sessionRelation().selector().categoryEq(categoryId).executeAsObservable()
.toList();
}
public void deleteAll() {
sessionRelation().deleter().execute();
speakerRelation().deleter().execute();
categoryRelation().deleter().execute();
placeRelation().deleter().execute();
}
public void updateAllSync(List<Session> sessions) {
speakerRelation().deleter().execute();
categoryRelation().deleter().execute();
placeRelation().deleter().execute();
for (Session session : sessions) {
insertSpeaker(session.speaker);
insertCategory(session.category);
insertPlace(session.place);
sessionRelation().upserter().execute(session);
}
}
public void updateAllAsync(List<Session> sessions) {
orma.transactionAsync(() -> updateAllSync(sessions)).subscribe();
}
public void updateChecked(Session session) {
sessionRelation().updater()
.idEq(session.id)
.checked(session.checked)
.execute();
}
}