diff --git a/src/libs/database/impl/Release.cpp b/src/libs/database/impl/Release.cpp index add8377a..142fbfe0 100644 --- a/src/libs/database/impl/Release.cpp +++ b/src/libs/database/impl/Release.cpp @@ -205,6 +205,9 @@ namespace lms::db query.where(oss.str()); } + if (params.releaseGroupMBID) + query.where("group_mbid = ?").bind(params.releaseGroupMBID->getAsString()); + switch (params.sortMethod) { case ReleaseSortMethod::None: diff --git a/src/libs/database/impl/Session.cpp b/src/libs/database/impl/Session.cpp index a7263d9e..4127c4c4 100644 --- a/src/libs/database/impl/Session.cpp +++ b/src/libs/database/impl/Session.cpp @@ -235,6 +235,7 @@ namespace lms::db utils::executeCommand(_session, "CREATE INDEX IF NOT EXISTS release_id_idx ON release(id)"); utils::executeCommand(_session, "CREATE INDEX IF NOT EXISTS release_image_idx ON release(image_id)"); + utils::executeCommand(_session, "CREATE INDEX IF NOT EXISTS release_group_mbid_idx ON release(group_mbid)"); utils::executeCommand(_session, "CREATE INDEX IF NOT EXISTS release_mbid_idx ON release(mbid)"); utils::executeCommand(_session, "CREATE INDEX IF NOT EXISTS release_name_idx ON release(name)"); utils::executeCommand(_session, "CREATE INDEX IF NOT EXISTS release_name_nocase_idx ON release(name COLLATE NOCASE)"); diff --git a/src/libs/database/include/database/Release.hpp b/src/libs/database/include/database/Release.hpp index 9b28fcfc..f6df0773 100644 --- a/src/libs/database/include/database/Release.hpp +++ b/src/libs/database/include/database/Release.hpp @@ -165,7 +165,8 @@ namespace lms::db ArtistId artist; // only releases that involved this user 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 + std::string releaseType; // If set, releases that has this release type + std::optional releaseGroupMBID; // If set, releases that belong to this release group 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) @@ -222,6 +223,11 @@ namespace lms::db releaseType = _releaseType; return *this; } + FindParameters& setReleaseGroupMBID(const std::optional& _releaseGroupMBID) + { + releaseGroupMBID = _releaseGroupMBID; + return *this; + } FindParameters& setDirectory(DirectoryId _directory) { directory = _directory; diff --git a/src/libs/database/test/Release.cpp b/src/libs/database/test/Release.cpp index a337e4ac..34f7a495 100644 --- a/src/libs/database/test/Release.cpp +++ b/src/libs/database/test/Release.cpp @@ -1360,4 +1360,30 @@ namespace lms::db::tests EXPECT_EQ(addedTime, track2.get()->getAddedTime()); } } + + TEST_F(DatabaseFixture, Release_groupMBID) + { + ScopedRelease release{ session, "relA" }; + const std::optional groupMBID{ core::UUID::fromString("1ad8f716-2fd6-4d09-8ada-39525947217c") }; + + { + auto transaction{ session.createReadTransaction() }; + + const auto releases{ Release::find(session, Release::FindParameters{}.setReleaseGroupMBID(groupMBID)) }; + EXPECT_EQ(releases.results.size(), 0); + } + + { + auto transaction{ session.createWriteTransaction() }; + release.get().modify()->setGroupMBID(groupMBID); + } + + { + auto transaction{ session.createReadTransaction() }; + + const auto releases{ Release::find(session, Release::FindParameters{}.setReleaseGroupMBID(groupMBID)) }; + EXPECT_EQ(releases.results.size(), 1); + EXPECT_EQ(releases.results[0]->getId(), release->getId()); + } + } } // namespace lms::db::tests \ No newline at end of file