diff --git a/src/libs/services/database/impl/Release.cpp b/src/libs/services/database/impl/Release.cpp index f3091eb6..0f557462 100644 --- a/src/libs/services/database/impl/Release.cpp +++ b/src/libs/services/database/impl/Release.cpp @@ -39,7 +39,7 @@ namespace Database template Wt::Dbo::Query createQuery(Session& session, std::string_view itemToSelect, const Release::FindParameters& params) { - auto query{ session.getDboSession().query("SELECT DISTINCT " + std::string{ itemToSelect } + " from release r") }; + auto query{ session.getDboSession().query("SELECT " + std::string{ itemToSelect } + " from release r") }; if (params.sortMethod == ReleaseSortMethod::LastWritten || params.sortMethod == ReleaseSortMethod::Date @@ -183,21 +183,6 @@ namespace Database return query; } - - template - Wt::Dbo::Query createQuery(Session& session, const Release::FindParameters& params) - { - std::string_view itemToSelect; - - if constexpr (std::is_same_v) - itemToSelect = "r.id"; - else if constexpr (std::is_same_v>) - itemToSelect = "r"; - else - static_assert("Unhandled type"); - - return createQuery(session, itemToSelect, params); - } } Release::Release(const std::string& name, const std::optional& MBID) @@ -283,7 +268,7 @@ namespace Database { session.checkSharedLocked(); - auto query{ createQuery>(session, params) }; + auto query{ createQuery>(session, "DISTINCT r", params) }; return Utils::execQuery(query, params.range); } @@ -291,7 +276,7 @@ namespace Database { session.checkSharedLocked(); - auto query{ createQuery>(session, params) }; + auto query{ createQuery>(session, "DISTINCT r", params) }; Utils::execQuery(query, params.range, func); } @@ -299,10 +284,17 @@ namespace Database { session.checkSharedLocked(); - auto query{ createQuery(session, params) }; + auto query{ createQuery(session, "DISTINCT r.id", params) }; return Utils::execQuery(query, params.range); } + std::size_t Release::getCount(Session& session, const FindParameters& params) + { + session.checkSharedLocked(); + + return createQuery(session, "COUNT(DISTINCT r.id)", params).resultValue(); + } + std::size_t Release::getDiscCount() const { assert(session()); diff --git a/src/libs/services/database/include/services/database/Release.hpp b/src/libs/services/database/include/services/database/Release.hpp index 92bf6ffd..2000e5e0 100644 --- a/src/libs/services/database/include/services/database/Release.hpp +++ b/src/libs/services/database/include/services/database/Release.hpp @@ -91,6 +91,7 @@ namespace Database static RangeResults find(Session& session, const FindParameters& parameters); static void find(Session& session, const FindParameters& parameters, std::function func); static RangeResults findIds(Session& session, const FindParameters& parameters); + static std::size_t getCount(Session& session, const FindParameters& parameters); static RangeResults findOrphanIds(Session& session, std::optional range = std::nullopt); // not track related static RangeResults findIdsOrderedByArtist(Session& session, std::optional range = std::nullopt); diff --git a/src/libs/services/database/test/Release.cpp b/src/libs/services/database/test/Release.cpp index 520c5530..1162a89a 100644 --- a/src/libs/services/database/test/Release.cpp +++ b/src/libs/services/database/test/Release.cpp @@ -27,6 +27,7 @@ TEST_F(DatabaseFixture, Release) auto transaction{ session.createSharedTransaction() }; EXPECT_EQ(Release::getCount(session), 0); + EXPECT_EQ(Release::getCount(session, Release::FindParameters{}), 0); EXPECT_FALSE(Release::exists(session, 0)); EXPECT_FALSE(Release::exists(session, 1)); } @@ -37,6 +38,7 @@ TEST_F(DatabaseFixture, Release) auto transaction{ session.createSharedTransaction() }; EXPECT_EQ(Release::getCount(session), 1); + EXPECT_EQ(Release::getCount(session, Release::FindParameters{}), 1); EXPECT_TRUE(Release::exists(session, release.getId())); { @@ -616,7 +618,6 @@ TEST_F(DatabaseFixture, Release_sortMethod) } } - TEST_F(DatabaseFixture, Release_meanBitrate) { ScopedRelease release1{ session, "MyRelease1" }; diff --git a/src/libs/subsonic/impl/responses/Artist.cpp b/src/libs/subsonic/impl/responses/Artist.cpp index bd7c6cf2..54635316 100644 --- a/src/libs/subsonic/impl/responses/Artist.cpp +++ b/src/libs/subsonic/impl/responses/Artist.cpp @@ -82,8 +82,8 @@ namespace API::Subsonic if (id3) { - const auto releases{ Release::find(context.dbSession, Release::FindParameters {}.setArtist(artist->getId())) }; - artistNode.setAttribute("albumCount", releases.results.size()); + const std::size_t count{ Release::getCount(context.dbSession, Release::FindParameters {}.setArtist(artist->getId())) }; + artistNode.setAttribute("albumCount", count); } if (const Wt::WDateTime dateTime{ Service::get()->getStarredDateTime(user->getId(), artist->getId()) }; dateTime.isValid())