From efffbab4a767441d4144fa427547b7f40daaae1c Mon Sep 17 00:00:00 2001 From: Koitharu Date: Wed, 20 Jul 2022 08:33:13 +0300 Subject: [PATCH] Fix empty categories --- .../favourites/data/FavouriteCategoriesDao.kt | 11 ---------- .../kotatsu/favourites/data/FavouritesDao.kt | 21 +++++++++++++++---- .../favourites/domain/FavouritesRepository.kt | 18 +++++++++++++--- .../FavouritesCategoriesViewModel.kt | 4 ++-- 4 files changed, 34 insertions(+), 20 deletions(-) diff --git a/app/src/main/java/org/koitharu/kotatsu/favourites/data/FavouriteCategoriesDao.kt b/app/src/main/java/org/koitharu/kotatsu/favourites/data/FavouriteCategoriesDao.kt index f83912ae6..6788a641d 100644 --- a/app/src/main/java/org/koitharu/kotatsu/favourites/data/FavouriteCategoriesDao.kt +++ b/app/src/main/java/org/koitharu/kotatsu/favourites/data/FavouriteCategoriesDao.kt @@ -15,17 +15,6 @@ abstract class FavouriteCategoriesDao { @Query("SELECT * FROM favourite_categories WHERE deleted_at = 0 ORDER BY sort_key") abstract fun observeAll(): Flow> - @MapInfo(valueColumn = "cover") - @Query( - """ - SELECT favourite_categories.*, manga.cover_url AS cover - FROM favourite_categories JOIN manga ON manga.manga_id IN - (SELECT manga_id FROM favourites WHERE favourites.category_id == favourite_categories.category_id) - ORDER BY favourite_categories.sort_key - """ - ) // FIXME empty categories are ignored - abstract fun observeAllWithDetails(): Flow>> - @Query("SELECT * FROM favourite_categories WHERE category_id = :id AND deleted_at = 0") abstract fun observe(id: Long): Flow diff --git a/app/src/main/java/org/koitharu/kotatsu/favourites/data/FavouritesDao.kt b/app/src/main/java/org/koitharu/kotatsu/favourites/data/FavouritesDao.kt index ac7dd88a0..764d0194c 100644 --- a/app/src/main/java/org/koitharu/kotatsu/favourites/data/FavouritesDao.kt +++ b/app/src/main/java/org/koitharu/kotatsu/favourites/data/FavouritesDao.kt @@ -21,7 +21,7 @@ abstract class FavouritesDao { "SELECT * FROM favourites LEFT JOIN manga ON favourites.manga_id = manga.manga_id " + "WHERE favourites.deleted_at = 0 GROUP BY favourites.manga_id ORDER BY $orderBy", ) - return observeAllRaw(query) + return observeAllImpl(query) } @Transaction @@ -45,7 +45,7 @@ abstract class FavouritesDao { "WHERE category_id = ? AND deleted_at = 0 GROUP BY favourites.manga_id ORDER BY $orderBy", arrayOf(categoryId), ) - return observeAllRaw(query) + return observeAllImpl(query) } @Transaction @@ -61,6 +61,16 @@ abstract class FavouritesDao { ) abstract suspend fun findAllManga(categoryId: Int): List + suspend fun findCovers(categoryId: Long, order: SortOrder, limit: Int): List { + val orderBy = getOrderBy(order) + @Language("RoomSql") val query = SimpleSQLiteQuery( + "SELECT m.cover_url FROM favourites AS f LEFT JOIN manga AS m ON f.manga_id = m.manga_id " + + "WHERE f.category_id = ? AND deleted_at = 0 ORDER BY $orderBy LIMIT ?", + arrayOf(categoryId, limit), + ) + return findCoversImpl(query) + } + @Query("SELECT * FROM manga WHERE manga_id IN (SELECT manga_id FROM favourites WHERE deleted_at = 0)") abstract suspend fun findAllManga(): List @@ -103,7 +113,10 @@ abstract class FavouritesDao { @Transaction @RawQuery(observedEntities = [FavouriteEntity::class]) - protected abstract fun observeAllRaw(query: SupportSQLiteQuery): Flow> + protected abstract fun observeAllImpl(query: SupportSQLiteQuery): Flow> + + @RawQuery + protected abstract suspend fun findCoversImpl(query: SupportSQLiteQuery): List private fun getOrderBy(sortOrder: SortOrder) = when (sortOrder) { SortOrder.RATING -> "rating DESC" @@ -112,4 +125,4 @@ abstract class FavouritesDao { SortOrder.ALPHABETICAL -> "title ASC" else -> throw IllegalArgumentException("Sort order $sortOrder is not supported") } -} \ No newline at end of file +} diff --git a/app/src/main/java/org/koitharu/kotatsu/favourites/domain/FavouritesRepository.kt b/app/src/main/java/org/koitharu/kotatsu/favourites/domain/FavouritesRepository.kt index 2f48167fc..814575aef 100644 --- a/app/src/main/java/org/koitharu/kotatsu/favourites/domain/FavouritesRepository.kt +++ b/app/src/main/java/org/koitharu/kotatsu/favourites/domain/FavouritesRepository.kt @@ -1,5 +1,6 @@ package org.koitharu.kotatsu.favourites.domain +import android.util.ArrayMap import androidx.room.withTransaction import kotlinx.coroutines.flow.* import org.koitharu.kotatsu.base.domain.ReversibleHandle @@ -50,10 +51,21 @@ class FavouritesRepository( }.distinctUntilChanged() } - fun observeCategoriesWithDetails(): Flow>> { - return db.favouriteCategoriesDao.observeAllWithDetails() + fun observeCategoriesWithCovers(coversLimit: Int): Flow>> { + return db.favouriteCategoriesDao.observeAll() .map { - it.mapKeys { (k, _) -> k.toFavouriteCategory() } + db.withTransaction { + val res = ArrayMap>() + for (entity in it) { + val cat = entity.toFavouriteCategory() + res[cat] = db.favouritesDao.findCovers( + categoryId = cat.id, + order = cat.order, + limit = coversLimit, + ) + } + res + } } } diff --git a/app/src/main/java/org/koitharu/kotatsu/favourites/ui/categories/FavouritesCategoriesViewModel.kt b/app/src/main/java/org/koitharu/kotatsu/favourites/ui/categories/FavouritesCategoriesViewModel.kt index 0b596b1cb..5efe8dc2b 100644 --- a/app/src/main/java/org/koitharu/kotatsu/favourites/ui/categories/FavouritesCategoriesViewModel.kt +++ b/app/src/main/java/org/koitharu/kotatsu/favourites/ui/categories/FavouritesCategoriesViewModel.kt @@ -39,13 +39,13 @@ class FavouritesCategoriesViewModel( }.asLiveDataDistinct(viewModelScope.coroutineContext + Dispatchers.Default, emptyList()) val detalizedCategories = combine( - repository.observeCategoriesWithDetails(), + repository.observeCategoriesWithCovers(coversLimit = 3), isReorder, ) { list, reordering -> list.map { (category, covers) -> CategoryListModel( mangaCount = covers.size, - covers = covers.take(3), + covers = covers, category = category, isReorderMode = reordering, )