Optimized the way we count albums for artists
This commit is contained in:
@@ -39,7 +39,7 @@ namespace Database
|
|||||||
template <typename ResultType>
|
template <typename ResultType>
|
||||||
Wt::Dbo::Query<ResultType> createQuery(Session& session, std::string_view itemToSelect, const Release::FindParameters& params)
|
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
|
if (params.sortMethod == ReleaseSortMethod::LastWritten
|
||||||
|| params.sortMethod == ReleaseSortMethod::Date
|
|| params.sortMethod == ReleaseSortMethod::Date
|
||||||
@@ -183,21 +183,6 @@ namespace Database
|
|||||||
|
|
||||||
return query;
|
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)
|
Release::Release(const std::string& name, const std::optional<UUID>& MBID)
|
||||||
@@ -283,7 +268,7 @@ namespace Database
|
|||||||
{
|
{
|
||||||
session.checkSharedLocked();
|
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);
|
return Utils::execQuery<pointer>(query, params.range);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -291,7 +276,7 @@ namespace Database
|
|||||||
{
|
{
|
||||||
session.checkSharedLocked();
|
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);
|
Utils::execQuery<pointer>(query, params.range, func);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -299,10 +284,17 @@ namespace Database
|
|||||||
{
|
{
|
||||||
session.checkSharedLocked();
|
session.checkSharedLocked();
|
||||||
|
|
||||||
auto query{ createQuery<ReleaseId>(session, params) };
|
auto query{ createQuery<ReleaseId>(session, "DISTINCT r.id", params) };
|
||||||
return Utils::execQuery<ReleaseId>(query, params.range);
|
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
|
std::size_t Release::getDiscCount() const
|
||||||
{
|
{
|
||||||
assert(session());
|
assert(session());
|
||||||
|
|||||||
@@ -91,6 +91,7 @@ namespace Database
|
|||||||
static RangeResults<pointer> find(Session& session, const FindParameters& parameters);
|
static RangeResults<pointer> find(Session& session, const FindParameters& parameters);
|
||||||
static void find(Session& session, const FindParameters& parameters, std::function<void(const pointer&)> func);
|
static void find(Session& session, const FindParameters& parameters, std::function<void(const pointer&)> func);
|
||||||
static RangeResults<ReleaseId> findIds(Session& session, const FindParameters& parameters);
|
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> findOrphanIds(Session& session, std::optional<Range> range = std::nullopt); // not track related
|
||||||
static RangeResults<ReleaseId> findIdsOrderedByArtist(Session& session, std::optional<Range> range = std::nullopt);
|
static RangeResults<ReleaseId> findIdsOrderedByArtist(Session& session, std::optional<Range> range = std::nullopt);
|
||||||
|
|
||||||
|
|||||||
@@ -27,6 +27,7 @@ TEST_F(DatabaseFixture, Release)
|
|||||||
auto transaction{ session.createSharedTransaction() };
|
auto transaction{ session.createSharedTransaction() };
|
||||||
|
|
||||||
EXPECT_EQ(Release::getCount(session), 0);
|
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, 0));
|
||||||
EXPECT_FALSE(Release::exists(session, 1));
|
EXPECT_FALSE(Release::exists(session, 1));
|
||||||
}
|
}
|
||||||
@@ -37,6 +38,7 @@ TEST_F(DatabaseFixture, Release)
|
|||||||
auto transaction{ session.createSharedTransaction() };
|
auto transaction{ session.createSharedTransaction() };
|
||||||
|
|
||||||
EXPECT_EQ(Release::getCount(session), 1);
|
EXPECT_EQ(Release::getCount(session), 1);
|
||||||
|
EXPECT_EQ(Release::getCount(session, Release::FindParameters{}), 1);
|
||||||
EXPECT_TRUE(Release::exists(session, release.getId()));
|
EXPECT_TRUE(Release::exists(session, release.getId()));
|
||||||
|
|
||||||
{
|
{
|
||||||
@@ -616,7 +618,6 @@ TEST_F(DatabaseFixture, Release_sortMethod)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
TEST_F(DatabaseFixture, Release_meanBitrate)
|
TEST_F(DatabaseFixture, Release_meanBitrate)
|
||||||
{
|
{
|
||||||
ScopedRelease release1{ session, "MyRelease1" };
|
ScopedRelease release1{ session, "MyRelease1" };
|
||||||
|
|||||||
@@ -82,8 +82,8 @@ namespace API::Subsonic
|
|||||||
|
|
||||||
if (id3)
|
if (id3)
|
||||||
{
|
{
|
||||||
const auto releases{ Release::find(context.dbSession, Release::FindParameters {}.setArtist(artist->getId())) };
|
const std::size_t count{ Release::getCount(context.dbSession, Release::FindParameters {}.setArtist(artist->getId())) };
|
||||||
artistNode.setAttribute("albumCount", releases.results.size());
|
artistNode.setAttribute("albumCount", count);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (const Wt::WDateTime dateTime{ Service<Feedback::IFeedbackService>::get()->getStarredDateTime(user->getId(), artist->getId()) }; dateTime.isValid())
|
if (const Wt::WDateTime dateTime{ Service<Feedback::IFeedbackService>::get()->getStarredDateTime(user->getId(), artist->getId()) }; dateTime.isValid())
|
||||||
|
|||||||
Reference in New Issue
Block a user