From 50ecfb13786ed2e81d10a5f5907c83678aa77617 Mon Sep 17 00:00:00 2001 From: emeric Date: Tue, 2 Apr 2024 23:04:54 +0200 Subject: [PATCH] More query wrapped + fixed typo --- src/libs/database/impl/Cluster.cpp | 3 ++- src/libs/database/impl/Release.cpp | 10 +++++--- src/libs/database/impl/Track.cpp | 4 +-- .../database/include/database/Cluster.hpp | 2 +- .../database/include/database/Release.hpp | 2 +- src/libs/database/test/Release.cpp | 25 +++++++++++++++++++ src/libs/subsonic/impl/responses/Album.cpp | 2 +- src/libs/subsonic/impl/responses/Genre.cpp | 2 +- 8 files changed, 39 insertions(+), 11 deletions(-) diff --git a/src/libs/database/impl/Cluster.cpp b/src/libs/database/impl/Cluster.cpp index 704a334f..76065a8b 100644 --- a/src/libs/database/impl/Cluster.cpp +++ b/src/libs/database/impl/Cluster.cpp @@ -26,6 +26,7 @@ #include "database/Session.hpp" #include "database/Track.hpp" #include "IdTypeTraits.hpp" +#include "StringViewTraits.hpp" #include "SqlQuery.hpp" #include "Utils.hpp" @@ -202,7 +203,7 @@ namespace lms::db { session.checkReadTransaction(); - return utils::fetchQuerySingleResult(session.getDboSession()->find().where("name = ?").bind(std::string{ name })); + return utils::fetchQuerySingleResult(session.getDboSession()->find().where("name = ?").bind(name)); } ClusterType::pointer ClusterType::find(Session& session, ClusterTypeId id) diff --git a/src/libs/database/impl/Release.cpp b/src/libs/database/impl/Release.cpp index 7c4a844e..8fb77601 100644 --- a/src/libs/database/impl/Release.cpp +++ b/src/libs/database/impl/Release.cpp @@ -530,15 +530,17 @@ namespace lms::db return getArtists().size() > 1; } - std::size_t Release::getTracksCount() const + std::size_t Release::getTrackCount() const { - return _tracks.size(); + assert(session()); + return utils::fetchQuerySingleResult(session()->query("SELECT COUNT(t.id) FROM track t INNER JOIN release r ON r.id = t.release_id") + .where("r.id = ?").bind(getId())); } - std::vector> Release::getReleaseTypes() const + std::vector Release::getReleaseTypes() const { // TODO remove? - return std::vector>(_releaseTypes.begin(), _releaseTypes.end()); + return utils::fetchQueryResults(_releaseTypes.find()); } std::vector Release::getReleaseTypeNames() const diff --git a/src/libs/database/impl/Track.cpp b/src/libs/database/impl/Track.cpp index 068620eb..bafa304e 100644 --- a/src/libs/database/impl/Track.cpp +++ b/src/libs/database/impl/Track.cpp @@ -316,7 +316,7 @@ namespace lms::db std::vector Track::getClusters() const { - return std::vector(_clusters.begin(), _clusters.end()); + return utils::fetchQueryResults(_clusters.find()); } std::vector Track::getClusterIds() const @@ -490,7 +490,7 @@ namespace lms::db std::vector Track::getArtistLinks() const { - return std::vector(_trackArtistLinks.begin(), _trackArtistLinks.end()); + return utils::fetchQueryResults(_trackArtistLinks.find()); } std::vector> Track::getClusterGroups(const std::vector& clusterTypeIds, std::size_t size) const diff --git a/src/libs/database/include/database/Cluster.hpp b/src/libs/database/include/database/Cluster.hpp index ae869778..4408d2c2 100644 --- a/src/libs/database/include/database/Cluster.hpp +++ b/src/libs/database/include/database/Cluster.hpp @@ -75,7 +75,7 @@ namespace lms::db // Accessors std::string_view getName() const { return _name; } ObjectPtr getType() const { return _clusterType; } - std::size_t getTracksCount() const { return _trackCount; } + std::size_t getTrackCount() const { return _trackCount; } RangeResults getTracks(std::optional range = std::nullopt) const; std::size_t getReleasesCount() const { return _releaseCount; }; diff --git a/src/libs/database/include/database/Release.hpp b/src/libs/database/include/database/Release.hpp index c9a79bcf..2933d481 100644 --- a/src/libs/database/include/database/Release.hpp +++ b/src/libs/database/include/database/Release.hpp @@ -154,7 +154,7 @@ namespace lms::db std::chrono::milliseconds getDuration() const; Wt::WDateTime getLastWritten() const; std::string_view getArtistDisplayName() const { return _artistDisplayName; } - std::size_t getTracksCount() const; + std::size_t getTrackCount() const; std::vector> getReleaseTypes() const; std::vector getReleaseTypeNames() const; diff --git a/src/libs/database/test/Release.cpp b/src/libs/database/test/Release.cpp index 22540e51..89d3fade 100644 --- a/src/libs/database/test/Release.cpp +++ b/src/libs/database/test/Release.cpp @@ -910,4 +910,29 @@ namespace lms::db::tests } checkExpectedBitrate(192); // 0 should not be taken into account } + + TEST_F(DatabaseFixture, Release_trackCount) + { + ScopedRelease release1{ session, "MyRelease1" }; + ScopedRelease release2{ session, "MyRelease2" }; + ScopedRelease release3{ session, "MyRelease2" }; + + ScopedTrack track1{ session, "MyTrack1" }; + ScopedTrack track2{ session, "MyTrack2" }; + ScopedTrack track3{ session, "MyTrack3" }; + + { + auto transaction{ session.createWriteTransaction() }; + track1.get().modify()->setRelease(release1.get()); + track2.get().modify()->setRelease(release1.get()); + track3.get().modify()->setRelease(release2.get()); + } + + { + auto transaction{ session.createReadTransaction() }; + EXPECT_EQ(release1->getTrackCount(), 2); + EXPECT_EQ(release2->getTrackCount(), 1); + EXPECT_EQ(release3->getTrackCount(), 0); + } + } } \ No newline at end of file diff --git a/src/libs/subsonic/impl/responses/Album.cpp b/src/libs/subsonic/impl/responses/Album.cpp index 8e16b33a..163a89b2 100644 --- a/src/libs/subsonic/impl/responses/Album.cpp +++ b/src/libs/subsonic/impl/responses/Album.cpp @@ -47,7 +47,7 @@ namespace lms::api::subsonic if (id3) { albumNode.setAttribute("name", release->getName()); - albumNode.setAttribute("songCount", release->getTracksCount()); + albumNode.setAttribute("songCount", release->getTrackCount()); albumNode.setAttribute( "duration", std::chrono::duration_cast( release->getDuration()) diff --git a/src/libs/subsonic/impl/responses/Genre.cpp b/src/libs/subsonic/impl/responses/Genre.cpp index 9f761032..6b4fb015 100644 --- a/src/libs/subsonic/impl/responses/Genre.cpp +++ b/src/libs/subsonic/impl/responses/Genre.cpp @@ -28,7 +28,7 @@ namespace lms::api::subsonic Response::Node clusterNode; clusterNode.setValue(cluster->getName()); - clusterNode.setAttribute("songCount", cluster->getTracksCount()); + clusterNode.setAttribute("songCount", cluster->getTrackCount()); clusterNode.setAttribute("albumCount", cluster->getReleasesCount()); return clusterNode;