Skip to content

Commit

Permalink
move maps to each DAO
Browse files Browse the repository at this point in the history
  • Loading branch information
mattcarter11 committed Oct 21, 2024
1 parent 17a58d5 commit 53e8b63
Show file tree
Hide file tree
Showing 6 changed files with 106 additions and 91 deletions.
88 changes: 0 additions & 88 deletions app/src/main/java/com/dd3boh/outertune/db/DatabaseDao.kt
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand All @@ -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
Expand All @@ -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
Expand Down Expand Up @@ -82,20 +78,6 @@ interface DatabaseDao : SongsDao, AlbumsDao, ArtistsDao, PlaylistsDao, QueueDao
@Query("SELECT * FROM lyrics WHERE id = :id")
fun lyrics(id: String?): Flow<LyricsEntity?>

@Transaction
fun addSongToPlaylist(playlist: Playlist, songIds: List<String>) {
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<List<EventWithSong>>

Expand All @@ -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)

Expand Down Expand Up @@ -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(
Expand Down Expand Up @@ -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)

Expand All @@ -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()
Expand All @@ -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<PlaylistSongMap>

@Query("SELECT * FROM playlist_song_map WHERE playlistId = :playlistId AND position >= :from ORDER BY position")
fun playlistSongMaps(playlistId: String, from: Int): List<PlaylistSongMap>

@RawQuery
fun raw(supportSQLiteQuery: SupportSQLiteQuery): Int

Expand Down
58 changes: 57 additions & 1 deletion app/src/main/java/com/dd3boh/outertune/db/daos/AlbumsDao.kt
Original file line number Diff line number Diff line change
Expand Up @@ -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("""
Expand Down Expand Up @@ -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
Expand Down
12 changes: 12 additions & 0 deletions app/src/main/java/com/dd3boh/outertune/db/daos/ArtistsDao.kt
Original file line number Diff line number Diff line change
Expand Up @@ -15,13 +15,18 @@ 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
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 {

Expand Down Expand Up @@ -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
Expand All @@ -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
Expand Down
35 changes: 35 additions & 0 deletions app/src/main/java/com/dd3boh/outertune/db/daos/PlaylistsDao.kt
Original file line number Diff line number Diff line change
Expand Up @@ -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 {

Expand Down Expand Up @@ -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<String>,): List<String>

@Query("SELECT * FROM playlist_song_map WHERE songId = :songId")
fun songMapsToPlaylist(songId: String): List<PlaylistSongMap>

@Query("SELECT * FROM playlist_song_map WHERE playlistId = :playlistId AND position >= :from ORDER BY position")
fun songMapsToPlaylist(playlistId: String, from: Int): List<PlaylistSongMap>

@RawQuery(observedEntities = [PlaylistEntity::class])
fun _getPlaylists(query: SupportSQLiteQuery): Flow<List<Playlist>>

Expand Down Expand Up @@ -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(
Expand All @@ -154,6 +172,20 @@ interface PlaylistsDao {
))
}

@Transaction
fun addSongToPlaylist(playlist: Playlist, songIds: List<String>) {
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)
Expand All @@ -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
}
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down
2 changes: 1 addition & 1 deletion app/src/main/java/com/dd3boh/outertune/utils/SyncUtils.kt
Original file line number Diff line number Diff line change
Expand Up @@ -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)
}
Expand Down

0 comments on commit 53e8b63

Please sign in to comment.