From 77f9b033ed5f14444e055133bf3169b532a1240d Mon Sep 17 00:00:00 2001 From: emeric Date: Sun, 14 Jun 2026 14:19:19 +0200 Subject: [PATCH] Removed useless group by --- src/libs/database/impl/objects/Cluster.cpp | 5 ++-- src/libs/database/test/Cluster.cpp | 34 ++++++++++++++++++++++ src/libs/database/test/TrackArtistLink.cpp | 31 ++++++++++++++++++++ 3 files changed, 68 insertions(+), 2 deletions(-) diff --git a/src/libs/database/impl/objects/Cluster.cpp b/src/libs/database/impl/objects/Cluster.cpp index 71cedbc9..44e63e45 100644 --- a/src/libs/database/impl/objects/Cluster.cpp +++ b/src/libs/database/impl/objects/Cluster.cpp @@ -51,7 +51,6 @@ namespace lms::db session.checkReadTransaction(); auto query{ session.getDboSession()->query("SELECT " + std::string{ itemToSelect } + " FROM cluster c") }; - query.groupBy("c.id"); if (params.track.isValid() || params.release.isValid()) query.join("track_cluster t_c ON t_c.cluster_id = c.id"); @@ -83,7 +82,9 @@ namespace lms::db break; } - query.groupBy("c.id"); + // track_cluster has a UNIQUE constraint on (track_id, cluster_id), so no duplicates can occur when filtering by track + if (!params.track.isValid()) + query.groupBy("c.id"); return query; } diff --git a/src/libs/database/test/Cluster.cpp b/src/libs/database/test/Cluster.cpp index 4eb6d57e..4936a6a5 100644 --- a/src/libs/database/test/Cluster.cpp +++ b/src/libs/database/test/Cluster.cpp @@ -723,4 +723,38 @@ namespace lms::db::tests } } + TEST_F(DatabaseFixture, Cluster_findByTrackAndTypeName) + { + ScopedTrack track{ session }; + ScopedClusterType genreType{ session, "GENRE" }; + ScopedClusterType moodType{ session, "MOOD" }; + ScopedCluster genre1{ session, genreType.lockAndGet(), "Rock" }; + ScopedCluster genre2{ session, genreType.lockAndGet(), "Pop" }; + ScopedCluster mood{ session, moodType.lockAndGet(), "Happy" }; + + { + auto transaction{ session.createWriteTransaction() }; + genre1.get().modify()->addTrack(track.get()); + genre2.get().modify()->addTrack(track.get()); + mood.get().modify()->addTrack(track.get()); + } + + { + auto transaction{ session.createReadTransaction() }; + + const auto genres{ Cluster::find(session, Cluster::FindParameters{}.setTrack(track.getId()).setClusterTypeName("GENRE")) }; + ASSERT_EQ(genres.results.size(), 2); + + const auto moods{ Cluster::find(session, Cluster::FindParameters{}.setTrack(track.getId()).setClusterTypeName("MOOD")) }; + ASSERT_EQ(moods.results.size(), 1); + EXPECT_EQ(moods.results.front()->getId(), mood.getId()); + + const auto all{ Cluster::find(session, Cluster::FindParameters{}.setTrack(track.getId())) }; + EXPECT_EQ(all.results.size(), 3); + + const auto none{ Cluster::find(session, Cluster::FindParameters{}.setTrack(track.getId()).setClusterTypeName("GROUPING")) }; + EXPECT_EQ(none.results.size(), 0); + } + } + } // namespace lms::db::tests \ No newline at end of file diff --git a/src/libs/database/test/TrackArtistLink.cpp b/src/libs/database/test/TrackArtistLink.cpp index 27d1a487..8e021367 100644 --- a/src/libs/database/test/TrackArtistLink.cpp +++ b/src/libs/database/test/TrackArtistLink.cpp @@ -275,4 +275,35 @@ namespace lms::db::tests EXPECT_EQ(links[0]->getTrack()->getId(), track2.getId()); } } + + TEST_F(DatabaseFixture, Track_getArtists_typeFilterAndOrder) + { + ScopedTrack track{ session }; + ScopedArtist artist1{ session, "Artist1" }; + ScopedArtist artist2{ session, "Artist2" }; + + { + auto transaction{ session.createWriteTransaction() }; + session.create(track.get(), artist1.get(), TrackArtistLinkType::Artist, false); + session.create(track.get(), artist2.get(), TrackArtistLinkType::Artist, false); + session.create(track.get(), artist1.get(), TrackArtistLinkType::Mixer, false); + } + + { + auto transaction{ session.createReadTransaction() }; + + const auto artistLinks{ track->getArtists({ TrackArtistLinkType::Artist }) }; + ASSERT_EQ(artistLinks.size(), 2); + EXPECT_EQ(artistLinks[0]->getId(), artist1.getId()); + EXPECT_EQ(artistLinks[1]->getId(), artist2.getId()); + + const auto mixerLinks{ track->getArtists({ TrackArtistLinkType::Mixer }) }; + ASSERT_EQ(mixerLinks.size(), 1); + EXPECT_EQ(mixerLinks[0]->getId(), artist1.getId()); + + const auto noFilter{ track->getArtists({}) }; + EXPECT_EQ(noFilter.size(), 2); + } + } + } // namespace lms::db::tests \ No newline at end of file