Optimized the way we count albums for artists

This commit is contained in:
emeric
2023-11-17 08:57:08 +01:00
parent 0cc73ca022
commit f2515edc8b
4 changed files with 16 additions and 22 deletions
+11 -19
View File
@@ -39,7 +39,7 @@ namespace Database
template <typename ResultType>
Wt::Dbo::Query<ResultType> createQuery(Session& session, std::string_view itemToSelect, const Release::FindParameters& params)
{
auto query{ session.getDboSession().query<ResultType>("SELECT DISTINCT " + std::string{ itemToSelect } + " from release r") };
auto query{ session.getDboSession().query<ResultType>("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 <typename ResultType>
Wt::Dbo::Query<ResultType> createQuery(Session& session, const Release::FindParameters& params)
{
std::string_view itemToSelect;
if constexpr (std::is_same_v<ResultType, ReleaseId>)
itemToSelect = "r.id";
else if constexpr (std::is_same_v<ResultType, Wt::Dbo::ptr<Release>>)
itemToSelect = "r";
else
static_assert("Unhandled type");
return createQuery<ResultType>(session, itemToSelect, params);
}
}
Release::Release(const std::string& name, const std::optional<UUID>& MBID)
@@ -283,7 +268,7 @@ namespace Database
{
session.checkSharedLocked();
auto query{ createQuery<Wt::Dbo::ptr<Release>>(session, params) };
auto query{ createQuery<Wt::Dbo::ptr<Release>>(session, "DISTINCT r", params) };
return Utils::execQuery<pointer>(query, params.range);
}
@@ -291,7 +276,7 @@ namespace Database
{
session.checkSharedLocked();
auto query{ createQuery<Wt::Dbo::ptr<Release>>(session, params) };
auto query{ createQuery<Wt::Dbo::ptr<Release>>(session, "DISTINCT r", params) };
Utils::execQuery<pointer>(query, params.range, func);
}
@@ -299,10 +284,17 @@ namespace Database
{
session.checkSharedLocked();
auto query{ createQuery<ReleaseId>(session, params) };
auto query{ createQuery<ReleaseId>(session, "DISTINCT r.id", params) };
return Utils::execQuery<ReleaseId>(query, params.range);
}
std::size_t Release::getCount(Session& session, const FindParameters& params)
{
session.checkSharedLocked();
return createQuery<int>(session, "COUNT(DISTINCT r.id)", params).resultValue();
}
std::size_t Release::getDiscCount() const
{
assert(session());
@@ -91,6 +91,7 @@ namespace Database
static RangeResults<pointer> find(Session& session, const FindParameters& parameters);
static void find(Session& session, const FindParameters& parameters, std::function<void(const pointer&)> func);
static RangeResults<ReleaseId> findIds(Session& session, const FindParameters& parameters);
static std::size_t getCount(Session& session, const FindParameters& parameters);
static RangeResults<ReleaseId> findOrphanIds(Session& session, std::optional<Range> range = std::nullopt); // not track related
static RangeResults<ReleaseId> findIdsOrderedByArtist(Session& session, std::optional<Range> range = std::nullopt);
+2 -1
View File
@@ -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" };
+2 -2
View File
@@ -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<Feedback::IFeedbackService>::get()->getStarredDateTime(user->getId(), artist->getId()) }; dateTime.isValid())