Optimized the way we count albums for artists
This commit is contained in:
@@ -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);
|
||||
|
||||
|
||||
@@ -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" };
|
||||
|
||||
@@ -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())
|
||||
|
||||
Reference in New Issue
Block a user