ChapterManagerImpl.java 4.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117
  1. package eu.kanade.mangafeed.data.managers;
  2. import com.pushtorefresh.storio.sqlite.StorIOSQLite;
  3. import com.pushtorefresh.storio.sqlite.operations.delete.DeleteResult;
  4. import com.pushtorefresh.storio.sqlite.operations.delete.DeleteResults;
  5. import com.pushtorefresh.storio.sqlite.operations.get.PreparedGetListOfObjects;
  6. import eu.kanade.mangafeed.util.PostResult;
  7. import com.pushtorefresh.storio.sqlite.operations.put.PutResult;
  8. import com.pushtorefresh.storio.sqlite.operations.put.PutResults;
  9. import com.pushtorefresh.storio.sqlite.queries.Query;
  10. import java.util.List;
  11. import eu.kanade.mangafeed.data.models.Chapter;
  12. import eu.kanade.mangafeed.data.models.Manga;
  13. import eu.kanade.mangafeed.data.tables.ChaptersTable;
  14. import rx.Observable;
  15. public class ChapterManagerImpl extends BaseManager implements ChapterManager {
  16. public ChapterManagerImpl(StorIOSQLite db) {
  17. super(db);
  18. }
  19. private PreparedGetListOfObjects<Chapter> prepareGetChapters(Manga manga) {
  20. return db.get()
  21. .listOfObjects(Chapter.class)
  22. .withQuery(Query.builder()
  23. .table(ChaptersTable.TABLE)
  24. .where(ChaptersTable.COLUMN_MANGA_ID + "=?")
  25. .whereArgs(manga.id)
  26. .build())
  27. .prepare();
  28. }
  29. @Override
  30. public Observable<List<Chapter>> getChapters(Manga manga) {
  31. return prepareGetChapters(manga).createObservable();
  32. }
  33. @Override
  34. public Observable<List<Chapter>> getChapters(long manga_id) {
  35. return db.get()
  36. .listOfObjects(Chapter.class)
  37. .withQuery(Query.builder()
  38. .table(ChaptersTable.TABLE)
  39. .where(ChaptersTable.COLUMN_MANGA_ID + "=?")
  40. .whereArgs(manga_id)
  41. .build())
  42. .prepare()
  43. .createObservable();
  44. }
  45. @Override
  46. public Observable<PutResult> insertChapter(Chapter chapter) {
  47. return db.put()
  48. .object(chapter)
  49. .prepare()
  50. .createObservable();
  51. }
  52. @Override
  53. public Observable<PutResults<Chapter>> insertChapters(List<Chapter> chapters) {
  54. return db.put()
  55. .objects(chapters)
  56. .prepare()
  57. .createObservable();
  58. }
  59. // Add new chapters or delete if the source deletes them
  60. @Override
  61. public Observable<PostResult> insertOrRemoveChapters(Manga manga, List<Chapter> chapters) {
  62. for (Chapter chapter : chapters) {
  63. chapter.manga_id = manga.id;
  64. }
  65. Observable<List<Chapter>> chapterList = Observable.create(subscriber -> {
  66. subscriber.onNext(prepareGetChapters(manga).executeAsBlocking());
  67. subscriber.onCompleted();
  68. });
  69. Observable<Integer> newChaptersObs = chapterList
  70. .flatMap(dbChapters -> Observable.from(chapters)
  71. .filter(c -> !dbChapters.contains(c))
  72. .toList()
  73. .flatMap(this::insertChapters)
  74. .map(PutResults::numberOfInserts));
  75. Observable<Integer> deletedChaptersObs = chapterList
  76. .flatMap(dbChapters -> Observable.from(dbChapters)
  77. .filter(c -> !chapters.contains(c))
  78. .toList()
  79. .flatMap(this::deleteChapters)
  80. .map( d -> d.results().size() ));
  81. return Observable.zip(newChaptersObs, deletedChaptersObs,
  82. (insertions, deletions) -> new PostResult(0, insertions, deletions)
  83. );
  84. }
  85. @Override
  86. public Observable<DeleteResult> deleteChapter(Chapter chapter) {
  87. return db.delete()
  88. .object(chapter)
  89. .prepare()
  90. .createObservable();
  91. }
  92. @Override
  93. public Observable<DeleteResults<Chapter>> deleteChapters(List<Chapter> chapters) {
  94. return db.delete()
  95. .objects(chapters)
  96. .prepare()
  97. .createObservable();
  98. }
  99. }