Use the scrobbling service to get listen count rathen than querying the db directly
This commit is contained in:
@@ -249,29 +249,31 @@ namespace Database
|
||||
return Utils::execQuery<TrackId>(query, range);
|
||||
}
|
||||
|
||||
std::size_t Listen::getCount(Session& session, UserId userId, ScrobblingBackend backend, TrackId trackId)
|
||||
std::size_t Listen::getCount(Session& session, UserId userId, TrackId trackId)
|
||||
{
|
||||
session.checkReadTransaction();
|
||||
|
||||
return session.getDboSession().query<int>("SELECT COUNT(*) from listen l")
|
||||
.join("user u ON u.id = l.user_id")
|
||||
.where("l.track_id = ?").bind(trackId)
|
||||
.where("l.user_id = ?").bind(userId)
|
||||
.where("l.backend = ?").bind(backend)
|
||||
.where("l.backend = u.scrobbling_backend")
|
||||
.resultValue();
|
||||
}
|
||||
|
||||
std::size_t Listen::getCount(Session& session, UserId userId, ScrobblingBackend backend, ReleaseId releaseId)
|
||||
std::size_t Listen::getCount(Session& session, UserId userId, ReleaseId releaseId)
|
||||
{
|
||||
session.checkReadTransaction();
|
||||
|
||||
return session.getDboSession().query<int>("SELECT IFNULL(MIN(count_result), 0)"
|
||||
return session.getDboSession().query<int>(
|
||||
"SELECT IFNULL(MIN(count_result), 0)"
|
||||
" FROM ("
|
||||
" SELECT COUNT(l.track_id) AS count_result"
|
||||
" FROM track t"
|
||||
" LEFT JOIN listen l ON t.id = l.track_id AND l.backend = ? AND l.user_id = ?"
|
||||
" LEFT JOIN listen l ON t.id = l.track_id AND l.backend = (SELECT scrobbling_backend FROM user WHERE id = ?) AND l.user_id = ?"
|
||||
" WHERE t.release_id = ?"
|
||||
" GROUP BY t.id)")
|
||||
.bind(backend)
|
||||
.bind(userId)
|
||||
.bind(userId)
|
||||
.bind(releaseId)
|
||||
.resultValue();
|
||||
|
||||
@@ -73,8 +73,8 @@ namespace Database
|
||||
static RangeResults<ReleaseId> getRecentReleases(Session& session, UserId userId, ScrobblingBackend backend, const std::vector<ClusterId>& clusterIds, std::optional<Range> range = std::nullopt);
|
||||
static RangeResults<TrackId> getRecentTracks(Session& session, UserId userId, ScrobblingBackend backend, const std::vector<ClusterId>& clusterIds, std::optional<Range> range = std::nullopt);
|
||||
|
||||
static std::size_t getCount(Session& session, UserId userId, ScrobblingBackend backend, TrackId trackId);
|
||||
static std::size_t getCount(Session& session, UserId userId, ScrobblingBackend backend, ReleaseId trackId);
|
||||
static std::size_t getCount(Session& session, UserId userId, TrackId trackId); // for the current backend
|
||||
static std::size_t getCount(Session& session, UserId userId, ReleaseId trackId); // for the current backend
|
||||
|
||||
static pointer getMostRecentListen(Session& session, UserId userId, ScrobblingBackend backend, ReleaseId releaseId);
|
||||
static pointer getMostRecentListen(Session& session, UserId userId, ScrobblingBackend backend, TrackId releaseId);
|
||||
|
||||
@@ -881,7 +881,7 @@ TEST_F(DatabaseFixture, Listen_getCount_track)
|
||||
{
|
||||
auto transaction{ session.createReadTransaction() };
|
||||
|
||||
const std::size_t count{ Listen::getCount(session, user->getId(), ScrobblingBackend::Internal, track.getId()) };
|
||||
const std::size_t count{ Listen::getCount(session, user->getId(), track.getId()) };
|
||||
EXPECT_EQ(count, 0);
|
||||
}
|
||||
|
||||
@@ -891,9 +891,21 @@ TEST_F(DatabaseFixture, Listen_getCount_track)
|
||||
{
|
||||
auto transaction{ session.createReadTransaction() };
|
||||
|
||||
const std::size_t count{ Listen::getCount(session, user->getId(), ScrobblingBackend::Internal, track.getId()) };
|
||||
const std::size_t count{ Listen::getCount(session, user->getId(), track.getId()) };
|
||||
EXPECT_EQ(count, 1);
|
||||
}
|
||||
|
||||
{
|
||||
auto transaction{ session.createWriteTransaction() };
|
||||
user.get().modify()->setScrobblingBackend(ScrobblingBackend::ListenBrainz);
|
||||
}
|
||||
|
||||
{
|
||||
auto transaction{ session.createReadTransaction() };
|
||||
const std::size_t count{ Listen::getCount(session, user->getId(), track.getId()) };
|
||||
EXPECT_EQ(count, 0);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
TEST_F(DatabaseFixture, Listen_getCount_release)
|
||||
@@ -906,7 +918,7 @@ TEST_F(DatabaseFixture, Listen_getCount_release)
|
||||
auto getReleaseListenCount{ [&]
|
||||
{
|
||||
auto transaction{ session.createReadTransaction() };
|
||||
return Listen::getCount(session, user->getId(), ScrobblingBackend::Internal, release.getId());
|
||||
return Listen::getCount(session, user->getId(), release.getId());
|
||||
} };
|
||||
|
||||
EXPECT_EQ(getReleaseListenCount(), 0);
|
||||
@@ -936,6 +948,12 @@ TEST_F(DatabaseFixture, Listen_getCount_release)
|
||||
|
||||
ScopedListen listen4{ session, user.lockAndGet(), track1.lockAndGet(), ScrobblingBackend::Internal, dateTime1 };
|
||||
EXPECT_EQ(getReleaseListenCount(), 2);
|
||||
|
||||
{
|
||||
auto transaction{ session.createWriteTransaction() };
|
||||
user.get().modify()->setScrobblingBackend(ScrobblingBackend::ListenBrainz);
|
||||
}
|
||||
EXPECT_EQ(getReleaseListenCount(), 0);
|
||||
}
|
||||
|
||||
TEST_F(DatabaseFixture, Listen_getMostRecentTrack)
|
||||
|
||||
@@ -129,6 +129,20 @@ namespace Scrobbling
|
||||
return res;
|
||||
}
|
||||
|
||||
std::size_t ScrobblingService::getCount(Database::UserId userId, Database::ReleaseId releaseId)
|
||||
{
|
||||
Session& session{ _db.getTLSSession() };
|
||||
auto transaction{ session.createReadTransaction() };
|
||||
return Database::Listen::getCount(session, userId, releaseId);
|
||||
}
|
||||
|
||||
std::size_t ScrobblingService::getCount(Database::UserId userId, Database::TrackId trackId)
|
||||
{
|
||||
Session& session{ _db.getTLSSession() };
|
||||
auto transaction{ session.createReadTransaction() };
|
||||
return Database::Listen::getCount(session, userId, trackId);
|
||||
}
|
||||
|
||||
Wt::WDateTime ScrobblingService::getLastListenDateTime(Database::UserId userId, Database::ReleaseId releaseId)
|
||||
{
|
||||
const auto backend{ getUserBackend(userId) };
|
||||
|
||||
@@ -43,6 +43,9 @@ namespace Scrobbling
|
||||
ReleaseContainer getRecentReleases(Database::UserId userId, const std::vector<Database::ClusterId>& clusterIds,Database::Range range) override;
|
||||
TrackContainer getRecentTracks(Database::UserId userId, const std::vector<Database::ClusterId>& clusterIds, Database::Range range) override;
|
||||
|
||||
std::size_t getCount(Database::UserId userId, Database::ReleaseId releaseId) override;
|
||||
std::size_t getCount(Database::UserId userId, Database::TrackId trackId) override;
|
||||
|
||||
Wt::WDateTime getLastListenDateTime(Database::UserId userId, Database::ReleaseId releaseId) override;
|
||||
Wt::WDateTime getLastListenDateTime(Database::UserId userId, Database::TrackId trackId) override;
|
||||
|
||||
|
||||
@@ -61,6 +61,9 @@ namespace Scrobbling
|
||||
virtual ReleaseContainer getRecentReleases(Database::UserId userId, const std::vector<Database::ClusterId>& clusterIds, Database::Range range) = 0;
|
||||
virtual TrackContainer getRecentTracks(Database::UserId userId, const std::vector<Database::ClusterId>& clusterIds, Database::Range range) = 0;
|
||||
|
||||
virtual std::size_t getCount(Database::UserId userId, Database::ReleaseId releaseId) = 0;
|
||||
virtual std::size_t getCount(Database::UserId userId, Database::TrackId trackId) = 0;
|
||||
|
||||
virtual Wt::WDateTime getLastListenDateTime(Database::UserId userId, Database::ReleaseId releaseId) = 0;
|
||||
virtual Wt::WDateTime getLastListenDateTime(Database::UserId userId, Database::TrackId trackId) = 0;
|
||||
|
||||
|
||||
Reference in New Issue
Block a user