Skip to content

Commit 715477c

Browse files
committed
fix: "Select all" for tracks actually selects all (even when there are over hundreds)
1 parent 545e887 commit 715477c

File tree

26 files changed

+122
-66
lines changed

26 files changed

+122
-66
lines changed

data/database/src/commonMain/kotlin/ly/david/musicsearch/data/database/dao/TrackDao.kt

Lines changed: 14 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@ import ly.david.musicsearch.data.musicbrainz.models.TrackMusicBrainzModel
1414
import ly.david.musicsearch.shared.domain.alias.BasicAlias
1515
import ly.david.musicsearch.shared.domain.artist.ArtistCreditUiModel
1616
import ly.david.musicsearch.shared.domain.coroutine.CoroutineDispatchers
17+
import ly.david.musicsearch.shared.domain.listitem.SelectableId
1718
import lydavidmusicsearchdatadatabase.Track
1819

1920
class TrackDao(
@@ -71,7 +72,7 @@ class TrackDao(
7172
}
7273

7374
fun observeCountOfTracksByRelease(releaseId: String): Flow<Int> =
74-
transacter.getNumberOfTracksByRelease(
75+
transacter.getCountOfTracksByRelease(
7576
releaseId = releaseId,
7677
query = "%%",
7778
)
@@ -86,7 +87,7 @@ class TrackDao(
8687
): PagingSource<Int, TrackAndMedium> {
8788
val queryWithWildcards = "%$query%"
8889
return QueryPagingSource(
89-
countQuery = transacter.getNumberOfTracksByRelease(
90+
countQuery = transacter.getCountOfTracksByRelease(
9091
releaseId = releaseId,
9192
query = queryWithWildcards,
9293
),
@@ -104,6 +105,17 @@ class TrackDao(
104105
},
105106
)
106107
}
108+
109+
fun getAllTrackIdsByRelease(releaseId: String): List<SelectableId> {
110+
return transacter.getAllTrackIdsByRelease(
111+
releaseId = releaseId,
112+
).executeAsList().map {
113+
SelectableId(
114+
id = it.id,
115+
recordingId = it.recording_id,
116+
)
117+
}
118+
}
107119
}
108120

109121
private fun mapToTrackAndMedium(

data/database/src/commonMain/sqldelight/ly.david.musicsearch.data.database/track.sq

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,7 @@ UPDATE track
2626
SET recording_id = :newId
2727
WHERE recording_id = :oldId;
2828

29-
getNumberOfTracksByRelease:
29+
getCountOfTracksByRelease:
3030
SELECT IFNULL(
3131
(
3232
SELECT COUNT(DISTINCT track.id)
@@ -130,3 +130,12 @@ AND (
130130
GROUP BY track.id
131131
ORDER BY medium.position, track.position
132132
LIMIT :limit OFFSET :offset;
133+
134+
getAllTrackIdsByRelease:
135+
SELECT
136+
track.id,
137+
recording_id
138+
FROM track
139+
INNER JOIN medium ON track.medium_id = medium.id
140+
INNER JOIN `release` ON medium.release_id = `release`.id
141+
WHERE `release`.id = :releaseId;

data/repository/src/commonMain/kotlin/ly/david/musicsearch/data/repository/di/RepositoryDataModule.kt

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,7 @@ import ly.david.musicsearch.data.repository.place.PlaceRepositoryImpl
3131
import ly.david.musicsearch.data.repository.place.PlacesListRepositoryImpl
3232
import ly.david.musicsearch.data.repository.recording.RecordingRepositoryImpl
3333
import ly.david.musicsearch.data.repository.recording.RecordingsListRepositoryImpl
34+
import ly.david.musicsearch.data.repository.release.GetTrackIdsByReleaseImpl
3435
import ly.david.musicsearch.data.repository.release.ReleaseRepositoryImpl
3536
import ly.david.musicsearch.data.repository.release.ReleasesListRepositoryImpl
3637
import ly.david.musicsearch.data.repository.releasegroup.ObserveCountOfEachAlbumTypeImpl
@@ -76,6 +77,7 @@ import ly.david.musicsearch.shared.domain.recording.RecordingsListRepository
7677
import ly.david.musicsearch.shared.domain.relation.RelationRepository
7778
import ly.david.musicsearch.shared.domain.release.ReleaseRepository
7879
import ly.david.musicsearch.shared.domain.release.ReleasesListRepository
80+
import ly.david.musicsearch.shared.domain.release.usecase.GetTrackIdsByRelease
7981
import ly.david.musicsearch.shared.domain.releasegroup.ObserveCountOfEachAlbumType
8082
import ly.david.musicsearch.shared.domain.releasegroup.ReleaseGroupRepository
8183
import ly.david.musicsearch.shared.domain.releasegroup.ReleaseGroupsListRepository
@@ -134,4 +136,5 @@ val repositoryDataModule = module {
134136
singleOf(::ObserveCollectedCountImpl) bind ObserveCollectedCount::class
135137
singleOf(::ObserveVisitedCountImpl) bind ObserveVisitedCount::class
136138
singleOf(::ListensListRepositoryImpl) bind ListensListRepository::class
139+
singleOf(::GetTrackIdsByReleaseImpl) bind GetTrackIdsByRelease::class
137140
}

data/repository/src/commonMain/kotlin/ly/david/musicsearch/data/repository/listen/ListenRemoteMediator.kt

Lines changed: 0 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -89,8 +89,6 @@ internal class ListenRemoteMediator(
8989
onReachedOldest(true)
9090
}
9191

92-
// Note that we will constantly attempt to find older listens whenever the user changes their query
93-
// and scrolls to the bottom. These calls are small and fast, so it is okay for now.
9492
return MediatorResult.Success(
9593
endOfPaginationReached = currentOldestTimeStampS == newOldestTimeStampS,
9694
)
@@ -115,8 +113,6 @@ internal class ListenRemoteMediator(
115113
onReachedLatest(true)
116114
}
117115

118-
// We also constantly try to fetch new listens when the user changes their query.
119-
// Any way to not do that?
120116
return MediatorResult.Success(
121117
endOfPaginationReached = currentLatestTimeStampS == newLatestTimeStampS,
122118
)

data/repository/src/commonMain/kotlin/ly/david/musicsearch/data/repository/listen/ListensListRepositoryImpl.kt

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -89,7 +89,7 @@ class ListensListRepositoryImpl(
8989
onReachedLatest = onReachedLatest,
9090
onReachedOldest = onReachedOldest,
9191
)
92-
// Provide a smoother experience if we don't try to load data while the user is faceting on a recording
92+
// Don't try to load remote data while the user is faceting
9393
.takeIf { facetEntity == null },
9494
pagingSourceFactory = {
9595
listenDao.getListensByUser(
@@ -196,7 +196,7 @@ class ListensListRepositoryImpl(
196196
// the user may have submitted other listens in the past through other methods.
197197
// In one extreme case, the user may have 100 other listens at the same time,
198198
// then it's possible the recently submitted listen will not be fetched.
199-
// I don't think it's worth fetching until we found our submitted listens to be worth the overhead
199+
// I don't think fetching until we found our submitted listens to be worth the overhead
200200
// to handle this extreme case.
201201
)
202202
listenDao.insert(listens = listensResponse.asListOfListens())
Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
package ly.david.musicsearch.data.repository.release
2+
3+
import ly.david.musicsearch.data.database.dao.TrackDao
4+
import ly.david.musicsearch.shared.domain.listitem.SelectableId
5+
import ly.david.musicsearch.shared.domain.release.usecase.GetTrackIdsByRelease
6+
7+
class GetTrackIdsByReleaseImpl(
8+
private val trackDao: TrackDao,
9+
) : GetTrackIdsByRelease {
10+
override fun invoke(releaseId: String): List<SelectableId> {
11+
return trackDao.getAllTrackIdsByRelease(
12+
releaseId = releaseId,
13+
)
14+
}
15+
}

shared/domain/src/commonMain/kotlin/ly/david/musicsearch/shared/domain/DomainModule.kt

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -26,8 +26,8 @@ import ly.david.musicsearch.shared.domain.relation.usecase.GetEntityRelationship
2626
import ly.david.musicsearch.shared.domain.relation.usecase.GetEntityRelationshipsImpl
2727
import ly.david.musicsearch.shared.domain.relation.usecase.ObserveRelationStatsUseCase
2828
import ly.david.musicsearch.shared.domain.relation.usecase.ObserveRelationStatsUseCaseImpl
29-
import ly.david.musicsearch.shared.domain.release.usecase.GetTracksByRelease
30-
import ly.david.musicsearch.shared.domain.release.usecase.GetTracksByReleaseImpl
29+
import ly.david.musicsearch.shared.domain.release.usecase.ObserveTracksByRelease
30+
import ly.david.musicsearch.shared.domain.release.usecase.ObserveTracksByReleaseImpl
3131
import ly.david.musicsearch.shared.domain.search.history.usecase.DeleteSearchHistory
3232
import ly.david.musicsearch.shared.domain.search.history.usecase.GetSearchHistory
3333
import ly.david.musicsearch.shared.domain.search.history.usecase.RecordSearchHistory
@@ -59,7 +59,7 @@ val domainModule = module {
5959
singleOf(::GetNowPlayingHistory)
6060
singleOf(::ObserveRelationStatsUseCaseImpl) bind ObserveRelationStatsUseCase::class
6161
singleOf(::GetEntityRelationshipsImpl) bind GetEntityRelationships::class
62-
singleOf(::GetTracksByReleaseImpl) bind GetTracksByRelease::class
62+
singleOf(::ObserveTracksByReleaseImpl) bind ObserveTracksByRelease::class
6363
singleOf(::DeleteSearchHistory)
6464
singleOf(::GetSearchHistory)
6565
singleOf(::RecordSearchHistory)
Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
package ly.david.musicsearch.shared.domain.listitem
2+
3+
/**
4+
* @param id Should be the unique [EntityListItemModel.id].
5+
* @param recordingId For [TrackListItemModel].
6+
*/
7+
data class SelectableId(
8+
val id: String,
9+
val recordingId: String? = null,
10+
)
Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
package ly.david.musicsearch.shared.domain.release.usecase
2+
3+
import ly.david.musicsearch.shared.domain.listitem.SelectableId
4+
5+
interface GetTrackIdsByRelease {
6+
operator fun invoke(releaseId: String): List<SelectableId>
7+
}

shared/domain/src/commonMain/kotlin/ly/david/musicsearch/shared/domain/release/usecase/GetTracksByRelease.kt renamed to shared/domain/src/commonMain/kotlin/ly/david/musicsearch/shared/domain/release/usecase/ObserveTracksByRelease.kt

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -10,17 +10,17 @@ import ly.david.musicsearch.shared.domain.listitem.ListItemModel
1010
import ly.david.musicsearch.shared.domain.release.ReleaseRepository
1111
import kotlin.time.Clock
1212

13-
interface GetTracksByRelease {
13+
interface ObserveTracksByRelease {
1414
operator fun invoke(
1515
releaseId: String,
1616
query: String,
1717
): Flow<PagingData<ListItemModel>>
1818
}
1919

20-
class GetTracksByReleaseImpl(
20+
class ObserveTracksByReleaseImpl(
2121
private val releaseRepository: ReleaseRepository,
2222
private val coroutineScope: CoroutineScope,
23-
) : GetTracksByRelease {
23+
) : ObserveTracksByRelease {
2424
override operator fun invoke(
2525
releaseId: String,
2626
query: String,

0 commit comments

Comments
 (0)