More query wrapped + fixed typo
This commit is contained in:
@@ -26,6 +26,7 @@
|
|||||||
#include "database/Session.hpp"
|
#include "database/Session.hpp"
|
||||||
#include "database/Track.hpp"
|
#include "database/Track.hpp"
|
||||||
#include "IdTypeTraits.hpp"
|
#include "IdTypeTraits.hpp"
|
||||||
|
#include "StringViewTraits.hpp"
|
||||||
#include "SqlQuery.hpp"
|
#include "SqlQuery.hpp"
|
||||||
#include "Utils.hpp"
|
#include "Utils.hpp"
|
||||||
|
|
||||||
@@ -202,7 +203,7 @@ namespace lms::db
|
|||||||
{
|
{
|
||||||
session.checkReadTransaction();
|
session.checkReadTransaction();
|
||||||
|
|
||||||
return utils::fetchQuerySingleResult(session.getDboSession()->find<ClusterType>().where("name = ?").bind(std::string{ name }));
|
return utils::fetchQuerySingleResult(session.getDboSession()->find<ClusterType>().where("name = ?").bind(name));
|
||||||
}
|
}
|
||||||
|
|
||||||
ClusterType::pointer ClusterType::find(Session& session, ClusterTypeId id)
|
ClusterType::pointer ClusterType::find(Session& session, ClusterTypeId id)
|
||||||
|
|||||||
@@ -530,15 +530,17 @@ namespace lms::db
|
|||||||
return getArtists().size() > 1;
|
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<int>("SELECT COUNT(t.id) FROM track t INNER JOIN release r ON r.id = t.release_id")
|
||||||
|
.where("r.id = ?").bind(getId()));
|
||||||
}
|
}
|
||||||
|
|
||||||
std::vector<ObjectPtr<ReleaseType>> Release::getReleaseTypes() const
|
std::vector<ReleaseType::pointer> Release::getReleaseTypes() const
|
||||||
{
|
{
|
||||||
// TODO remove?
|
// TODO remove?
|
||||||
return std::vector<ObjectPtr<ReleaseType>>(_releaseTypes.begin(), _releaseTypes.end());
|
return utils::fetchQueryResults<ReleaseType::pointer>(_releaseTypes.find());
|
||||||
}
|
}
|
||||||
|
|
||||||
std::vector<std::string> Release::getReleaseTypeNames() const
|
std::vector<std::string> Release::getReleaseTypeNames() const
|
||||||
|
|||||||
@@ -316,7 +316,7 @@ namespace lms::db
|
|||||||
|
|
||||||
std::vector<Cluster::pointer> Track::getClusters() const
|
std::vector<Cluster::pointer> Track::getClusters() const
|
||||||
{
|
{
|
||||||
return std::vector<Cluster::pointer>(_clusters.begin(), _clusters.end());
|
return utils::fetchQueryResults<Cluster::pointer>(_clusters.find());
|
||||||
}
|
}
|
||||||
|
|
||||||
std::vector<ClusterId> Track::getClusterIds() const
|
std::vector<ClusterId> Track::getClusterIds() const
|
||||||
@@ -490,7 +490,7 @@ namespace lms::db
|
|||||||
|
|
||||||
std::vector<TrackArtistLink::pointer> Track::getArtistLinks() const
|
std::vector<TrackArtistLink::pointer> Track::getArtistLinks() const
|
||||||
{
|
{
|
||||||
return std::vector<TrackArtistLink::pointer>(_trackArtistLinks.begin(), _trackArtistLinks.end());
|
return utils::fetchQueryResults<TrackArtistLink::pointer>(_trackArtistLinks.find());
|
||||||
}
|
}
|
||||||
|
|
||||||
std::vector<std::vector<Cluster::pointer>> Track::getClusterGroups(const std::vector<ClusterTypeId>& clusterTypeIds, std::size_t size) const
|
std::vector<std::vector<Cluster::pointer>> Track::getClusterGroups(const std::vector<ClusterTypeId>& clusterTypeIds, std::size_t size) const
|
||||||
|
|||||||
@@ -75,7 +75,7 @@ namespace lms::db
|
|||||||
// Accessors
|
// Accessors
|
||||||
std::string_view getName() const { return _name; }
|
std::string_view getName() const { return _name; }
|
||||||
ObjectPtr<ClusterType> getType() const { return _clusterType; }
|
ObjectPtr<ClusterType> getType() const { return _clusterType; }
|
||||||
std::size_t getTracksCount() const { return _trackCount; }
|
std::size_t getTrackCount() const { return _trackCount; }
|
||||||
RangeResults<TrackId> getTracks(std::optional<Range> range = std::nullopt) const;
|
RangeResults<TrackId> getTracks(std::optional<Range> range = std::nullopt) const;
|
||||||
std::size_t getReleasesCount() const { return _releaseCount; };
|
std::size_t getReleasesCount() const { return _releaseCount; };
|
||||||
|
|
||||||
|
|||||||
@@ -154,7 +154,7 @@ namespace lms::db
|
|||||||
std::chrono::milliseconds getDuration() const;
|
std::chrono::milliseconds getDuration() const;
|
||||||
Wt::WDateTime getLastWritten() const;
|
Wt::WDateTime getLastWritten() const;
|
||||||
std::string_view getArtistDisplayName() const { return _artistDisplayName; }
|
std::string_view getArtistDisplayName() const { return _artistDisplayName; }
|
||||||
std::size_t getTracksCount() const;
|
std::size_t getTrackCount() const;
|
||||||
std::vector<ObjectPtr<ReleaseType>> getReleaseTypes() const;
|
std::vector<ObjectPtr<ReleaseType>> getReleaseTypes() const;
|
||||||
std::vector<std::string> getReleaseTypeNames() const;
|
std::vector<std::string> getReleaseTypeNames() const;
|
||||||
|
|
||||||
|
|||||||
@@ -910,4 +910,29 @@ namespace lms::db::tests
|
|||||||
}
|
}
|
||||||
checkExpectedBitrate(192); // 0 should not be taken into account
|
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);
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
@@ -47,7 +47,7 @@ namespace lms::api::subsonic
|
|||||||
|
|
||||||
if (id3) {
|
if (id3) {
|
||||||
albumNode.setAttribute("name", release->getName());
|
albumNode.setAttribute("name", release->getName());
|
||||||
albumNode.setAttribute("songCount", release->getTracksCount());
|
albumNode.setAttribute("songCount", release->getTrackCount());
|
||||||
albumNode.setAttribute(
|
albumNode.setAttribute(
|
||||||
"duration", std::chrono::duration_cast<std::chrono::seconds>(
|
"duration", std::chrono::duration_cast<std::chrono::seconds>(
|
||||||
release->getDuration())
|
release->getDuration())
|
||||||
|
|||||||
@@ -28,7 +28,7 @@ namespace lms::api::subsonic
|
|||||||
Response::Node clusterNode;
|
Response::Node clusterNode;
|
||||||
|
|
||||||
clusterNode.setValue(cluster->getName());
|
clusterNode.setValue(cluster->getName());
|
||||||
clusterNode.setAttribute("songCount", cluster->getTracksCount());
|
clusterNode.setAttribute("songCount", cluster->getTrackCount());
|
||||||
clusterNode.setAttribute("albumCount", cluster->getReleasesCount());
|
clusterNode.setAttribute("albumCount", cluster->getReleasesCount());
|
||||||
|
|
||||||
return clusterNode;
|
return clusterNode;
|
||||||
|
|||||||
Reference in New Issue
Block a user