From 53e8b635458cce3e9a932d7220b14d2a3f6a857d Mon Sep 17 00:00:00 2001 From: mattcarter11 <38189440+mattcarter11@users.noreply.github.com> Date: Mon, 21 Oct 2024 22:27:22 +0200 Subject: [PATCH] move maps to each DAO --- .../com/dd3boh/outertune/db/DatabaseDao.kt | 88 ------------------- .../com/dd3boh/outertune/db/daos/AlbumsDao.kt | 58 +++++++++++- .../dd3boh/outertune/db/daos/ArtistsDao.kt | 12 +++ .../dd3boh/outertune/db/daos/PlaylistsDao.kt | 35 ++++++++ .../screens/playlist/LocalPlaylistScreen.kt | 2 +- .../com/dd3boh/outertune/utils/SyncUtils.kt | 2 +- 6 files changed, 106 insertions(+), 91 deletions(-) diff --git a/app/src/main/java/com/dd3boh/outertune/db/DatabaseDao.kt b/app/src/main/java/com/dd3boh/outertune/db/DatabaseDao.kt index 194733d8e..9fc1fe371 100644 --- a/app/src/main/java/com/dd3boh/outertune/db/DatabaseDao.kt +++ b/app/src/main/java/com/dd3boh/outertune/db/DatabaseDao.kt @@ -7,7 +7,6 @@ import androidx.room.OnConflictStrategy import androidx.room.Query import androidx.room.RawQuery import androidx.room.Transaction -import androidx.room.Update import androidx.room.Upsert import androidx.sqlite.db.SupportSQLiteQuery import com.dd3boh.outertune.db.daos.AlbumsDao @@ -23,8 +22,6 @@ import com.dd3boh.outertune.db.entities.EventWithSong import com.dd3boh.outertune.db.entities.FormatEntity import com.dd3boh.outertune.db.entities.GenreEntity import com.dd3boh.outertune.db.entities.LyricsEntity -import com.dd3boh.outertune.db.entities.Playlist -import com.dd3boh.outertune.db.entities.PlaylistSongMap import com.dd3boh.outertune.db.entities.QueueEntity import com.dd3boh.outertune.db.entities.QueueSongMap import com.dd3boh.outertune.db.entities.RelatedSongMap @@ -38,7 +35,6 @@ import com.dd3boh.outertune.extensions.toSQLiteQuery import com.dd3boh.outertune.models.MediaMetadata import com.dd3boh.outertune.models.MultiQueueObject import com.dd3boh.outertune.models.toMediaMetadata -import com.zionhuang.innertube.models.AlbumItem import com.zionhuang.innertube.models.SongItem import com.zionhuang.innertube.pages.AlbumPage import kotlinx.coroutines.flow.Flow @@ -82,20 +78,6 @@ interface DatabaseDao : SongsDao, AlbumsDao, ArtistsDao, PlaylistsDao, QueueDao @Query("SELECT * FROM lyrics WHERE id = :id") fun lyrics(id: String?): Flow - @Transaction - fun addSongToPlaylist(playlist: Playlist, songIds: List) { - var position = playlist.songCount - songIds.forEach { id -> - insert( - PlaylistSongMap( - songId = id, - playlistId = playlist.id, - position = position++ - ) - ) - } - } - @Query("SELECT * FROM event ORDER BY rowId DESC") fun events(): Flow> @@ -120,21 +102,9 @@ interface DatabaseDao : SongsDao, AlbumsDao, ArtistsDao, PlaylistsDao, QueueDao @Insert(onConflict = OnConflictStrategy.IGNORE) fun insert(genre: GenreEntity) - @Insert(onConflict = OnConflictStrategy.IGNORE) - fun insert(map: SongArtistMap) - - @Insert(onConflict = OnConflictStrategy.IGNORE) - fun insert(map: SongAlbumMap) - - @Insert(onConflict = OnConflictStrategy.IGNORE) - fun insert(map: AlbumArtistMap) - @Insert(onConflict = OnConflictStrategy.IGNORE) fun insert(map: SongGenreMap) - @Insert(onConflict = OnConflictStrategy.IGNORE) - fun insert(map: PlaylistSongMap) - @Insert(onConflict = OnConflictStrategy.REPLACE) fun insert(searchHistory: SearchHistory) @@ -223,40 +193,6 @@ interface DatabaseDao : SongsDao, AlbumsDao, ArtistsDao, PlaylistsDao, QueueDao ?.forEach(::insert) } - @Transaction - fun insert(albumItem: AlbumItem) { - if (insert(AlbumEntity( - id = albumItem.browseId, - playlistId = albumItem.playlistId, - title = albumItem.title, - year = albumItem.year, - thumbnailUrl = albumItem.thumbnail, - songCount = 0, - duration = 0 - )) == -1L - ) return - albumItem.artists - ?.map { artist -> - ArtistEntity( - id = artist.id ?: artistByName(artist.name)?.id ?: ArtistEntity.generateArtistId(), - name = artist.name - ) - } - ?.onEach(::insert) - ?.mapIndexed { index, artist -> - AlbumArtistMap( - albumId = albumItem.browseId, - artistId = artist.id, - order = index - ) - } - ?.forEach(::insert) - } - - @Update - fun update(map: PlaylistSongMap) - - @Transaction fun update(album: AlbumEntity, albumPage: AlbumPage) { update( @@ -298,26 +234,12 @@ interface DatabaseDao : SongsDao, AlbumsDao, ArtistsDao, PlaylistsDao, QueueDao ?.forEach(::insert) } - @Transaction - @Query("UPDATE song_artist_map SET artistId = :newId WHERE artistId = :oldId") - fun updateSongArtistMap(oldId: String, newId: String) - - @Transaction - @Query("UPDATE album_artist_map SET artistId = :newId WHERE artistId = :oldId") - fun updateAlbumArtistMap(oldId: String, newId: String) - - @Upsert - fun upsert(map: SongAlbumMap) - @Upsert fun upsert(lyrics: LyricsEntity) @Upsert fun upsert(format: FormatEntity) - @Delete - fun delete(playlistSongMap: PlaylistSongMap) - @Delete fun delete(lyrics: LyricsEntity) @@ -327,10 +249,6 @@ interface DatabaseDao : SongsDao, AlbumsDao, ArtistsDao, PlaylistsDao, QueueDao @Delete fun delete(event: Event) - @Transaction - @Query("DELETE FROM song_artist_map WHERE songId = :songID") - fun unlinkSongArtists(songID: String) - @Transaction @Query("DELETE FROM genre WHERE isLocal = 1") fun nukeLocalGenre() @@ -343,12 +261,6 @@ interface DatabaseDao : SongsDao, AlbumsDao, ArtistsDao, PlaylistsDao, QueueDao nukeLocalGenre() } - @Query("SELECT * FROM playlist_song_map WHERE songId = :songId") - fun playlistSongMaps(songId: String): List - - @Query("SELECT * FROM playlist_song_map WHERE playlistId = :playlistId AND position >= :from ORDER BY position") - fun playlistSongMaps(playlistId: String, from: Int): List - @RawQuery fun raw(supportSQLiteQuery: SupportSQLiteQuery): Int diff --git a/app/src/main/java/com/dd3boh/outertune/db/daos/AlbumsDao.kt b/app/src/main/java/com/dd3boh/outertune/db/daos/AlbumsDao.kt index 5f1aa914f..dbbe6d1e5 100644 --- a/app/src/main/java/com/dd3boh/outertune/db/daos/AlbumsDao.kt +++ b/app/src/main/java/com/dd3boh/outertune/db/daos/AlbumsDao.kt @@ -8,19 +8,28 @@ import androidx.room.Query import androidx.room.RawQuery import androidx.room.Transaction import androidx.room.Update +import androidx.room.Upsert import androidx.sqlite.db.SimpleSQLiteQuery import androidx.sqlite.db.SupportSQLiteQuery import com.dd3boh.outertune.constants.AlbumSortType import com.dd3boh.outertune.db.entities.Album +import com.dd3boh.outertune.db.entities.AlbumArtistMap import com.dd3boh.outertune.db.entities.AlbumEntity import com.dd3boh.outertune.db.entities.AlbumWithSongs +import com.dd3boh.outertune.db.entities.ArtistEntity import com.dd3boh.outertune.db.entities.Song +import com.dd3boh.outertune.db.entities.SongAlbumMap import com.dd3boh.outertune.extensions.reversed +import com.zionhuang.innertube.models.AlbumItem import kotlinx.coroutines.flow.Flow import kotlinx.coroutines.flow.map +/* + * Logic related to albums entities and their mapping + */ + @Dao -interface AlbumsDao { +interface AlbumsDao : ArtistsDao { // region Gets @Query(""" @@ -227,11 +236,58 @@ interface AlbumsDao { // region Inserts @Insert(onConflict = OnConflictStrategy.IGNORE) fun insert(album: AlbumEntity): Long + + @Insert(onConflict = OnConflictStrategy.IGNORE) + fun insert(map: SongAlbumMap) + + @Insert(onConflict = OnConflictStrategy.IGNORE) + fun insert(map: AlbumArtistMap) + + @Transaction + fun insert(albumItem: AlbumItem) { + if (insert(AlbumEntity( + id = albumItem.browseId, + playlistId = albumItem.playlistId, + title = albumItem.title, + year = albumItem.year, + thumbnailUrl = albumItem.thumbnail, + songCount = 0, + duration = 0 + )) == -1L + ) return + albumItem.artists + ?.map { artist -> + ArtistEntity( + id = artist.id ?: artistByName(artist.name)?.id ?: ArtistEntity.generateArtistId(), + name = artist.name + ) + } + ?.onEach(::insert) + ?.mapIndexed { index, artist -> + AlbumArtistMap( + albumId = albumItem.browseId, + artistId = artist.id, + order = index + ) + } + ?.forEach(::insert) + } // endregion // region Updates @Update fun update(album: AlbumEntity) + + @Upsert + fun upsert(map: SongAlbumMap) + + @Transaction + @Query("UPDATE album_artist_map SET artistId = :newId WHERE artistId = :oldId") + fun updateAlbumArtistMap(oldId: String, newId: String) + + @Transaction + @Query("DELETE FROM song_artist_map WHERE songId = :songID") + fun unlinkSongArtists(songID: String) // endregion // region Deletes diff --git a/app/src/main/java/com/dd3boh/outertune/db/daos/ArtistsDao.kt b/app/src/main/java/com/dd3boh/outertune/db/daos/ArtistsDao.kt index c602877c3..8d6376a43 100644 --- a/app/src/main/java/com/dd3boh/outertune/db/daos/ArtistsDao.kt +++ b/app/src/main/java/com/dd3boh/outertune/db/daos/ArtistsDao.kt @@ -15,6 +15,7 @@ import com.dd3boh.outertune.constants.ArtistSortType import com.dd3boh.outertune.db.entities.Artist import com.dd3boh.outertune.db.entities.ArtistEntity import com.dd3boh.outertune.db.entities.Song +import com.dd3boh.outertune.db.entities.SongArtistMap import com.dd3boh.outertune.extensions.reversed import com.dd3boh.outertune.ui.utils.resize import com.zionhuang.innertube.pages.ArtistPage @@ -22,6 +23,10 @@ import kotlinx.coroutines.flow.Flow import kotlinx.coroutines.flow.map import java.time.LocalDateTime +/* + * Logic related to artists entities and their mapping + */ + @Dao interface ArtistsDao { @@ -225,6 +230,9 @@ interface ArtistsDao { // region Inserts @Insert(onConflict = OnConflictStrategy.IGNORE) fun insert(artist: ArtistEntity) + + @Insert(onConflict = OnConflictStrategy.IGNORE) + fun insert(map: SongArtistMap) // endregion // region Updates @@ -241,6 +249,10 @@ interface ArtistsDao { ) ) } + + @Transaction + @Query("UPDATE song_artist_map SET artistId = :newId WHERE artistId = :oldId") + fun updateSongArtistMap(oldId: String, newId: String) // endregion // region Deletes diff --git a/app/src/main/java/com/dd3boh/outertune/db/daos/PlaylistsDao.kt b/app/src/main/java/com/dd3boh/outertune/db/daos/PlaylistsDao.kt index 5adca3e33..efbe8c032 100644 --- a/app/src/main/java/com/dd3boh/outertune/db/daos/PlaylistsDao.kt +++ b/app/src/main/java/com/dd3boh/outertune/db/daos/PlaylistsDao.kt @@ -14,11 +14,17 @@ import com.dd3boh.outertune.constants.PlaylistSortType import com.dd3boh.outertune.db.entities.Playlist import com.dd3boh.outertune.db.entities.PlaylistEntity import com.dd3boh.outertune.db.entities.PlaylistSong +import com.dd3boh.outertune.db.entities.PlaylistSongMap import com.dd3boh.outertune.extensions.reversed import com.zionhuang.innertube.models.PlaylistItem import kotlinx.coroutines.flow.Flow import kotlinx.coroutines.flow.map + +/* + * Logic related to playlists entities and their mapping + */ + @Dao interface PlaylistsDao { @@ -69,6 +75,12 @@ interface PlaylistsDao { @Query("SELECT songId from playlist_song_map WHERE playlistId = :playlistId AND songId IN (:songIds)") fun playlistDuplicates(playlistId: String, songIds: List,): List + @Query("SELECT * FROM playlist_song_map WHERE songId = :songId") + fun songMapsToPlaylist(songId: String): List + + @Query("SELECT * FROM playlist_song_map WHERE playlistId = :playlistId AND position >= :from ORDER BY position") + fun songMapsToPlaylist(playlistId: String, from: Int): List + @RawQuery(observedEntities = [PlaylistEntity::class]) fun _getPlaylists(query: SupportSQLiteQuery): Flow> @@ -134,12 +146,18 @@ interface PlaylistsDao { // region Inserts @Insert(onConflict = OnConflictStrategy.IGNORE) fun insert(playlist: PlaylistEntity) + + @Insert(onConflict = OnConflictStrategy.IGNORE) + fun insert(map: PlaylistSongMap) // endregion // region Updates @Update fun update(playlist: PlaylistEntity) + @Update + fun update(map: PlaylistSongMap) + @Update fun update(playlistEntity: PlaylistEntity, playlistItem: PlaylistItem) { update(playlistEntity.copy( @@ -154,6 +172,20 @@ interface PlaylistsDao { )) } + @Transaction + fun addSongToPlaylist(playlist: Playlist, songIds: List) { + var position = playlist.songCount + songIds.forEach { id -> + insert( + PlaylistSongMap( + songId = id, + playlistId = playlist.id, + position = position++ + ) + ) + } + } + @Transaction @Query("UPDATE playlist SET isLocal = 1 WHERE id = :playlistId") fun playlistDesync(playlistId: String) @@ -179,5 +211,8 @@ interface PlaylistsDao { @Query("DELETE FROM playlist_song_map WHERE playlistId = :playlistId") fun clearPlaylist(playlistId: String) + + @Delete + fun delete(playlistSongMap: PlaylistSongMap) // endregion } \ No newline at end of file diff --git a/app/src/main/java/com/dd3boh/outertune/ui/screens/playlist/LocalPlaylistScreen.kt b/app/src/main/java/com/dd3boh/outertune/ui/screens/playlist/LocalPlaylistScreen.kt index c603588a5..5c0e19576 100644 --- a/app/src/main/java/com/dd3boh/outertune/ui/screens/playlist/LocalPlaylistScreen.kt +++ b/app/src/main/java/com/dd3boh/outertune/ui/screens/playlist/LocalPlaylistScreen.kt @@ -312,7 +312,7 @@ fun LocalPlaylistScreen( return@rememberReorderableLazyListState } viewModel.viewModelScope.launch(Dispatchers.IO) { - val playlistSongMap = database.playlistSongMaps(viewModel.playlistId, 0) + val playlistSongMap = database.songMapsToPlaylist(viewModel.playlistId, 0) var fromIndex = initialFromIndex - headerItems val toIndex = initialToIndex - headerItems diff --git a/app/src/main/java/com/dd3boh/outertune/utils/SyncUtils.kt b/app/src/main/java/com/dd3boh/outertune/utils/SyncUtils.kt index 08f4f8140..168b079f7 100644 --- a/app/src/main/java/com/dd3boh/outertune/utils/SyncUtils.kt +++ b/app/src/main/java/com/dd3boh/outertune/utils/SyncUtils.kt @@ -335,7 +335,7 @@ class SyncUtils @Inject constructor( val updatedPlaylist = database.playlistByBrowseId(remotePlaylist.id).firstOrNull() updatedPlaylist?.let { - val playlistSongMaps = database.playlistSongMaps(updatedPlaylist.id) + val playlistSongMaps = database.songMapsToPlaylist(updatedPlaylist.id) if (updatedPlaylist.playlist.isEditable || playlistSongMaps.isNotEmpty()) { syncPlaylist(remotePlaylist.id, updatedPlaylist.id) }