diff --git a/src/libs/av/impl/AudioFile.cpp b/src/libs/av/impl/AudioFile.cpp index 7aead667..a90636ef 100644 --- a/src/libs/av/impl/AudioFile.cpp +++ b/src/libs/av/impl/AudioFile.cpp @@ -178,7 +178,7 @@ AudioFile::getBestStream() const } bool -AudioFile::hasAttachedPictures(void) const +AudioFile::hasAttachedPictures() const { for (std::size_t i = 0; i < _context->nb_streams; ++i) { diff --git a/src/libs/services/database/impl/Release.cpp b/src/libs/services/database/impl/Release.cpp index 1b2bf630..f6fc2b73 100644 --- a/src/libs/services/database/impl/Release.cpp +++ b/src/libs/services/database/impl/Release.cpp @@ -264,7 +264,7 @@ Release::find(Session& session, const FindParameters& params) } std::optional -Release::getTotalTrack(void) const +Release::getTotalTrack() const { assert(session()); @@ -276,7 +276,7 @@ Release::getTotalTrack(void) const } std::optional -Release::getTotalDisc(void) const +Release::getTotalDisc() const { assert(session()); @@ -287,6 +287,18 @@ Release::getTotalDisc(void) const return (res > 0) ? std::make_optional(res) : std::nullopt; } +std::size_t +Release::getDiscCount() const +{ + assert(session()); + int res {session()->query("SELECT COUNT(DISTINCT disc_number) FROM track t") + .join("release r ON r.id = t.release_id") + .where("r.id = ?") + .bind(getId())}; + + return res; +} + std::optional Release::getReleaseYear(bool original) const { diff --git a/src/libs/services/database/impl/SqlQuery.cpp b/src/libs/services/database/impl/SqlQuery.cpp index b08cd1ce..0be0511f 100644 --- a/src/libs/services/database/impl/SqlQuery.cpp +++ b/src/libs/services/database/impl/SqlQuery.cpp @@ -58,7 +58,7 @@ WhereClause::Or(const WhereClause& otherClause) } std::string -WhereClause::get(void) const +WhereClause::get() const { if (!_clause.empty()) return "WHERE " + _clause; @@ -176,7 +176,7 @@ FromClause::get() const } std::string -SqlQuery::get(void) const +SqlQuery::get() const { std::ostringstream oss; diff --git a/src/libs/services/database/impl/SqlQuery.hpp b/src/libs/services/database/impl/SqlQuery.hpp index bb15408a..21e20fee 100644 --- a/src/libs/services/database/impl/SqlQuery.hpp +++ b/src/libs/services/database/impl/SqlQuery.hpp @@ -36,7 +36,7 @@ class WhereClause WhereClause& bind(const std::string& arg); std::string get() const; - const std::list& getBindArgs(void) const {return _bindArgs;} + const std::list& getBindArgs() const {return _bindArgs;} private: std::string _clause; // WHERE clause @@ -101,15 +101,15 @@ class FromClause class SqlQuery { public: - SelectStatement& select(void) { return _selectStatement;} + SelectStatement& select() { return _selectStatement;} SelectStatement& select(const std::string& statement) { _selectStatement = SelectStatement(statement); return _selectStatement; } - FromClause& from(void) { return _fromClause; } + FromClause& from() { return _fromClause; } FromClause& from(const std::string& clause) { _whereClause = WhereClause(clause); return _fromClause; } - InnerJoinClause& innerJoin(void) { return _innerJoinClause; } - WhereClause& where(void) { return _whereClause; } - const WhereClause& where(void) const { return _whereClause; } - GroupByStatement& groupBy(void) { return _groupByStatement; } - const GroupByStatement& groupBy(void) const { return _groupByStatement; } + InnerJoinClause& innerJoin() { return _innerJoinClause; } + WhereClause& where() { return _whereClause; } + const WhereClause& where() const { return _whereClause; } + GroupByStatement& groupBy() { return _groupByStatement; } + const GroupByStatement& groupBy() const { return _groupByStatement; } std::string get() const; diff --git a/src/libs/services/database/include/services/database/Release.hpp b/src/libs/services/database/include/services/database/Release.hpp index 0bf62e43..2079fc41 100644 --- a/src/libs/services/database/include/services/database/Release.hpp +++ b/src/libs/services/database/include/services/database/Release.hpp @@ -107,6 +107,7 @@ class Release : public Object std::optional getMBID() const { return UUID::fromString(_MBID); } std::optional getTotalTrack() const; std::optional getTotalDisc() const; + std::size_t getDiscCount() const; // may not be total disc (if incomplete for example) std::chrono::milliseconds getDuration() const; Wt::WDateTime getLastWritten() const; diff --git a/src/libs/services/database/test/Common.cpp b/src/libs/services/database/test/Common.cpp index 033aa754..89a43da8 100644 --- a/src/libs/services/database/test/Common.cpp +++ b/src/libs/services/database/test/Common.cpp @@ -207,5 +207,3 @@ TEST_F(DatabaseFixture, Common_subRange) } } - - diff --git a/src/libs/services/database/test/Release.cpp b/src/libs/services/database/test/Release.cpp index 08c34068..450db6ca 100644 --- a/src/libs/services/database/test/Release.cpp +++ b/src/libs/services/database/test/Release.cpp @@ -464,3 +464,47 @@ TEST_F(DatabaseFixture, Release_artist) } } +TEST_F(DatabaseFixture, Release_getDiscCount) +{ + ScopedRelease release {session, "MyRelease"}; + ScopedTrack track {session, "MyTrack"}; + ScopedTrack track2 {session, "MyTrack2"}; + + { + auto transaction {session.createSharedTransaction()}; + EXPECT_EQ(release.get()->getDiscCount(), 0); + } + { + auto transaction {session.createUniqueTransaction()}; + track.get().modify()->setRelease(release.get()); + } + { + auto transaction {session.createSharedTransaction()}; + EXPECT_EQ(release.get()->getDiscCount(), 1); + } + { + auto transaction {session.createUniqueTransaction()}; + track.get().modify()->setDiscNumber(5); + } + { + auto transaction {session.createSharedTransaction()}; + EXPECT_EQ(release.get()->getDiscCount(), 1); + } + { + auto transaction {session.createUniqueTransaction()}; + track2.get().modify()->setRelease(release.get()); + track2.get().modify()->setDiscNumber(5); + } + { + auto transaction {session.createSharedTransaction()}; + EXPECT_EQ(release.get()->getDiscCount(), 1); + } + { + auto transaction {session.createUniqueTransaction()}; + track2.get().modify()->setDiscNumber(6); + } + { + auto transaction {session.createSharedTransaction()}; + EXPECT_EQ(release.get()->getDiscCount(), 2); + } +} diff --git a/src/lms/ui/explore/ReleaseView.cpp b/src/lms/ui/explore/ReleaseView.cpp index b4f38bf2..f003cebe 100644 --- a/src/lms/ui/explore/ReleaseView.cpp +++ b/src/lms/ui/explore/ReleaseView.cpp @@ -197,7 +197,8 @@ Release::refreshView() const bool variousArtists {release->hasVariousArtists()}; const auto totalDisc {release->getTotalDisc()}; - const bool isReleaseMultiDisc {totalDisc && *totalDisc > 1}; + const std::size_t discCount {release->getDiscCount()}; + const bool isReleaseMultiDisc {(discCount > 1) || (totalDisc && *totalDisc > 1)}; // Expect to be called in asc order std::map trackContainers;