From 083652e293d770f0f8b9d21d60dcf01d22998bbf Mon Sep 17 00:00:00 2001 From: emeric Date: Fri, 3 Nov 2023 12:43:56 +0100 Subject: [PATCH] Speed up searches when one cluster filter is active --- src/libs/services/database/impl/Artist.cpp | 10 ++++++++-- src/libs/services/database/impl/Release.cpp | 10 ++++++++-- src/libs/services/database/impl/Track.cpp | 8 +++++++- src/lms/ui/explore/ArtistCollector.cpp | 1 - src/lms/ui/explore/ReleaseCollector.cpp | 1 - 5 files changed, 23 insertions(+), 7 deletions(-) diff --git a/src/libs/services/database/impl/Artist.cpp b/src/libs/services/database/impl/Artist.cpp index a5e9e6fc..8d0849ef 100644 --- a/src/libs/services/database/impl/Artist.cpp +++ b/src/libs/services/database/impl/Artist.cpp @@ -99,7 +99,8 @@ createQuery(Session& session, const Artist::FindParameters& params) || params.writtenAfter.isValid() || params.linkType || params.track.isValid() - || params.release.isValid()) + || params.release.isValid() + || params.clusters.size() == 1) { query.join("track t ON t.id = t_a_l.track_id"); query.join("track_artist_link t_a_l ON t_a_l.artist_id = a.id"); @@ -140,7 +141,12 @@ createQuery(Session& session, const Artist::FindParameters& params) .where("s_a.sync_state <> ?").bind(SyncState::PendingRemove); } - if (!params.clusters.empty()) + if(params.clusters.size() == 1) + { + query.join("track_cluster t_c ON t_c.track_id = t.id") + .where("t_c.cluster_id = ?").bind(params.clusters.front()); + } + else if (params.clusters.size() > 1) { std::ostringstream oss; oss << "a.id IN (SELECT DISTINCT a.id FROM artist a" diff --git a/src/libs/services/database/impl/Release.cpp b/src/libs/services/database/impl/Release.cpp index 55841ff5..801b4720 100644 --- a/src/libs/services/database/impl/Release.cpp +++ b/src/libs/services/database/impl/Release.cpp @@ -45,7 +45,8 @@ namespace Database || params.sortMethod == ReleaseSortMethod::OriginalDateDesc || params.writtenAfter.isValid() || params.dateRange - || params.artist.isValid()) + || params.artist.isValid() + || params.clusters.size() == 1) { query.join("track t ON t.release_id = r.id"); } @@ -120,7 +121,12 @@ namespace Database } } - if (!params.clusters.empty()) + if (params.clusters.size() == 1) + { + query.join("track_cluster t_c ON t_c.track_id = t.id") + .where("t_c.cluster_id = ?").bind(params.clusters.front()); + } + else if (params.clusters.size() > 1) { std::ostringstream oss; oss << "r.id IN (SELECT DISTINCT r.id FROM release r" diff --git a/src/libs/services/database/impl/Track.cpp b/src/libs/services/database/impl/Track.cpp index 1b0c3a55..7c9683e0 100644 --- a/src/libs/services/database/impl/Track.cpp +++ b/src/libs/services/database/impl/Track.cpp @@ -64,7 +64,13 @@ namespace Database .where("s_t.sync_state <> ?").bind(SyncState::PendingRemove); } - if (!params.clusters.empty()) + if (params.clusters.size() == 1) + { + // optim + query.join("track_cluster t_c ON t_c.track_id = t.id") + .where("t_c.cluster_id = ?").bind(params.clusters.front()); + } + else if (params.clusters.size() > 1) { std::ostringstream oss; oss << "t.id IN (SELECT DISTINCT t.id FROM track t" diff --git a/src/lms/ui/explore/ArtistCollector.cpp b/src/lms/ui/explore/ArtistCollector.cpp index fdcd804a..fe3a8a95 100644 --- a/src/lms/ui/explore/ArtistCollector.cpp +++ b/src/lms/ui/explore/ArtistCollector.cpp @@ -79,7 +79,6 @@ namespace UserInterface case Mode::Search: { - // do not sort results as we search in both name and sort names, sorting may be very long Artist::FindParameters params; params.setClusters(getFilters().getClusterIds()); params.setKeywords(getSearchKeywords()); diff --git a/src/lms/ui/explore/ReleaseCollector.cpp b/src/lms/ui/explore/ReleaseCollector.cpp index 3693ad50..f892bbd8 100644 --- a/src/lms/ui/explore/ReleaseCollector.cpp +++ b/src/lms/ui/explore/ReleaseCollector.cpp @@ -83,7 +83,6 @@ namespace UserInterface Release::FindParameters params; params.setClusters(getFilters().getClusterIds()); params.setKeywords(getSearchKeywords()); - params.setSortMethod(ReleaseSortMethod::Name); params.setRange(range); {