diff --git a/src/libs/database/impl/Artist.cpp b/src/libs/database/impl/Artist.cpp index 8d3782bc..7bec17cf 100644 --- a/src/libs/database/impl/Artist.cpp +++ b/src/libs/database/impl/Artist.cpp @@ -49,9 +49,9 @@ namespace lms::db || params.linkType || params.track.isValid() || params.release.isValid() - || params.clusters.size() == 1 - || params.mediaLibrary.isValid() - || params.label.isValid()) + || params.filters.clusters.size() == 1 + || params.filters.mediaLibrary.isValid() + || params.filters.label.isValid()) { query.join("track_artist_link t_a_l ON t_a_l.artist_id = a.id"); } @@ -60,8 +60,8 @@ namespace lms::db || params.sortMethod == ArtistSortMethod::AddedDesc || params.writtenAfter.isValid() || params.release.isValid() - || params.mediaLibrary.isValid() - || params.label.isValid()) + || params.filters.mediaLibrary.isValid() + || params.filters.label.isValid()) { query.join("track t ON t.id = t_a_l.track_id"); @@ -71,13 +71,13 @@ namespace lms::db if (params.release.isValid()) query.where("t.release_id = ?").bind(params.release); - if (params.mediaLibrary.isValid()) - query.where("t.media_library_id = ?").bind(params.mediaLibrary); + if (params.filters.mediaLibrary.isValid()) + query.where("t.media_library_id = ?").bind(params.filters.mediaLibrary); - if (params.label.isValid()) + if (params.filters.label.isValid()) { query.join("release_label r_l ON r_l.release_id = t.release_id"); - query.where("r_l.label_id = ?").bind(params.label); + query.where("r_l.label_id = ?").bind(params.filters.label); } } @@ -116,27 +116,27 @@ namespace lms::db .bind(SyncState::PendingRemove); } - if (params.clusters.size() == 1) + if (params.filters.clusters.size() == 1) { query.join("track_cluster t_c ON t_c.track_id = t_a_l.track_id") .where("t_c.cluster_id = ?") - .bind(params.clusters.front()); + .bind(params.filters.clusters.front()); } - else if (params.clusters.size() > 1) + else if (params.filters.clusters.size() > 1) { std::ostringstream oss; oss << "a.id IN (SELECT DISTINCT t_a_l.artist_id FROM track_artist_link t_a_l" " INNER JOIN track_cluster t_c ON t_c.track_id = t_a_l.track_id"; WhereClause clusterClause; - for (const ClusterId clusterId : params.clusters) + for (const ClusterId clusterId : params.filters.clusters) { clusterClause.Or(WhereClause("t_c.cluster_id = ?")); query.bind(clusterId); } oss << " " << clusterClause.get(); - oss << " GROUP BY t_a_l.track_id,t_a_l.artist_id HAVING COUNT(DISTINCT t_c.cluster_id) = " << params.clusters.size() << ")"; + oss << " GROUP BY t_a_l.track_id,t_a_l.artist_id HAVING COUNT(DISTINCT t_c.cluster_id) = " << params.filters.clusters.size() << ")"; query.where(oss.str()); } diff --git a/src/libs/database/impl/Listen.cpp b/src/libs/database/impl/Listen.cpp index 0bf51cdb..6704496f 100644 --- a/src/libs/database/impl/Listen.cpp +++ b/src/libs/database/impl/Listen.cpp @@ -42,38 +42,38 @@ namespace lms::db assert(!params.artist.isValid()); // poor check - if (params.library.isValid() || params.label.isValid()) + if (params.filters.mediaLibrary.isValid() || params.filters.label.isValid()) { query.join("track t ON t.id = t_a_l.track_id"); } - if (params.library.isValid()) - query.where("t.media_library_id = ?").bind(params.library); + if (params.filters.mediaLibrary.isValid()) + query.where("t.media_library_id = ?").bind(params.filters.mediaLibrary); - if (params.label.isValid()) + if (params.filters.label.isValid()) { query.join("release_label r_l ON t.release_id = r_l.release_id"); - query.where("r_l.label_id = ?").bind(params.label); + query.where("r_l.label_id = ?").bind(params.filters.label); } if (params.linkType) query.where("t_a_l.type = ?").bind(*params.linkType); - if (!params.clusters.empty()) + if (!params.filters.clusters.empty()) { std::ostringstream oss; oss << "a.id IN (SELECT DISTINCT t_a_l.artist_id FROM track_artist_link t_a_l" " INNER JOIN track_cluster t_c ON t_c.track_id = t_a_l.track_id"; WhereClause clusterClause; - for (auto id : params.clusters) + for (const db::ClusterId id : params.filters.clusters) { clusterClause.Or(WhereClause("t_c.cluster_id = ?")); query.bind(id); } oss << " " << clusterClause.get(); - oss << " GROUP BY t_a_l.track_id,t_a_l.artist_id HAVING COUNT(DISTINCT t_c.cluster_id) = " << params.clusters.size() << ")"; + oss << " GROUP BY t_a_l.track_id,t_a_l.artist_id HAVING COUNT(DISTINCT t_c.cluster_id) = " << params.filters.clusters.size() << ")"; query.where(oss.str()); } @@ -118,16 +118,16 @@ namespace lms::db .bind(params.artist); } - if (params.library.isValid()) - query.where("t.media_library_id = ?").bind(params.library); + if (params.filters.mediaLibrary.isValid()) + query.where("t.media_library_id = ?").bind(params.filters.mediaLibrary); - if (params.label.isValid()) + if (params.filters.label.isValid()) { query.join("release_label r_l ON r_l.release_id = r.id"); - query.where("r_l.label_id = ?").bind(params.label); + query.where("r_l.label_id = ?").bind(params.filters.label); } - if (!params.clusters.empty()) + if (!params.filters.clusters.empty()) { std::ostringstream oss; oss << "r.id IN (SELECT DISTINCT r.id FROM release r" @@ -136,14 +136,14 @@ namespace lms::db " INNER JOIN track_cluster t_c ON t_c.track_id = t.id"; WhereClause clusterClause; - for (ClusterId id : params.clusters) + for (const ClusterId id : params.filters.clusters) { clusterClause.Or(WhereClause("c.id = ?")); query.bind(id); } oss << " " << clusterClause.get(); - oss << " GROUP BY t.id HAVING COUNT(DISTINCT c.id) = " << params.clusters.size() << ")"; + oss << " GROUP BY t.id HAVING COUNT(DISTINCT c.id) = " << params.filters.clusters.size() << ")"; query.where(oss.str()); } @@ -171,16 +171,16 @@ namespace lms::db .bind(params.artist); } - if (params.library.isValid()) - query.where("t.media_library_id = ?").bind(params.library); + if (params.filters.mediaLibrary.isValid()) + query.where("t.media_library_id = ?").bind(params.filters.mediaLibrary); - if (params.label.isValid()) + if (params.filters.label.isValid()) { query.join("release_label r_l ON r_l.release_id = t.release_id"); - query.where("r_l.label_id = ?").bind(params.label); + query.where("r_l.label_id = ?").bind(params.filters.label); } - if (!params.clusters.empty()) + if (!params.filters.clusters.empty()) { std::ostringstream oss; oss << "t.id IN (SELECT DISTINCT t.id FROM track t" @@ -188,14 +188,14 @@ namespace lms::db " INNER JOIN cluster c ON c.id = t_c.cluster_id"; WhereClause clusterClause; - for (auto id : params.clusters) + for (const ClusterId id : params.filters.clusters) { clusterClause.Or(WhereClause("c.id = ?")).bind(id.toString()); query.bind(id); } oss << " " << clusterClause.get(); - oss << " GROUP BY t.id HAVING COUNT(*) = " << params.clusters.size() << ")"; + oss << " GROUP BY t.id HAVING COUNT(*) = " << params.filters.clusters.size() << ")"; query.where(oss.str()); } diff --git a/src/libs/database/impl/Release.cpp b/src/libs/database/impl/Release.cpp index 392dc3d2..37648cf5 100644 --- a/src/libs/database/impl/Release.cpp +++ b/src/libs/database/impl/Release.cpp @@ -60,8 +60,8 @@ namespace lms::db || params.writtenAfter.isValid() || params.dateRange || params.artist.isValid() - || params.clusters.size() == 1 - || params.mediaLibrary.isValid() + || params.filters.clusters.size() == 1 + || params.filters.mediaLibrary.isValid() || params.directory.isValid() || params.parentDirectory.isValid()) { @@ -74,13 +74,13 @@ namespace lms::db query.where("d.parent_directory_id = ?").bind(params.parentDirectory); } - if (params.mediaLibrary.isValid()) - query.where("t.media_library_id = ?").bind(params.mediaLibrary); + if (params.filters.mediaLibrary.isValid()) + query.where("t.media_library_id = ?").bind(params.filters.mediaLibrary); - if (params.label.isValid()) + if (params.filters.label.isValid()) { query.join("release_label r_l ON r_l.release_id = r.id"); - query.where("r_l.label_id = ?").bind(params.label); + query.where("r_l.label_id = ?").bind(params.filters.label); } if (params.directory.isValid()) @@ -174,27 +174,27 @@ namespace lms::db } } - if (params.clusters.size() == 1) + if (params.filters.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()); + .bind(params.filters.clusters.front()); } - else if (params.clusters.size() > 1) + else if (params.filters.clusters.size() > 1) { std::ostringstream oss; oss << "r.id IN (SELECT DISTINCT t.release_id FROM track t" " INNER JOIN track_cluster t_c ON t_c.track_id = t.id"; WhereClause clusterClause; - for (const ClusterId clusterId : params.clusters) + for (const ClusterId clusterId : params.filters.clusters) { clusterClause.Or(WhereClause("t_c.cluster_id = ?")); query.bind(clusterId); } oss << " " << clusterClause.get(); - oss << " GROUP BY t.id HAVING COUNT(*) = " << params.clusters.size() << ")"; + oss << " GROUP BY t.id HAVING COUNT(*) = " << params.filters.clusters.size() << ")"; query.where(oss.str()); } diff --git a/src/libs/database/impl/Track.cpp b/src/libs/database/impl/Track.cpp index b6f6c46a..251dbef9 100644 --- a/src/libs/database/impl/Track.cpp +++ b/src/libs/database/impl/Track.cpp @@ -79,28 +79,28 @@ namespace lms::db .bind(SyncState::PendingRemove); } - if (params.clusters.size() == 1) + if (params.filters.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()); + .bind(params.filters.clusters.front()); } - else if (params.clusters.size() > 1) + else if (params.filters.clusters.size() > 1) { std::ostringstream oss; oss << "t.id IN (SELECT DISTINCT t.id FROM track t" " INNER JOIN track_cluster t_c ON t_c.track_id = t.id"; WhereClause clusterClause; - for (const ClusterId clusterId : params.clusters) + for (const ClusterId clusterId : params.filters.clusters) { clusterClause.Or(WhereClause("t_c.cluster_id = ?")); query.bind(clusterId); } oss << " " << clusterClause.get(); - oss << " GROUP BY t.id HAVING COUNT(*) = " << params.clusters.size() << ")"; + oss << " GROUP BY t.id HAVING COUNT(*) = " << params.filters.clusters.size() << ")"; query.where(oss.str()); } @@ -159,13 +159,13 @@ namespace lms::db if (params.discNumber) query.where("t.disc_number = ?").bind(*params.discNumber); - if (params.mediaLibrary.isValid()) - query.where("t.media_library_id = ?").bind(params.mediaLibrary); + if (params.filters.mediaLibrary.isValid()) + query.where("t.media_library_id = ?").bind(params.filters.mediaLibrary); - if (params.label.isValid()) + if (params.filters.label.isValid()) { query.join("release_label r_l ON r_l.release_id = t.release_id"); - query.where("r_l.label_id = ?").bind(params.label); + query.where("r_l.label_id = ?").bind(params.filters.label); } if (params.directory.isValid()) diff --git a/src/libs/database/impl/TrackList.cpp b/src/libs/database/impl/TrackList.cpp index b4bdc72a..e76bc7bb 100644 --- a/src/libs/database/impl/TrackList.cpp +++ b/src/libs/database/impl/TrackList.cpp @@ -42,7 +42,9 @@ namespace lms::db auto query{ session.getDboSession()->query("SELECT " + std::string{ itemToSelect } + " FROM tracklist t_l") }; - if (!params.clusters.empty() || params.mediaLibrary.isValid()) + if (!params.filters.clusters.empty() + || params.filters.mediaLibrary.isValid() + || params.filters.label.isValid()) { query.join("tracklist_entry t_l_e ON t_l_e.tracklist_id = t_l.id"); query.groupBy("t_l.id"); @@ -51,11 +53,20 @@ namespace lms::db for (std::string_view keyword : params.keywords) query.where("t_l.name LIKE ? ESCAPE '" ESCAPE_CHAR_STR "'").bind("%" + utils::escapeLikeKeyword(keyword) + "%"); - if (params.mediaLibrary.isValid()) + if (params.filters.mediaLibrary.isValid() + || params.filters.label.isValid()) + { query.join("track t ON t.id = t_l_e.track_id"); - if (params.mediaLibrary.isValid()) - query.where("t.media_library_id = ?").bind(params.mediaLibrary); + if (params.filters.mediaLibrary.isValid()) + query.where("t.media_library_id = ?").bind(params.filters.mediaLibrary); + + if (params.filters.label.isValid()) + { + query.join("release_label r_l ON r_l.release_id = t.release_id"); + query.where("r_l.label_id = ?").bind(params.filters.label); + } + } if (params.user.isValid()) query.where("t_l.user_id = ?").bind(params.user); @@ -68,7 +79,7 @@ namespace lms::db if (params.visibility) query.where("t_l.visibility = ?").bind(*params.visibility); - if (!params.clusters.empty()) + if (!params.filters.clusters.empty()) { std::ostringstream oss; oss << "t_l_e.track_id IN (SELECT DISTINCT t.id FROM track t" @@ -76,14 +87,14 @@ namespace lms::db " INNER JOIN cluster c ON c.id = t_c.cluster_id"; WhereClause clusterClause; - for (const ClusterId clusterId : params.clusters) + for (const ClusterId clusterId : params.filters.clusters) { clusterClause.Or(WhereClause("c.id = ?")); query.bind(clusterId); } oss << " " << clusterClause.get(); - oss << " GROUP BY t.id HAVING COUNT(*) = " << params.clusters.size() << ")"; + oss << " GROUP BY t.id HAVING COUNT(*) = " << params.filters.clusters.size() << ")"; query.where(oss.str()); } diff --git a/src/libs/database/include/database/Artist.hpp b/src/libs/database/include/database/Artist.hpp index 6f5d8d5a..c4466915 100644 --- a/src/libs/database/include/database/Artist.hpp +++ b/src/libs/database/include/database/Artist.hpp @@ -32,7 +32,7 @@ #include "core/UUID.hpp" #include "database/ArtistId.hpp" #include "database/ClusterId.hpp" -#include "database/LabelId.hpp" +#include "database/Filters.hpp" #include "database/MediaLibraryId.hpp" #include "database/Object.hpp" #include "database/ReleaseId.hpp" @@ -58,7 +58,7 @@ namespace lms::db public: struct FindParameters { - std::vector clusters; // if non empty, at least one artist that belongs to these clusters + Filters filters; std::vector keywords; // if non empty, name must match all of these keywords (on either name field OR sort name field) std::optional linkType; // if set, only artists that have produced at least one track with this link type ArtistSortMethod sortMethod{ ArtistSortMethod::None }; @@ -68,12 +68,10 @@ namespace lms::db std::optional feedbackBackend; // and for this feedback backend TrackId track; // artists involved in this track ReleaseId release; // artists involved in this release - MediaLibraryId mediaLibrary; // artists that belong to this library - LabelId label; // artists that have issued releases using this label - FindParameters& setClusters(std::span _clusters) + FindParameters& setFilters(const Filters& _filters) { - clusters.assign(std::cbegin(_clusters), std::cend(_clusters)); + filters = _filters; return *this; } FindParameters& setKeywords(const std::vector& _keywords) @@ -117,16 +115,6 @@ namespace lms::db release = _release; return *this; } - FindParameters& setMediaLibrary(MediaLibraryId _mediaLibrary) - { - mediaLibrary = _mediaLibrary; - return *this; - } - FindParameters& setLabel(LabelId _label) - { - label = _label; - return *this; - } }; Artist() = default; diff --git a/src/libs/database/include/database/Filters.hpp b/src/libs/database/include/database/Filters.hpp new file mode 100644 index 00000000..ba4301af --- /dev/null +++ b/src/libs/database/include/database/Filters.hpp @@ -0,0 +1,52 @@ +/* + * Copyright (C) 2024 Emeric Poupon + * + * This file is part of LMS. + * + * LMS is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * LMS is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with LMS. If not, see . + */ + +#pragma once + +#include + +#include "database/ClusterId.hpp" +#include "database/LabelId.hpp" +#include "database/MediaLibraryId.hpp" + +namespace lms::db +{ + struct Filters + { + MediaLibraryId mediaLibrary; // tracks that belongs to this library + std::vector clusters; // tracks that belong to all these clusters + LabelId label; // tracks which release has this label + + Filters& setClusters(std::span _clusters) + { + clusters.assign(std::cbegin(_clusters), std::cend(_clusters)); + return *this; + } + Filters& setMediaLibrary(MediaLibraryId _mediaLibrary) + { + mediaLibrary = _mediaLibrary; + return *this; + } + Filters& setLabel(LabelId _label) + { + label = _label; + return *this; + } + }; +} // namespace lms::db \ No newline at end of file diff --git a/src/libs/database/include/database/Listen.hpp b/src/libs/database/include/database/Listen.hpp index 67ebc306..dcbb32c7 100644 --- a/src/libs/database/include/database/Listen.hpp +++ b/src/libs/database/include/database/Listen.hpp @@ -25,10 +25,8 @@ #include #include "database/ArtistId.hpp" -#include "database/ClusterId.hpp" -#include "database/LabelId.hpp" +#include "database/Filters.hpp" #include "database/ListenId.hpp" -#include "database/MediaLibraryId.hpp" #include "database/Object.hpp" #include "database/ReleaseId.hpp" #include "database/TrackId.hpp" @@ -86,12 +84,10 @@ namespace lms::db { UserId user; std::optional backend; - std::vector clusters; // if non empty, entities that belong to these clusters + db::Filters filters; std::vector keywords; // if non empty, name must match all of these keywords std::optional range; ArtistId artist; // if set, matching this artist - MediaLibraryId library; - LabelId label; StatsFindParameters& setUser(UserId _user) { @@ -103,9 +99,9 @@ namespace lms::db backend = _backend; return *this; } - StatsFindParameters& setClusters(const std::vector& _clusters) + StatsFindParameters& setFilters(const db::Filters& _filters) { - clusters = _clusters; + filters = _filters; return *this; } StatsFindParameters& setKeywords(const std::vector& _keywords) @@ -123,16 +119,6 @@ namespace lms::db artist = _artist; return *this; } - StatsFindParameters& setMediaLibrary(MediaLibraryId _library) - { - library = _library; - return *this; - } - StatsFindParameters& setLabel(LabelId _label) - { - label = _label; - return *this; - } }; struct ArtistStatsFindParameters : public StatsFindParameters diff --git a/src/libs/database/include/database/Release.hpp b/src/libs/database/include/database/Release.hpp index e25a60b6..028c384d 100644 --- a/src/libs/database/include/database/Release.hpp +++ b/src/libs/database/include/database/Release.hpp @@ -20,7 +20,6 @@ #pragma once #include -#include #include #include #include @@ -32,9 +31,9 @@ #include "core/PartialDateTime.hpp" #include "core/UUID.hpp" #include "database/ArtistId.hpp" -#include "database/ClusterId.hpp" #include "database/CountryId.hpp" #include "database/DirectoryId.hpp" +#include "database/Filters.hpp" #include "database/LabelId.hpp" #include "database/MediaLibraryId.hpp" #include "database/Object.hpp" @@ -153,7 +152,7 @@ namespace lms::db public: struct FindParameters { - std::vector clusters; // if non empty, releases that belong to these clusters + Filters filters; std::vector keywords; // if non empty, name must match all of these keywords (cannot be set with keywords) std::string name; // must match this name (cannot be set with keywords) ReleaseSortMethod sortMethod{ ReleaseSortMethod::None }; @@ -166,14 +165,12 @@ namespace lms::db core::EnumSet trackArtistLinkTypes; // and for these link types core::EnumSet excludedTrackArtistLinkTypes; // but not for these link types std::string releaseType; // If set, albums that has this release type - MediaLibraryId mediaLibrary; // If set, releases that has at least a track in this library - LabelId label; // If set, releases that has this label DirectoryId directory; // if set, releases in this directory (cannot be set with parent directory) DirectoryId parentDirectory; // if set, releases in this parent directory (cannot be set with directory) - FindParameters& setClusters(std::span _clusters) + FindParameters& setFilters(const Filters& _filters) { - clusters.assign(std::cbegin(_clusters), std::cend(_clusters)); + filters = _filters; return *this; } FindParameters& setKeywords(const std::vector& _keywords) @@ -224,16 +221,6 @@ namespace lms::db releaseType = _releaseType; return *this; } - FindParameters& setMediaLibrary(MediaLibraryId _mediaLibrary) - { - mediaLibrary = _mediaLibrary; - return *this; - } - FindParameters& setLabel(LabelId _label) - { - label = _label; - return *this; - } FindParameters& setDirectory(DirectoryId _directory) { directory = _directory; diff --git a/src/libs/database/include/database/Track.hpp b/src/libs/database/include/database/Track.hpp index f9929056..3c0c978b 100644 --- a/src/libs/database/include/database/Track.hpp +++ b/src/libs/database/include/database/Track.hpp @@ -23,7 +23,6 @@ #include #include #include -#include #include #include #include @@ -38,7 +37,7 @@ #include "database/ArtistId.hpp" #include "database/ClusterId.hpp" #include "database/DirectoryId.hpp" -#include "database/LabelId.hpp" +#include "database/Filters.hpp" #include "database/MediaLibraryId.hpp" #include "database/Object.hpp" #include "database/ReleaseId.hpp" @@ -66,7 +65,7 @@ namespace lms::db public: struct FindParameters { - std::vector clusters; // if non empty, tracks that belong to these clusters + Filters filters; std::vector keywords; // if non empty, name must match all of these keywords std::string name; // if non empty, must match this name (title) std::string fileStem; // if non empty, must match this file stem @@ -85,14 +84,12 @@ namespace lms::db TrackListId trackList; // matching this trackList std::optional trackNumber; // matching this track number std::optional discNumber; // matching this disc number - MediaLibraryId mediaLibrary; // If set, tracks in this library - LabelId label; // If set, tracks that belongs to a release with this label DirectoryId directory; // if set, tracks in this directory std::optional hasEmbeddedImage; // if set, tracks that have or not embedded images - FindParameters& setClusters(std::span _clusters) + FindParameters& setFilters(const Filters& _filters) { - clusters.assign(std::cbegin(_clusters), std::cend(_clusters)); + filters = _filters; return *this; } FindParameters& setKeywords(const std::vector& _keywords) @@ -179,16 +176,6 @@ namespace lms::db discNumber = _discNumber; return *this; } - FindParameters& setMediaLibrary(MediaLibraryId _mediaLibrary) - { - mediaLibrary = _mediaLibrary; - return *this; - } - FindParameters& setLabel(LabelId _label) - { - label = _label; - return *this; - } FindParameters& setDirectory(DirectoryId _directory) { directory = _directory; diff --git a/src/libs/database/include/database/TrackList.hpp b/src/libs/database/include/database/TrackList.hpp index 6478c894..57c10b7c 100644 --- a/src/libs/database/include/database/TrackList.hpp +++ b/src/libs/database/include/database/TrackList.hpp @@ -20,7 +20,6 @@ #pragma once #include -#include #include #include #include @@ -28,8 +27,7 @@ #include #include -#include "database/ClusterId.hpp" -#include "database/MediaLibraryId.hpp" +#include "database/Filters.hpp" #include "database/Object.hpp" #include "database/TrackId.hpp" #include "database/TrackListId.hpp" @@ -62,19 +60,18 @@ namespace lms::db // Search utility struct FindParameters { - std::vector clusters; // if non empty, tracklists that have tracks that belong to these clusters + Filters filters; std::vector keywords; // if non empty, name must match all of these keywords (on either name field OR sort name field) std::optional range; std::optional type; - UserId user; // only tracklists owned by this user - UserId excludedUser; // only tracklists *not* owned by this user - MediaLibraryId mediaLibrary; // only tracklists that have songs in this media library + UserId user; // only tracklists owned by this user + UserId excludedUser; // only tracklists *not* owned by this user TrackListSortMethod sortMethod{ TrackListSortMethod::None }; std::optional visibility; - FindParameters& setClusters(std::span _clusters) + FindParameters& setFilters(const Filters& _filters) { - clusters.assign(std::cbegin(_clusters), std::cend(_clusters)); + filters = _filters; return *this; } FindParameters& setKeywords(const std::vector& _keywords) @@ -103,11 +100,6 @@ namespace lms::db return *this; } - FindParameters& setMediaLibrary(MediaLibraryId _mediaLibrary) - { - mediaLibrary = _mediaLibrary; - return *this; - } FindParameters& setSortMethod(TrackListSortMethod _sortMethod) { sortMethod = _sortMethod; diff --git a/src/libs/database/test/Artist.cpp b/src/libs/database/test/Artist.cpp index 04395c36..14eb143d 100644 --- a/src/libs/database/test/Artist.cpp +++ b/src/libs/database/test/Artist.cpp @@ -324,13 +324,13 @@ namespace lms::db::tests } { auto transaction{ session.createReadTransaction() }; - auto artists{ Artist::findIds(session, Artist::FindParameters{}.setMediaLibrary(library->getId())) }; + auto artists{ Artist::findIds(session, Artist::FindParameters{}.setFilters(Filters{}.setMediaLibrary(library->getId()))) }; ASSERT_EQ(artists.results.size(), 1); EXPECT_EQ(artists.results.front(), artist.getId()); } { auto transaction{ session.createReadTransaction() }; - auto artists{ Artist::findIds(session, Artist::FindParameters{}.setMediaLibrary(otherLibrary->getId())) }; + auto artists{ Artist::findIds(session, Artist::FindParameters{}.setFilters(Filters{}.setMediaLibrary(otherLibrary->getId()))) }; EXPECT_EQ(artists.results.size(), 0); } } diff --git a/src/libs/database/test/Cluster.cpp b/src/libs/database/test/Cluster.cpp index 102e4f2d..20019ccb 100644 --- a/src/libs/database/test/Cluster.cpp +++ b/src/libs/database/test/Cluster.cpp @@ -201,11 +201,11 @@ namespace lms::db::tests { auto transaction{ session.createReadTransaction() }; - auto tracks{ Track::findIds(session, Track::FindParameters{}.setClusters(std::initializer_list{ cluster1.getId() })) }; + auto tracks{ Track::findIds(session, Track::FindParameters{}.setFilters(Filters{}.setClusters(std::initializer_list{ cluster1.getId() }))) }; ASSERT_EQ(tracks.results.size(), 1); EXPECT_EQ(tracks.results.front(), track.getId()); - tracks = Track::findIds(session, Track::FindParameters{}.setClusters(std::initializer_list{ cluster2.getId() })); + tracks = Track::findIds(session, Track::FindParameters{}.setFilters(Filters{}.setClusters(std::initializer_list{ cluster2.getId() }))); EXPECT_EQ(tracks.results.size(), 0); } @@ -235,7 +235,7 @@ namespace lms::db::tests { auto transaction{ session.createReadTransaction() }; - const auto tracks{ Track::findIds(session, Track::FindParameters{}.setClusters(clusterIds)) }; + const auto tracks{ Track::findIds(session, Track::FindParameters{}.setFilters(Filters{}.setClusters(clusterIds))) }; EXPECT_EQ(tracks.results.size(), 0); } @@ -248,7 +248,7 @@ namespace lms::db::tests { auto transaction{ session.createReadTransaction() }; - const auto tracks{ Track::findIds(session, Track::FindParameters{}.setClusters(clusterIds)) }; + const auto tracks{ Track::findIds(session, Track::FindParameters{}.setFilters(Filters{}.setClusters(clusterIds))) }; EXPECT_EQ(tracks.results.size(), 0); EXPECT_EQ(Cluster::computeTrackCount(session, cluster1.getId()), 1); EXPECT_EQ(Cluster::computeTrackCount(session, cluster2.getId()), 0); @@ -263,7 +263,7 @@ namespace lms::db::tests { auto transaction{ session.createReadTransaction() }; - const auto tracks{ Track::findIds(session, Track::FindParameters{}.setClusters(clusterIds)) }; + const auto tracks{ Track::findIds(session, Track::FindParameters{}.setFilters(Filters{}.setClusters(clusterIds))) }; ASSERT_EQ(tracks.results.size(), 1); EXPECT_EQ(tracks.results.front(), track.getId()); EXPECT_EQ(Cluster::computeTrackCount(session, cluster1.getId()), 1); @@ -376,7 +376,7 @@ namespace lms::db::tests { auto transaction{ session.createReadTransaction() }; ASSERT_EQ(Cluster::findOrphanIds(session).results.size(), 2); - EXPECT_EQ(Release::find(session, Release::FindParameters{}.setClusters(std::initializer_list{ unusedCluster.getId() })).results.size(), 0); + EXPECT_EQ(Release::find(session, Release::FindParameters{}.setFilters(Filters{}.setClusters(std::initializer_list{ unusedCluster.getId() }))).results.size(), 0); EXPECT_EQ(Release::find(session, Release::FindParameters{}).results.size(), 1); EXPECT_EQ(Cluster::computeReleaseCount(session, cluster.getId()), 0); EXPECT_EQ(Cluster::computeReleaseCount(session, unusedCluster.getId()), 0); @@ -412,7 +412,7 @@ namespace lms::db::tests { auto transaction{ session.createReadTransaction() }; - const auto releases{ Release::findIds(session, Release::FindParameters{}.setClusters(std::initializer_list{ cluster.getId() })) }; + const auto releases{ Release::findIds(session, Release::FindParameters{}.setFilters(Filters{}.setClusters(std::initializer_list{ cluster.getId() }))) }; ASSERT_EQ(releases.results.size(), 1); EXPECT_EQ(releases.results.front(), release.getId()); } @@ -420,7 +420,7 @@ namespace lms::db::tests { auto transaction{ session.createReadTransaction() }; - const auto releases{ Release::findIds(session, Release::FindParameters{}.setClusters(std::initializer_list{ unusedCluster.getId() })) }; + const auto releases{ Release::findIds(session, Release::FindParameters{}.setFilters(Filters{}.setClusters(std::initializer_list{ unusedCluster.getId() }))) }; EXPECT_EQ(releases.results.size(), 0); } @@ -466,12 +466,12 @@ namespace lms::db::tests { auto transaction{ session.createWriteTransaction() }; - auto artists{ Artist::findIds(session, Artist::FindParameters{}.setClusters(std::initializer_list{ cluster1.getId() })) }; + auto artists{ Artist::findIds(session, Artist::FindParameters{}.setFilters(Filters{}.setClusters(std::initializer_list{ cluster1.getId() }))) }; ASSERT_EQ(artists.results.size(), 1); EXPECT_EQ(artists.results.front(), artist.getId()); - EXPECT_EQ(Artist::findIds(session, Artist::FindParameters{}.setClusters(std::initializer_list{ cluster2.getId() })).results.size(), 0); - EXPECT_EQ(Artist::findIds(session, Artist::FindParameters{}.setClusters(std::initializer_list{ cluster3.getId() })).results.size(), 0); + EXPECT_EQ(Artist::findIds(session, Artist::FindParameters{}.setFilters(Filters{}.setClusters(std::initializer_list{ cluster2.getId() }))).results.size(), 0); + EXPECT_EQ(Artist::findIds(session, Artist::FindParameters{}.setFilters(Filters{}.setClusters(std::initializer_list{ cluster3.getId() }))).results.size(), 0); cluster2.get().modify()->addTrack(track.get()); } @@ -479,19 +479,19 @@ namespace lms::db::tests { auto transaction{ session.createReadTransaction() }; - auto artists{ Artist::findIds(session, Artist::FindParameters{}.setClusters(std::initializer_list{ cluster1.getId() })) }; + auto artists{ Artist::findIds(session, Artist::FindParameters{}.setFilters(Filters{}.setClusters(std::initializer_list{ cluster1.getId() }))) }; ASSERT_EQ(artists.results.size(), 1); EXPECT_EQ(artists.results.front(), artist.getId()); - artists = Artist::findIds(session, Artist::FindParameters{}.setClusters(std::initializer_list{ cluster2.getId() })); + artists = Artist::findIds(session, Artist::FindParameters{}.setFilters(Filters{}.setClusters(std::initializer_list{ cluster2.getId() }))); ASSERT_EQ(artists.results.size(), 1); EXPECT_EQ(artists.results.front(), artist.getId()); - artists = Artist::findIds(session, Artist::FindParameters{}.setClusters(std::initializer_list{ cluster1.getId() })); + artists = Artist::findIds(session, Artist::FindParameters{}.setFilters(Filters{}.setClusters(std::initializer_list{ cluster1.getId() }))); ASSERT_EQ(artists.results.size(), 1); EXPECT_EQ(artists.results.front(), artist.getId()); - EXPECT_EQ(Artist::findIds(session, Artist::FindParameters{}.setClusters(std::initializer_list{ cluster3.getId() })).results.size(), 0); + EXPECT_EQ(Artist::findIds(session, Artist::FindParameters{}.setFilters(Filters{}.setClusters(std::initializer_list{ cluster3.getId() }))).results.size(), 0); } } @@ -520,7 +520,7 @@ namespace lms::db::tests { auto transaction{ session.createReadTransaction() }; - auto artists{ Artist::findIds(session, Artist::FindParameters{}.setClusters(std::initializer_list{ cluster.getId() })) }; + auto artists{ Artist::findIds(session, Artist::FindParameters{}.setFilters(Filters{}.setClusters(std::initializer_list{ cluster.getId() }))) }; ASSERT_EQ(artists.results.size(), 1); EXPECT_EQ(artists.results.front(), artist.getId()); } @@ -562,7 +562,7 @@ namespace lms::db::tests std::vector clusterIds; std::transform(std::cbegin(clusters), std::cend(clusters), std::back_inserter(clusterIds), [](const ScopedCluster& cluster) { return cluster.getId(); }); - auto artists{ Artist::findIds(session, Artist::FindParameters{}.setClusters(clusterIds)) }; + auto artists{ Artist::findIds(session, Artist::FindParameters{}.setFilters(Filters{}.setClusters(clusterIds))) }; ASSERT_EQ(artists.results.size(), 1); EXPECT_EQ(artists.results.front(), artist.getId()); } @@ -671,7 +671,7 @@ namespace lms::db::tests { auto transaction{ session.createReadTransaction() }; - auto artists{ Artist::findIds(session, Artist::FindParameters{}.setClusters(std::initializer_list{ cluster.getId() })) }; + auto artists{ Artist::findIds(session, Artist::FindParameters{}.setFilters(Filters{}.setClusters(std::initializer_list{ cluster.getId() }))) }; ASSERT_EQ(artists.results.size(), 1); EXPECT_EQ(artists.results.front(), artist.getId()); @@ -679,7 +679,7 @@ namespace lms::db::tests ASSERT_EQ(releases.results.size(), 1); EXPECT_EQ(releases.results.front(), release.getId()); - releases = Release::findIds(session, Release::FindParameters{}.setArtist(artist.getId()).setClusters(std::initializer_list{ cluster.getId() })); + releases = Release::findIds(session, Release::FindParameters{}.setArtist(artist.getId()).setFilters(Filters{}.setClusters(std::initializer_list{ cluster.getId() }))); ASSERT_EQ(releases.results.size(), 1); EXPECT_EQ(releases.results.front(), release.getId()); } @@ -710,7 +710,7 @@ namespace lms::db::tests ASSERT_EQ(releases.results.size(), 1); EXPECT_EQ(releases.results.front(), release.getId()); - releases = Release::findIds(session, Release::FindParameters{}.setArtist(artist.getId()).setClusters(std::initializer_list{ cluster1.getId(), cluster2.getId() })); + releases = Release::findIds(session, Release::FindParameters{}.setArtist(artist.getId()).setFilters(Filters{}.setClusters(std::initializer_list{ cluster1.getId(), cluster2.getId() }))); ASSERT_EQ(releases.results.size(), 1); EXPECT_EQ(releases.results.front(), release.getId()); } diff --git a/src/libs/database/test/Listen.cpp b/src/libs/database/test/Listen.cpp index dd0c2cde..1e6d8adc 100644 --- a/src/libs/database/test/Listen.cpp +++ b/src/libs/database/test/Listen.cpp @@ -216,7 +216,7 @@ namespace lms::db::tests Listen::ArtistStatsFindParameters params; params.setUser(user->getId()); params.setScrobblingBackend(ScrobblingBackend::Internal); - params.setClusters({ cluster->getId() }); + params.filters.setClusters(std::initializer_list{ cluster->getId() }); auto artists{ Listen::getTopArtists(session, params) }; EXPECT_EQ(artists.results.size(), 0); @@ -313,7 +313,7 @@ namespace lms::db::tests Listen::ArtistStatsFindParameters params; params.setUser(user->getId()); params.setScrobblingBackend(ScrobblingBackend::Internal); - params.setClusters({ cluster.getId() }); + params.filters.setClusters(std::initializer_list{ cluster.getId() }); auto artists{ Listen::getTopArtists(session, params) }; ASSERT_EQ(artists.results.size(), 0); @@ -328,7 +328,7 @@ namespace lms::db::tests Listen::ArtistStatsFindParameters params; params.setUser(user->getId()); params.setScrobblingBackend(ScrobblingBackend::Internal); - params.setClusters({ cluster.getId() }); + params.filters.setClusters(std::initializer_list{ cluster.getId() }); auto artists{ Listen::getTopArtists(session, params) }; ASSERT_EQ(artists.results.size(), 1); @@ -352,7 +352,7 @@ namespace lms::db::tests Listen::ArtistStatsFindParameters params; params.setUser(user.getId()); params.setScrobblingBackend(ScrobblingBackend::Internal); - params.setMediaLibrary(library.getId()); + params.filters.setMediaLibrary(library.getId()); const auto artists{ Listen::getTopArtists(session, params) }; EXPECT_EQ(artists.results.size(), 0); @@ -383,7 +383,7 @@ namespace lms::db::tests Listen::ArtistStatsFindParameters params; params.setUser(user.getId()); params.setScrobblingBackend(ScrobblingBackend::Internal); - params.setMediaLibrary(library.getId()); + params.filters.setMediaLibrary(library.getId()); auto artists{ Listen::getTopArtists(session, params) }; ASSERT_EQ(artists.results.size(), 1); @@ -395,7 +395,7 @@ namespace lms::db::tests Listen::ArtistStatsFindParameters params; params.setUser(user.getId()); params.setScrobblingBackend(ScrobblingBackend::Internal); - params.setMediaLibrary(otherLibrary.getId()); + params.filters.setMediaLibrary(otherLibrary.getId()); auto artists{ Listen::getTopArtists(session, params) }; EXPECT_EQ(artists.results.size(), 0); @@ -533,7 +533,7 @@ namespace lms::db::tests Listen::StatsFindParameters params; params.setUser(user->getId()); params.setScrobblingBackend(ScrobblingBackend::Internal); - params.setClusters({ cluster.getId() }); + params.filters.setClusters(std::initializer_list{ cluster.getId() }); auto releases{ Listen::getTopReleases(session, params) }; EXPECT_EQ(releases.results.size(), 0); @@ -549,7 +549,7 @@ namespace lms::db::tests Listen::StatsFindParameters params; params.setUser(user->getId()); params.setScrobblingBackend(ScrobblingBackend::Internal); - params.setClusters({ cluster.getId() }); + params.filters.setClusters(std::initializer_list{ cluster.getId() }); auto releases{ Listen::getTopReleases(session, params) }; EXPECT_EQ(releases.results.size(), 1); @@ -578,7 +578,7 @@ namespace lms::db::tests Listen::StatsFindParameters params; params.setUser(user->getId()); params.setScrobblingBackend(ScrobblingBackend::Internal); - params.setMediaLibrary(library.getId()); + params.filters.setMediaLibrary(library.getId()); auto releases{ Listen::getTopReleases(session, params) }; EXPECT_EQ(releases.moreResults, false); @@ -593,7 +593,7 @@ namespace lms::db::tests Listen::StatsFindParameters params; params.setUser(user->getId()); params.setScrobblingBackend(ScrobblingBackend::Internal); - params.setMediaLibrary(library.getId()); + params.filters.setMediaLibrary(library.getId()); auto releases{ Listen::getTopReleases(session, params) }; EXPECT_EQ(releases.moreResults, false); @@ -606,7 +606,7 @@ namespace lms::db::tests Listen::StatsFindParameters params; params.setUser(user->getId()); params.setScrobblingBackend(ScrobblingBackend::Internal); - params.setMediaLibrary(otherLibrary.getId()); + params.filters.setMediaLibrary(otherLibrary.getId()); auto releases{ Listen::getTopReleases(session, params) }; EXPECT_EQ(releases.moreResults, false); @@ -780,7 +780,7 @@ namespace lms::db::tests Listen::StatsFindParameters params; params.setUser(user->getId()); params.setScrobblingBackend(ScrobblingBackend::Internal); - params.setClusters({ cluster.getId() }); + params.filters.setClusters(std::initializer_list{ cluster.getId() }); auto tracks{ Listen::getTopTracks(session, params) }; EXPECT_EQ(tracks.results.size(), 0); @@ -796,7 +796,7 @@ namespace lms::db::tests Listen::StatsFindParameters params; params.setUser(user->getId()); params.setScrobblingBackend(ScrobblingBackend::Internal); - params.setClusters({ cluster.getId() }); + params.filters.setClusters(std::initializer_list{ cluster.getId() }); auto tracks{ Listen::getTopTracks(session, params) }; EXPECT_EQ(tracks.results.size(), 1); @@ -818,7 +818,7 @@ namespace lms::db::tests Listen::StatsFindParameters params; params.setUser(user.getId()); params.setScrobblingBackend(ScrobblingBackend::Internal); - params.setMediaLibrary(library.getId()); + params.filters.setMediaLibrary(library.getId()); auto tracks{ Listen::getTopTracks(session, params) }; EXPECT_EQ(tracks.moreResults, false); @@ -838,7 +838,7 @@ namespace lms::db::tests Listen::StatsFindParameters params; params.setUser(user->getId()); params.setScrobblingBackend(ScrobblingBackend::Internal); - params.setMediaLibrary(library.getId()); + params.filters.setMediaLibrary(library.getId()); auto tracks{ Listen::getTopTracks(session, params) }; EXPECT_EQ(tracks.moreResults, false); @@ -851,7 +851,7 @@ namespace lms::db::tests Listen::StatsFindParameters params; params.setUser(user->getId()); params.setScrobblingBackend(ScrobblingBackend::Internal); - params.setMediaLibrary(otherLibrary.getId()); + params.filters.setMediaLibrary(otherLibrary.getId()); auto tracks{ Listen::getTopTracks(session, params) }; EXPECT_EQ(tracks.moreResults, false); @@ -927,7 +927,7 @@ namespace lms::db::tests Listen::ArtistStatsFindParameters params; params.setUser(user->getId()); params.setScrobblingBackend(ScrobblingBackend::Internal); - params.setClusters({ cluster->getId() }); + params.filters.setClusters(std::initializer_list{ cluster->getId() }); auto artists{ Listen::getRecentArtists(session, params) }; EXPECT_EQ(artists.results.size(), 0); @@ -1023,7 +1023,7 @@ namespace lms::db::tests Listen::ArtistStatsFindParameters params; params.setUser(user->getId()); params.setScrobblingBackend(ScrobblingBackend::Internal); - params.setClusters({ cluster.getId() }); + params.filters.setClusters(std::initializer_list{ cluster.getId() }); auto artists{ Listen::getRecentArtists(session, params) }; ASSERT_EQ(artists.results.size(), 0); @@ -1038,7 +1038,7 @@ namespace lms::db::tests Listen::ArtistStatsFindParameters params; params.setUser(user->getId()); params.setScrobblingBackend(ScrobblingBackend::Internal); - params.setClusters({ cluster.getId() }); + params.filters.setClusters(std::initializer_list{ cluster.getId() }); auto artists{ Listen::getRecentArtists(session, params) }; ASSERT_EQ(artists.results.size(), 1); @@ -1067,7 +1067,7 @@ namespace lms::db::tests auto transaction{ session.createReadTransaction() }; Listen::ArtistStatsFindParameters params; - params.setMediaLibrary(library.getId()); + params.filters.setMediaLibrary(library.getId()); auto artists{ Listen::getRecentArtists(session, params) }; ASSERT_EQ(artists.results.size(), 1); @@ -1077,7 +1077,7 @@ namespace lms::db::tests auto transaction{ session.createReadTransaction() }; Listen::ArtistStatsFindParameters params; - params.setMediaLibrary(otherLibrary.getId()); + params.filters.setMediaLibrary(otherLibrary.getId()); auto artists{ Listen::getRecentArtists(session, params) }; EXPECT_EQ(artists.results.size(), 0); @@ -1281,7 +1281,7 @@ namespace lms::db::tests Listen::StatsFindParameters params; params.setUser(user->getId()); params.setScrobblingBackend(ScrobblingBackend::Internal); - params.setClusters({ cluster.getId() }); + params.filters.setClusters(std::initializer_list{ cluster.getId() }); auto releases{ Listen::getRecentReleases(session, params) }; EXPECT_EQ(releases.results.size(), 0); @@ -1296,7 +1296,7 @@ namespace lms::db::tests Listen::StatsFindParameters params; params.setUser(user->getId()); params.setScrobblingBackend(ScrobblingBackend::Internal); - params.setClusters({ cluster.getId() }); + params.filters.setClusters(std::initializer_list{ cluster.getId() }); auto releases{ Listen::getRecentReleases(session, params) }; EXPECT_EQ(releases.results.size(), 0); @@ -1312,7 +1312,7 @@ namespace lms::db::tests Listen::StatsFindParameters params; params.setUser(user->getId()); params.setScrobblingBackend(ScrobblingBackend::Internal); - params.setClusters({ cluster.getId() }); + params.filters.setClusters(std::initializer_list{ cluster.getId() }); auto releases{ Listen::getRecentReleases(session, params) }; EXPECT_EQ(releases.results.size(), 1); @@ -1341,7 +1341,7 @@ namespace lms::db::tests auto transaction{ session.createReadTransaction() }; Listen::StatsFindParameters params; - params.setMediaLibrary(library.getId()); + params.filters.setMediaLibrary(library.getId()); auto releases{ Listen::getRecentReleases(session, params) }; EXPECT_EQ(releases.moreResults, false); @@ -1352,7 +1352,7 @@ namespace lms::db::tests auto transaction{ session.createReadTransaction() }; Listen::StatsFindParameters params; - params.setMediaLibrary(otherLibrary.getId()); + params.filters.setMediaLibrary(otherLibrary.getId()); auto releases{ Listen::getRecentReleases(session, params) }; EXPECT_EQ(releases.moreResults, false); @@ -1425,7 +1425,7 @@ namespace lms::db::tests auto transaction{ session.createReadTransaction() }; Listen::StatsFindParameters params; - params.setMediaLibrary(library.getId()); + params.filters.setMediaLibrary(library.getId()); auto tracks{ Listen::getRecentTracks(session, params) }; EXPECT_EQ(tracks.moreResults, false); @@ -1437,7 +1437,7 @@ namespace lms::db::tests auto transaction{ session.createReadTransaction() }; Listen::StatsFindParameters params; - params.setMediaLibrary(otherLibrary.getId()); + params.filters.setMediaLibrary(otherLibrary.getId()); auto tracks{ Listen::getRecentTracks(session, params) }; EXPECT_EQ(tracks.moreResults, false); @@ -1655,7 +1655,7 @@ namespace lms::db::tests Listen::StatsFindParameters params; params.setUser(user->getId()); params.setScrobblingBackend(ScrobblingBackend::Internal); - params.setClusters({ cluster.getId() }); + params.filters.setClusters(std::initializer_list{ cluster.getId() }); auto tracks{ Listen::getRecentTracks(session, params) }; EXPECT_EQ(tracks.results.size(), 0); @@ -1671,7 +1671,7 @@ namespace lms::db::tests Listen::StatsFindParameters params; params.setUser(user->getId()); params.setScrobblingBackend(ScrobblingBackend::Internal); - params.setClusters({ cluster.getId() }); + params.filters.setClusters(std::initializer_list{ cluster.getId() }); auto tracks{ Listen::getRecentTracks(session, params) }; EXPECT_EQ(tracks.results.size(), 1); diff --git a/src/libs/database/test/Release.cpp b/src/libs/database/test/Release.cpp index 5279f8d5..a337e4ac 100644 --- a/src/libs/database/test/Release.cpp +++ b/src/libs/database/test/Release.cpp @@ -246,13 +246,13 @@ namespace lms::db::tests } { auto transaction{ session.createReadTransaction() }; - auto releases{ Release::findIds(session, Release::FindParameters{}.setMediaLibrary(library->getId())) }; + auto releases{ Release::findIds(session, Release::FindParameters{}.setFilters(Filters{}.setMediaLibrary(library->getId()))) }; ASSERT_EQ(releases.results.size(), 1); EXPECT_EQ(releases.results.front(), release.getId()); } { auto transaction{ session.createReadTransaction() }; - auto releases{ Release::findIds(session, Release::FindParameters{}.setMediaLibrary(otherLibrary->getId())) }; + auto releases{ Release::findIds(session, Release::FindParameters{}.setFilters(Filters{}.setMediaLibrary(otherLibrary->getId()))) }; EXPECT_EQ(releases.results.size(), 0); } } diff --git a/src/libs/database/test/Track.cpp b/src/libs/database/test/Track.cpp index 392c2df0..8d65c4ba 100644 --- a/src/libs/database/test/Track.cpp +++ b/src/libs/database/test/Track.cpp @@ -170,13 +170,13 @@ namespace lms::db::tests { auto transaction{ session.createReadTransaction() }; - const auto tracks{ Track::findIds(session, Track::FindParameters{}.setMediaLibrary(library->getId())) }; + const auto tracks{ Track::findIds(session, Track::FindParameters{}.setFilters(Filters{}.setMediaLibrary(library->getId()))) }; ASSERT_EQ(tracks.results.size(), 1); EXPECT_EQ(tracks.results.front(), track.getId()); } { auto transaction{ session.createReadTransaction() }; - const auto tracks{ Track::findIds(session, Track::FindParameters{}.setMediaLibrary(otherLibrary->getId())) }; + const auto tracks{ Track::findIds(session, Track::FindParameters{}.setFilters(Filters{}.setMediaLibrary(otherLibrary->getId()))) }; EXPECT_EQ(tracks.results.size(), 0); } } diff --git a/src/libs/database/test/TrackList.cpp b/src/libs/database/test/TrackList.cpp index 1b4d705b..36aaacf4 100644 --- a/src/libs/database/test/TrackList.cpp +++ b/src/libs/database/test/TrackList.cpp @@ -176,7 +176,7 @@ namespace lms::db::tests { auto transaction{ session.createReadTransaction() }; std::vector visitedTrackLists; - TrackList::find(session, TrackList::FindParameters{}.setMediaLibrary(library->getId()), [&](const TrackList::pointer& trackList) { + TrackList::find(session, TrackList::FindParameters{}.setFilters(Filters{}.setMediaLibrary(library->getId())), [&](const TrackList::pointer& trackList) { visitedTrackLists.push_back(trackList->getId()); }); ASSERT_EQ(visitedTrackLists.size(), 1); @@ -195,7 +195,7 @@ namespace lms::db::tests { auto transaction{ session.createReadTransaction() }; - auto trackLists{ TrackList::find(session, TrackList::FindParameters{}.setClusters(std::initializer_list{ cluster.getId() })) }; + auto trackLists{ TrackList::find(session, TrackList::FindParameters{}.setFilters(Filters{}.setClusters(std::initializer_list{ cluster.getId() }))) }; EXPECT_EQ(trackLists.results.size(), 0); } @@ -209,7 +209,7 @@ namespace lms::db::tests { auto transaction{ session.createReadTransaction() }; - auto trackLists{ TrackList::find(session, TrackList::FindParameters{}.setClusters(std::initializer_list{ cluster.getId() })) }; + auto trackLists{ TrackList::find(session, TrackList::FindParameters{}.setFilters(Filters{}.setClusters(std::initializer_list{ cluster.getId() }))) }; ASSERT_EQ(trackLists.results.size(), 1); EXPECT_EQ(trackLists.results.front(), trackList1.getId()); } diff --git a/src/libs/services/feedback/impl/FeedbackService.cpp b/src/libs/services/feedback/impl/FeedbackService.cpp index f7a739c6..448234d8 100644 --- a/src/libs/services/feedback/impl/FeedbackService.cpp +++ b/src/libs/services/feedback/impl/FeedbackService.cpp @@ -97,14 +97,12 @@ namespace lms::feedback return {}; Artist::FindParameters searchParams; + searchParams.setFilters(params.filters); searchParams.setStarringUser(params.user, *backend); - searchParams.setClusters(params.clusters); searchParams.setKeywords(params.keywords); searchParams.setLinkType(params.linkType); searchParams.setSortMethod(params.sortMethod); searchParams.setRange(params.range); - searchParams.setMediaLibrary(params.library); - searchParams.setLabel(params.label); Session& session{ _db.getTLSSession() }; auto transaction{ session.createReadTransaction() }; @@ -150,12 +148,10 @@ namespace lms::feedback Release::FindParameters searchParams; searchParams.setStarringUser(params.user, *backend); - searchParams.setClusters(params.clusters); + searchParams.setFilters(params.filters); searchParams.setKeywords(params.keywords); searchParams.setSortMethod(ReleaseSortMethod::StarredDateDesc); searchParams.setRange(params.range); - searchParams.setMediaLibrary(params.library); - searchParams.setLabel(params.label); Session& session{ _db.getTLSSession() }; auto transaction{ session.createReadTransaction() }; @@ -201,12 +197,10 @@ namespace lms::feedback Track::FindParameters searchParams; searchParams.setStarringUser(params.user, *backend); - searchParams.setClusters(params.clusters); + searchParams.setFilters(params.filters); searchParams.setKeywords(params.keywords); searchParams.setSortMethod(TrackSortMethod::StarredDateDesc); searchParams.setRange(params.range); - searchParams.setMediaLibrary(params.library); - searchParams.setLabel(params.label); Session& session{ _db.getTLSSession() }; auto transaction{ session.createReadTransaction() }; diff --git a/src/libs/services/feedback/include/services/feedback/IFeedbackService.hpp b/src/libs/services/feedback/include/services/feedback/IFeedbackService.hpp index 223ab5c8..e0ea51db 100644 --- a/src/libs/services/feedback/include/services/feedback/IFeedbackService.hpp +++ b/src/libs/services/feedback/include/services/feedback/IFeedbackService.hpp @@ -27,9 +27,7 @@ #include #include "database/ArtistId.hpp" -#include "database/ClusterId.hpp" -#include "database/LabelId.hpp" -#include "database/MediaLibraryId.hpp" +#include "database/Filters.hpp" #include "database/ReleaseId.hpp" #include "database/TrackId.hpp" #include "database/Types.hpp" @@ -54,20 +52,18 @@ namespace lms::feedback struct FindParameters { db::UserId user; - std::vector clusters; // if non empty, at least one artist that belongs to these clusters + db::Filters filters; std::vector keywords; // if non empty, name must match all of these keywords std::optional range; - db::MediaLibraryId library; - db::LabelId label; FindParameters& setUser(const db::UserId _user) { user = _user; return *this; } - FindParameters& setClusters(std::span _clusters) + FindParameters& setFilters(const db::Filters& _filters) { - clusters.assign(std::cbegin(_clusters), std::cend(_clusters)); + filters = _filters; return *this; } FindParameters& setKeywords(const std::vector& _keywords) @@ -80,16 +76,6 @@ namespace lms::feedback range = _range; return *this; } - FindParameters& setMediaLibrary(db::MediaLibraryId _library) - { - library = _library; - return *this; - } - FindParameters& setLabel(db::LabelId _label) - { - label = _label; - return *this; - } }; // Artists diff --git a/src/libs/services/scrobbling/impl/ScrobblingService.cpp b/src/libs/services/scrobbling/impl/ScrobblingService.cpp index bb1d266b..7ace3afd 100644 --- a/src/libs/services/scrobbling/impl/ScrobblingService.cpp +++ b/src/libs/services/scrobbling/impl/ScrobblingService.cpp @@ -41,11 +41,9 @@ namespace lms::scrobbling { db::Listen::StatsFindParameters listenFindParams; listenFindParams.setUser(params.user); - listenFindParams.setClusters(params.clusters); + listenFindParams.setFilters(params.filters); listenFindParams.setKeywords(params.keywords); listenFindParams.setRange(params.range); - listenFindParams.setMediaLibrary(params.library); - listenFindParams.setLabel(params.label); listenFindParams.setArtist(params.artist); return listenFindParams; diff --git a/src/libs/services/scrobbling/include/services/scrobbling/IScrobblingService.hpp b/src/libs/services/scrobbling/include/services/scrobbling/IScrobblingService.hpp index 228f079f..49903657 100644 --- a/src/libs/services/scrobbling/include/services/scrobbling/IScrobblingService.hpp +++ b/src/libs/services/scrobbling/include/services/scrobbling/IScrobblingService.hpp @@ -28,9 +28,7 @@ #include #include "database/ArtistId.hpp" -#include "database/ClusterId.hpp" -#include "database/LabelId.hpp" -#include "database/MediaLibraryId.hpp" +#include "database/Filters.hpp" #include "database/ReleaseId.hpp" #include "database/TrackId.hpp" #include "database/Types.hpp" @@ -62,21 +60,19 @@ namespace lms::scrobbling struct FindParameters { db::UserId user; - std::vector clusters; // if non empty, at least one artist that belongs to these clusters + db::Filters filters; std::vector keywords; // if non empty, name must match all of these keywords std::optional range; - db::MediaLibraryId library; // if set, match this library - db::LabelId label; // if set, match this label - db::ArtistId artist; // if set, match this artist + db::ArtistId artist; // if set, match this artist FindParameters& setUser(const db::UserId _user) { user = _user; return *this; } - FindParameters& setClusters(std::span _clusters) + FindParameters& setFilters(const db::Filters& _filters) { - clusters.assign(std::cbegin(_clusters), std::cend(_clusters)); + filters = _filters; return *this; } FindParameters& setKeywords(const std::vector& _keywords) @@ -89,16 +85,6 @@ namespace lms::scrobbling range = _range; return *this; } - FindParameters& setMediaLibrary(db::MediaLibraryId _library) - { - library = _library; - return *this; - } - FindParameters& setLabel(db::LabelId _label) - { - label = _label; - return *this; - } FindParameters& setArtist(db::ArtistId _artist) { artist = _artist; diff --git a/src/libs/subsonic/impl/endpoints/AlbumSongLists.cpp b/src/libs/subsonic/impl/endpoints/AlbumSongLists.cpp index 8c04c158..480bac6e 100644 --- a/src/libs/subsonic/impl/endpoints/AlbumSongLists.cpp +++ b/src/libs/subsonic/impl/endpoints/AlbumSongLists.cpp @@ -67,7 +67,7 @@ namespace lms::api::subsonic Release::FindParameters params; params.setSortMethod(ReleaseSortMethod::Name); params.setRange(range); - params.setMediaLibrary(mediaLibraryId); + params.filters.setMediaLibrary(mediaLibraryId); releases = Release::findIds(context.dbSession, params); } @@ -76,7 +76,7 @@ namespace lms::api::subsonic Release::FindParameters params; params.setSortMethod(ReleaseSortMethod::ArtistNameThenName); params.setRange(range); - params.setMediaLibrary(mediaLibraryId); + params.filters.setMediaLibrary(mediaLibraryId); releases = Release::findIds(context.dbSession, params); } @@ -90,10 +90,10 @@ namespace lms::api::subsonic if (const Cluster::pointer cluster{ clusterType->getCluster(genre) }) { Release::FindParameters params; - params.setClusters(std::initializer_list{ cluster->getId() }); + params.filters.setMediaLibrary(mediaLibraryId); + params.filters.setClusters(std::initializer_list{ cluster->getId() }); params.setSortMethod(ReleaseSortMethod::Name); params.setRange(range); - params.setMediaLibrary(mediaLibraryId); releases = Release::findIds(context.dbSession, params); } @@ -108,7 +108,7 @@ namespace lms::api::subsonic params.setSortMethod(fromYear > toYear ? ReleaseSortMethod::DateDesc : ReleaseSortMethod::DateAsc); params.setRange(range); params.setDateRange(YearRange{ std::min(fromYear, toYear), std::max(fromYear, toYear) }); - params.setMediaLibrary(mediaLibraryId); + params.filters.setMediaLibrary(mediaLibraryId); releases = Release::findIds(context.dbSession, params); } @@ -117,7 +117,7 @@ namespace lms::api::subsonic scrobbling::IScrobblingService::FindParameters params; params.setUser(context.user->getId()); params.setRange(range); - params.setMediaLibrary(mediaLibraryId); + params.filters.setMediaLibrary(mediaLibraryId); releases = scrobblingService.getTopReleases(params); } @@ -126,7 +126,7 @@ namespace lms::api::subsonic Release::FindParameters params; params.setSortMethod(ReleaseSortMethod::AddedDesc); params.setRange(range); - params.setMediaLibrary(mediaLibraryId); + params.filters.setMediaLibrary(mediaLibraryId); releases = Release::findIds(context.dbSession, params); } @@ -137,7 +137,7 @@ namespace lms::api::subsonic Release::FindParameters params; params.setSortMethod(ReleaseSortMethod::Random); params.setRange(Range{ 0, size }); - params.setMediaLibrary(mediaLibraryId); + params.filters.setMediaLibrary(mediaLibraryId); releases = Release::findIds(context.dbSession, params); } @@ -146,7 +146,7 @@ namespace lms::api::subsonic scrobbling::IScrobblingService::FindParameters params; params.setUser(context.user->getId()); params.setRange(range); - params.setMediaLibrary(mediaLibraryId); + params.filters.setMediaLibrary(mediaLibraryId); releases = scrobblingService.getRecentReleases(params); } @@ -155,7 +155,7 @@ namespace lms::api::subsonic feedback::IFeedbackService::FindParameters params; params.setUser(context.user->getId()); params.setRange(range); - params.setMediaLibrary(mediaLibraryId); + params.filters.setMediaLibrary(mediaLibraryId); releases = feedbackService.findStarredReleases(params); } @@ -203,7 +203,7 @@ namespace lms::api::subsonic feedback::IFeedbackService::FindParameters findParameters; findParameters.setUser(context.user->getId()); - findParameters.setMediaLibrary(mediaLibrary); + findParameters.filters.setMediaLibrary(mediaLibrary); for (const ReleaseId releaseId : feedbackService.findStarredReleases(findParameters).results) { @@ -247,7 +247,7 @@ namespace lms::api::subsonic Track::FindParameters params; params.setSortMethod(TrackSortMethod::Random); params.setRange(Range{ 0, size }); - params.setMediaLibrary(mediaLibraryId); + params.filters.setMediaLibrary(mediaLibraryId); Track::find(context.dbSession, params, [&](const Track::pointer& track) { randomSongsNode.addArrayChild("song", createSongNode(context, track, context.user)); @@ -283,9 +283,9 @@ namespace lms::api::subsonic Response::Node& songsByGenreNode{ response.createNode("songsByGenre") }; Track::FindParameters params; - params.setClusters(std::initializer_list{ cluster->getId() }); + params.filters.setClusters(std::initializer_list{ cluster->getId() }); + params.filters.setMediaLibrary(mediaLibrary); params.setRange(Range{ offset, count }); - params.setMediaLibrary(mediaLibrary); Track::find(context.dbSession, params, [&](const Track::pointer& track) { songsByGenreNode.addArrayChild("song", createSongNode(context, track, context.user)); diff --git a/src/libs/subsonic/impl/endpoints/Browsing.cpp b/src/libs/subsonic/impl/endpoints/Browsing.cpp index 8cdf0ae3..75e9ea45 100644 --- a/src/libs/subsonic/impl/endpoints/Browsing.cpp +++ b/src/libs/subsonic/impl/endpoints/Browsing.cpp @@ -398,7 +398,7 @@ namespace lms::api::subsonic break; } } - parameters.setMediaLibrary(mediaLibrary); + parameters.filters.setMediaLibrary(mediaLibrary); // This endpoint does not scale: make sort lived transactions in order not to block the whole application diff --git a/src/libs/subsonic/impl/endpoints/Searching.cpp b/src/libs/subsonic/impl/endpoints/Searching.cpp index 5a6dac99..9cc979cb 100644 --- a/src/libs/subsonic/impl/endpoints/Searching.cpp +++ b/src/libs/subsonic/impl/endpoints/Searching.cpp @@ -159,9 +159,9 @@ namespace lms::api::subsonic ArtistId lastRetrievedId; auto findArtists{ [&] { Artist::FindParameters params; + params.filters.setMediaLibrary(mediaLibrary); params.setKeywords(keywords); params.setRange(Range{ artistOffset, artistCount }); - params.setMediaLibrary(mediaLibrary); params.setSortMethod(ArtistSortMethod::Id); // must be consistent with both methods Artist::find(context.dbSession, params, [&](const Artist::pointer& artist) { @@ -225,7 +225,7 @@ namespace lms::api::subsonic Release::FindParameters params; params.setKeywords(keywords); params.setRange(Range{ albumOffset, albumCount }); - params.setMediaLibrary(mediaLibrary); + params.filters.setMediaLibrary(mediaLibrary); params.setSortMethod(ReleaseSortMethod::Id); // must be consistent with both methods Release::find(context.dbSession, params, [&](const Release::pointer& release) { @@ -289,7 +289,7 @@ namespace lms::api::subsonic Track::FindParameters params; params.setKeywords(keywords); params.setRange(Range{ songOffset, songCount }); - params.setMediaLibrary(mediaLibrary); + params.filters.setMediaLibrary(mediaLibrary); params.setSortMethod(TrackSortMethod::Id); // must be consistent with both methods Track::find(context.dbSession, params, [&](const Track::pointer& track) { diff --git a/src/lms/ui/explore/ArtistCollector.cpp b/src/lms/ui/explore/ArtistCollector.cpp index d4d65699..e0d4907b 100644 --- a/src/lms/ui/explore/ArtistCollector.cpp +++ b/src/lms/ui/explore/ArtistCollector.cpp @@ -40,7 +40,6 @@ namespace lms::ui scrobbling::IScrobblingService& scrobblingService{ *core::Service::get() }; const Range range{ getActualRange(requestedRange) }; - const Filters& filters{ getFilters() }; RangeResults artists; @@ -53,11 +52,9 @@ namespace lms::ui case Mode::Starred: { feedback::IFeedbackService::ArtistFindParameters params; + params.setFilters(getDbFilters()); params.setUser(LmsApp->getUserId()); - params.setClusters(filters.getClusters()); params.setKeywords(getSearchKeywords()); - params.setMediaLibrary(filters.getMediaLibrary()); - params.setLabel(getFilters().getLabel()); params.setLinkType(_linkType); params.setSortMethod(ArtistSortMethod::StarredDateDesc); params.setRange(range); @@ -69,10 +66,8 @@ namespace lms::ui { scrobbling::IScrobblingService::ArtistFindParameters params; params.setUser(LmsApp->getUserId()); - params.setClusters(filters.getClusters()); + params.setFilters(getDbFilters()); params.setKeywords(getSearchKeywords()); - params.setMediaLibrary(filters.getMediaLibrary()); - params.setLabel(getFilters().getLabel()); params.setLinkType(_linkType); params.setRange(range); @@ -84,10 +79,8 @@ namespace lms::ui { scrobbling::IScrobblingService::ArtistFindParameters params; params.setUser(LmsApp->getUserId()); - params.setClusters(filters.getClusters()); + params.setFilters(getDbFilters()); params.setKeywords(getSearchKeywords()); - params.setMediaLibrary(filters.getMediaLibrary()); - params.setLabel(getFilters().getLabel()); params.setLinkType(_linkType); params.setRange(range); @@ -98,10 +91,8 @@ namespace lms::ui case Mode::RecentlyAdded: { Artist::FindParameters params; - params.setClusters(filters.getClusters()); + params.setFilters(getDbFilters()); params.setKeywords(getSearchKeywords()); - params.setMediaLibrary(filters.getMediaLibrary()); - params.setLabel(getFilters().getLabel()); params.setLinkType(_linkType); params.setSortMethod(ArtistSortMethod::AddedDesc); params.setRange(range); @@ -116,10 +107,8 @@ namespace lms::ui case Mode::RecentlyModified: { Artist::FindParameters params; - params.setClusters(filters.getClusters()); + params.setFilters(getDbFilters()); params.setKeywords(getSearchKeywords()); - params.setMediaLibrary(filters.getMediaLibrary()); - params.setLabel(getFilters().getLabel()); params.setLinkType(_linkType); params.setSortMethod(ArtistSortMethod::LastWrittenDesc); params.setRange(range); @@ -134,9 +123,7 @@ namespace lms::ui case Mode::All: { Artist::FindParameters params; - params.setClusters(filters.getClusters()); - params.setMediaLibrary(filters.getMediaLibrary()); - params.setLabel(getFilters().getLabel()); + params.setFilters(getDbFilters()); params.setKeywords(getSearchKeywords()); params.setLinkType(_linkType); params.setSortMethod(ArtistSortMethod::SortName); @@ -163,9 +150,7 @@ namespace lms::ui if (!_randomArtists) { Artist::FindParameters params; - params.setClusters(getFilters().getClusters()); - params.setMediaLibrary(getFilters().getMediaLibrary()); - params.setLabel(getFilters().getLabel()); + params.setFilters(getDbFilters()); params.setKeywords(getSearchKeywords()); params.setLinkType(_linkType); params.setSortMethod(ArtistSortMethod::Random); diff --git a/src/lms/ui/explore/ArtistView.cpp b/src/lms/ui/explore/ArtistView.cpp index 04e7910f..2f821edf 100644 --- a/src/lms/ui/explore/ArtistView.cpp +++ b/src/lms/ui/explore/ArtistView.cpp @@ -193,9 +193,7 @@ namespace lms::ui _releaseContainers.clear(); Release::FindParameters params; - params.setClusters(_filters.getClusters()); - params.setMediaLibrary(_filters.getMediaLibrary()); - params.setLabel(_filters.getLabel()); + params.setFilters(_filters.getDbFilters()); params.setArtist(_artistId, { TrackArtistLinkType::ReleaseArtist }, {}); params.setSortMethod(LmsApp->getUser()->getUIArtistReleaseSortMethod()); @@ -252,9 +250,7 @@ namespace lms::ui _appearsOnReleaseContainer = {}; Release::FindParameters params; - params.setClusters(_filters.getClusters()); - params.setMediaLibrary(_filters.getMediaLibrary()); - params.setLabel(_filters.getLabel()); + params.setFilters(_filters.getDbFilters()); params.setArtist(_artistId, types, { TrackArtistLinkType::ReleaseArtist }); params.setSortMethod(ReleaseSortMethod::OriginalDateDesc); @@ -338,9 +334,7 @@ namespace lms::ui const Range range{ static_cast(_trackContainer->getCount()), _tracksBatchSize }; Track::FindParameters params; - params.setClusters(_filters.getClusters()); - params.setMediaLibrary(_filters.getMediaLibrary()); - params.setLabel(_filters.getLabel()); + params.setFilters(_filters.getDbFilters()); params.setArtist(_artistId); params.setRange(range); params.setSortMethod(TrackSortMethod::Name); diff --git a/src/lms/ui/explore/DatabaseCollectorBase.cpp b/src/lms/ui/explore/DatabaseCollectorBase.cpp index e2e39f73..135c1da3 100644 --- a/src/lms/ui/explore/DatabaseCollectorBase.cpp +++ b/src/lms/ui/explore/DatabaseCollectorBase.cpp @@ -21,6 +21,8 @@ #include "core/String.hpp" +#include "explore/Filters.hpp" + namespace lms::ui { DatabaseCollectorBase::DatabaseCollectorBase(Filters& filters, Mode defaultMode, std::size_t maxCount) @@ -56,6 +58,11 @@ namespace lms::ui return _maxCount; } + const db::Filters& DatabaseCollectorBase::getDbFilters() const + { + return _filters.getDbFilters(); + } + void DatabaseCollectorBase::setSearch(std::string_view searchText) { _searchText = searchText; diff --git a/src/lms/ui/explore/DatabaseCollectorBase.hpp b/src/lms/ui/explore/DatabaseCollectorBase.hpp index 5bc756ae..f6f1ab26 100644 --- a/src/lms/ui/explore/DatabaseCollectorBase.hpp +++ b/src/lms/ui/explore/DatabaseCollectorBase.hpp @@ -26,6 +26,11 @@ #include "database/Types.hpp" +namespace lms::db +{ + struct Filters; +} + namespace lms::ui { class Filters; @@ -57,7 +62,7 @@ namespace lms::ui protected: Range getActualRange(std::optional range) const; std::size_t getMaxCount() const; - const Filters& getFilters() { return _filters; } + const db::Filters& getDbFilters() const; const std::vector& getSearchKeywords() const { return _searchKeywords; } private: diff --git a/src/lms/ui/explore/Filters.cpp b/src/lms/ui/explore/Filters.cpp index 2ee639c8..78cb14b7 100644 --- a/src/lms/ui/explore/Filters.cpp +++ b/src/lms/ui/explore/Filters.cpp @@ -182,7 +182,7 @@ namespace lms::ui void Filters::add(db::ClusterId clusterId) { - if (std::find(std::cbegin(_clusterIds), std::cend(_clusterIds), clusterId) != std::cend(_clusterIds)) + if (std::find(std::cbegin(_dbFilters.clusters), std::cend(_dbFilters.clusters), clusterId) != std::cend(_dbFilters.clusters)) return; Wt::WInteractWidget* filter{}; @@ -195,11 +195,11 @@ namespace lms::ui filter = _filters->addWidget(std::move(cluster)); } - _clusterIds.push_back(clusterId); + _dbFilters.clusters.push_back(clusterId); filter->clicked().connect([this, filter, clusterId] { _filters->removeWidget(filter); - _clusterIds.erase(std::remove_if(std::begin(_clusterIds), std::end(_clusterIds), [clusterId](db::ClusterId id) { return id == clusterId; }), std::end(_clusterIds)); + _dbFilters.clusters.erase(std::remove_if(std::begin(_dbFilters.clusters), std::end(_dbFilters.clusters), [clusterId](db::ClusterId id) { return id == clusterId; }), std::end(_dbFilters.clusters)); _sigUpdated.emit(); }); @@ -212,7 +212,7 @@ namespace lms::ui { _filters->removeWidget(_mediaLibraryFilter); _mediaLibraryFilter = nullptr; - _mediaLibraryId = db::MediaLibraryId{}; + _dbFilters.mediaLibrary = db::MediaLibraryId{}; } std::string libraryName; @@ -226,11 +226,11 @@ namespace lms::ui libraryName = library->getName(); } - _mediaLibraryId = mediaLibraryId; + _dbFilters.mediaLibrary = mediaLibraryId; _mediaLibraryFilter = _filters->addWidget(utils::createFilter(Wt::WString::fromUTF8(libraryName), Wt::WString::tr("Lms.Explore.media-library"), "bg-primary", true)); _mediaLibraryFilter->clicked().connect(_mediaLibraryFilter, [this] { _filters->removeWidget(_mediaLibraryFilter); - _mediaLibraryId = db::MediaLibraryId{}; + _dbFilters.mediaLibrary = db::MediaLibraryId{}; _mediaLibraryFilter = nullptr; _sigUpdated.emit(); state::writeValue("filters_media_library_id", std::nullopt); @@ -245,7 +245,7 @@ namespace lms::ui { _filters->removeWidget(_labelFilter); _labelFilter = nullptr; - _labelId = db::LabelId{}; + _dbFilters.label = db::LabelId{}; } std::string name; @@ -259,11 +259,11 @@ namespace lms::ui name = label->getName(); } - _labelId = labelId; + _dbFilters.label = labelId; _labelFilter = _filters->addWidget(utils::createFilter(Wt::WString::fromUTF8(name), Wt::WString::tr("Lms.Explore.label"), "bg-secondary", true)); _labelFilter->clicked().connect(_labelFilter, [this] { _filters->removeWidget(_labelFilter); - _labelId = db::LabelId{}; + _dbFilters.label = db::LabelId{}; _labelFilter = nullptr; _sigUpdated.emit(); state::writeValue("filters_label_id", std::nullopt); diff --git a/src/lms/ui/explore/Filters.hpp b/src/lms/ui/explore/Filters.hpp index fb35719c..98e9931b 100644 --- a/src/lms/ui/explore/Filters.hpp +++ b/src/lms/ui/explore/Filters.hpp @@ -26,9 +26,7 @@ #include #include -#include "database/ClusterId.hpp" -#include "database/LabelId.hpp" -#include "database/MediaLibraryId.hpp" +#include "database/Filters.hpp" namespace lms::ui { @@ -37,9 +35,7 @@ namespace lms::ui public: Filters(); - std::span getClusters() const { return _clusterIds; } - db::MediaLibraryId getMediaLibrary() const { return _mediaLibraryId; } - db::LabelId getLabel() const { return _labelId; } + const db::Filters& getDbFilters() const { return _dbFilters; } void add(db::ClusterId clusterId); @@ -52,13 +48,11 @@ namespace lms::ui void emitFilterAddedNotification(); Wt::WContainerWidget* _filters{}; - Wt::Signal<> _sigUpdated; - std::vector _clusterIds; - Wt::WInteractWidget* _mediaLibraryFilter{}; - db::MediaLibraryId _mediaLibraryId; - Wt::WInteractWidget* _labelFilter{}; - db::LabelId _labelId; + + Wt::Signal<> _sigUpdated; + + db::Filters _dbFilters; }; } // namespace lms::ui diff --git a/src/lms/ui/explore/PlayQueueController.cpp b/src/lms/ui/explore/PlayQueueController.cpp index de8dfe3d..2bfa0fe6 100644 --- a/src/lms/ui/explore/PlayQueueController.cpp +++ b/src/lms/ui/explore/PlayQueueController.cpp @@ -44,9 +44,7 @@ namespace lms::ui db::Track::FindParameters params; params.setArtist(artistId); params.setSortMethod(db::TrackSortMethod::DateDescAndRelease); - params.setClusters(filters.getClusters()); - params.setMediaLibrary(filters.getMediaLibrary()); - params.setLabel(filters.getLabel()); + params.setFilters(filters.getDbFilters()); params.setRange(db::Range{ 0, maxTrackCount - res.size() }); const auto tracks{ db::Track::findIds(session, params) }; @@ -75,9 +73,7 @@ namespace lms::ui db::Track::FindParameters params; params.setRelease(releaseId); params.setSortMethod(db::TrackSortMethod::Release); - params.setClusters(filters.getClusters()); - params.setMediaLibrary(filters.getMediaLibrary()); - params.setLabel(filters.getLabel()); + params.setFilters(filters.getDbFilters()); params.setRange(db::Range{ 0, maxTrackCount - res.size() }); const auto tracks{ db::Track::findIds(session, params) }; @@ -107,9 +103,7 @@ namespace lms::ui params.setRelease(disc.releaseId); params.setSortMethod(db::TrackSortMethod::Release); params.setDiscNumber(disc.discNumber); - params.setClusters(filters.getClusters()); - params.setMediaLibrary(filters.getMediaLibrary()); - params.setLabel(filters.getLabel()); + params.setFilters(filters.getDbFilters()); params.setRange(db::Range{ 0, maxTrackCount - res.size() }); const auto tracks{ db::Track::findIds(session, params) }; @@ -133,9 +127,7 @@ namespace lms::ui db::Track::FindParameters params; params.setTrackList(trackListId); - params.setClusters(filters.getClusters()); - params.setMediaLibrary(filters.getMediaLibrary()); - params.setLabel(filters.getLabel()); + params.setFilters(filters.getDbFilters()); params.setRange(db::Range{ 0, maxTrackCount }); params.setSortMethod(TrackSortMethod::TrackList); diff --git a/src/lms/ui/explore/ReleaseCollector.cpp b/src/lms/ui/explore/ReleaseCollector.cpp index 635d7adb..e678f321 100644 --- a/src/lms/ui/explore/ReleaseCollector.cpp +++ b/src/lms/ui/explore/ReleaseCollector.cpp @@ -52,9 +52,7 @@ namespace lms::ui { feedback::IFeedbackService::FindParameters params; params.setUser(LmsApp->getUserId()); - params.setClusters(getFilters().getClusters()); - params.setMediaLibrary(getFilters().getMediaLibrary()); - params.setLabel(getFilters().getLabel()); + params.setFilters(getDbFilters()); params.setKeywords(getSearchKeywords()); params.setRange(range); releases = feedbackService.findStarredReleases(params); @@ -65,9 +63,7 @@ namespace lms::ui { scrobbling::IScrobblingService::FindParameters params; params.setUser(LmsApp->getUserId()); - params.setClusters(getFilters().getClusters()); - params.setMediaLibrary(getFilters().getMediaLibrary()); - params.setLabel(getFilters().getLabel()); + params.setFilters(getDbFilters()); params.setKeywords(getSearchKeywords()); params.setRange(range); @@ -79,9 +75,7 @@ namespace lms::ui { scrobbling::IScrobblingService::FindParameters params; params.setUser(LmsApp->getUserId()); - params.setClusters(getFilters().getClusters()); - params.setMediaLibrary(getFilters().getMediaLibrary()); - params.setLabel(getFilters().getLabel()); + params.setFilters(getDbFilters()); params.setKeywords(getSearchKeywords()); params.setRange(range); @@ -92,9 +86,7 @@ namespace lms::ui case Mode::RecentlyAdded: { Release::FindParameters params; - params.setClusters(getFilters().getClusters()); - params.setMediaLibrary(getFilters().getMediaLibrary()); - params.setLabel(getFilters().getLabel()); + params.setFilters(getDbFilters()); params.setKeywords(getSearchKeywords()); params.setSortMethod(ReleaseSortMethod::AddedDesc); params.setRange(range); @@ -109,9 +101,7 @@ namespace lms::ui case Mode::RecentlyModified: { Release::FindParameters params; - params.setClusters(getFilters().getClusters()); - params.setMediaLibrary(getFilters().getMediaLibrary()); - params.setLabel(getFilters().getLabel()); + params.setFilters(getDbFilters()); params.setKeywords(getSearchKeywords()); params.setSortMethod(ReleaseSortMethod::LastWrittenDesc); params.setRange(range); @@ -126,9 +116,7 @@ namespace lms::ui case Mode::All: { Release::FindParameters params; - params.setClusters(getFilters().getClusters()); - params.setMediaLibrary(getFilters().getMediaLibrary()); - params.setLabel(getFilters().getLabel()); + params.setFilters(getDbFilters()); params.setSortMethod(ReleaseSortMethod::Name); params.setKeywords(getSearchKeywords()); params.setRange(range); @@ -154,9 +142,7 @@ namespace lms::ui if (!_randomReleases) { Release::FindParameters params; - params.setClusters(getFilters().getClusters()); - params.setMediaLibrary(getFilters().getMediaLibrary()); - params.setLabel(getFilters().getLabel()); + params.setFilters(getDbFilters()); params.setKeywords(getSearchKeywords()); params.setSortMethod(ReleaseSortMethod::Random); params.setRange(Range{ 0, getMaxCount() }); diff --git a/src/lms/ui/explore/ReleaseView.cpp b/src/lms/ui/explore/ReleaseView.cpp index b2b21b64..ff2a191d 100644 --- a/src/lms/ui/explore/ReleaseView.cpp +++ b/src/lms/ui/explore/ReleaseView.cpp @@ -397,9 +397,7 @@ namespace lms::ui db::Track::FindParameters params; params.setRelease(_releaseId); params.setSortMethod(db::TrackSortMethod::Release); - params.setClusters(_filters.getClusters()); - params.setMediaLibrary(_filters.getMediaLibrary()); - params.setLabel(_filters.getLabel()); // TODO: do we really want to hide all tracks when a release does not match the current label filter? + params.setFilters(_filters.getDbFilters()); // TODO: do we really want to hide all tracks when a release does not match the current label filter? db::Track::find(LmsApp->getDbSession(), params, [&](const db::Track::pointer& track) { const db::TrackId trackId{ track->getId() }; diff --git a/src/lms/ui/explore/TrackCollector.cpp b/src/lms/ui/explore/TrackCollector.cpp index 288f0cf6..74baa2bf 100644 --- a/src/lms/ui/explore/TrackCollector.cpp +++ b/src/lms/ui/explore/TrackCollector.cpp @@ -52,9 +52,7 @@ namespace lms::ui case Mode::Starred: { feedback::IFeedbackService::FindParameters params; - params.setClusters(getFilters().getClusters()); - params.setMediaLibrary(getFilters().getMediaLibrary()); - params.setLabel(getFilters().getLabel()); + params.setFilters(getDbFilters()); params.setKeywords(getSearchKeywords()); params.setRange(range); params.setUser(LmsApp->getUserId()); @@ -66,9 +64,7 @@ namespace lms::ui { scrobbling::IScrobblingService::FindParameters params; params.setUser(LmsApp->getUserId()); - params.setClusters(getFilters().getClusters()); - params.setMediaLibrary(getFilters().getMediaLibrary()); - params.setLabel(getFilters().getLabel()); + params.setFilters(getDbFilters()); params.setKeywords(getSearchKeywords()); params.setRange(range); @@ -80,9 +76,7 @@ namespace lms::ui { scrobbling::IScrobblingService::FindParameters params; params.setUser(LmsApp->getUserId()); - params.setClusters(getFilters().getClusters()); - params.setMediaLibrary(getFilters().getMediaLibrary()); - params.setLabel(getFilters().getLabel()); + params.setFilters(getDbFilters()); params.setKeywords(getSearchKeywords()); params.setRange(range); @@ -93,9 +87,7 @@ namespace lms::ui case Mode::RecentlyAdded: { Track::FindParameters params; - params.setClusters(getFilters().getClusters()); - params.setMediaLibrary(getFilters().getMediaLibrary()); - params.setLabel(getFilters().getLabel()); + params.setFilters(getDbFilters()); params.setKeywords(getSearchKeywords()); params.setSortMethod(TrackSortMethod::AddedDesc); params.setRange(range); @@ -110,9 +102,7 @@ namespace lms::ui case Mode::RecentlyModified: { Track::FindParameters params; - params.setClusters(getFilters().getClusters()); - params.setMediaLibrary(getFilters().getMediaLibrary()); - params.setLabel(getFilters().getLabel()); + params.setFilters(getDbFilters()); params.setKeywords(getSearchKeywords()); params.setSortMethod(TrackSortMethod::LastWrittenDesc); params.setRange(range); @@ -127,9 +117,7 @@ namespace lms::ui case Mode::All: { Track::FindParameters params; - params.setClusters(getFilters().getClusters()); - params.setMediaLibrary(getFilters().getMediaLibrary()); - params.setLabel(getFilters().getLabel()); + params.setFilters(getDbFilters()); params.setKeywords(getSearchKeywords()); params.setRange(range); @@ -154,9 +142,7 @@ namespace lms::ui if (!_randomTracks) { Track::FindParameters params; - params.setClusters(getFilters().getClusters()); - params.setMediaLibrary(getFilters().getMediaLibrary()); - params.setLabel(getFilters().getLabel()); + params.setFilters(getDbFilters()); params.setKeywords(getSearchKeywords()); params.setSortMethod(TrackSortMethod::Random); params.setRange(Range{ 0, getMaxCount() }); diff --git a/src/lms/ui/explore/TrackListView.cpp b/src/lms/ui/explore/TrackListView.cpp index d8e9564c..2fcb8fbe 100644 --- a/src/lms/ui/explore/TrackListView.cpp +++ b/src/lms/ui/explore/TrackListView.cpp @@ -187,9 +187,7 @@ namespace lms::ui auto transaction{ LmsApp->getDbSession().createReadTransaction() }; db::Track::FindParameters params; - params.setClusters(_filters.getClusters()); - params.setMediaLibrary(_filters.getMediaLibrary()); - params.setLabel(_filters.getLabel()); + params.setFilters(_filters.getDbFilters()); params.setTrackList(_trackListId); params.setSortMethod(db::TrackSortMethod::TrackList); params.setRange(db::Range{ static_cast(_container->getCount()), _batchSize }); diff --git a/src/lms/ui/explore/TrackListsView.cpp b/src/lms/ui/explore/TrackListsView.cpp index 3621e885..7d49ae7b 100644 --- a/src/lms/ui/explore/TrackListsView.cpp +++ b/src/lms/ui/explore/TrackListsView.cpp @@ -120,8 +120,7 @@ namespace lms::ui if (!_searchText.empty()) params.setKeywords(core::stringUtils::splitString(_searchText, ' ')); - params.setClusters(_filters.getClusters()); - params.setMediaLibrary(_filters.getMediaLibrary()); + params.setFilters(_filters.getDbFilters()); params.setType(TrackListType::PlayList); params.setRange(range);