Removed useless redundant query
This commit is contained in:
@@ -306,4 +306,87 @@ namespace lms::db::tests
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
TEST_F(DatabaseFixture, Track_getArtistIds_typeFilter)
|
||||||
|
{
|
||||||
|
ScopedTrack track{ session };
|
||||||
|
ScopedArtist artist1{ session, "Artist1" };
|
||||||
|
ScopedArtist artist2{ session, "Artist2" };
|
||||||
|
|
||||||
|
{
|
||||||
|
auto transaction{ session.createWriteTransaction() };
|
||||||
|
session.create<TrackArtistLink>(track.get(), artist1.get(), TrackArtistLinkType::Artist, false);
|
||||||
|
session.create<TrackArtistLink>(track.get(), artist2.get(), TrackArtistLinkType::Artist, false);
|
||||||
|
session.create<TrackArtistLink>(track.get(), artist1.get(), TrackArtistLinkType::Mixer, false);
|
||||||
|
}
|
||||||
|
|
||||||
|
{
|
||||||
|
auto transaction{ session.createReadTransaction() };
|
||||||
|
|
||||||
|
const auto artistIds{ track->getArtistIds({ TrackArtistLinkType::Artist }) };
|
||||||
|
ASSERT_EQ(artistIds.size(), 2);
|
||||||
|
EXPECT_EQ(artistIds[0], artist1.getId());
|
||||||
|
EXPECT_EQ(artistIds[1], artist2.getId());
|
||||||
|
|
||||||
|
const auto mixerIds{ track->getArtistIds({ TrackArtistLinkType::Mixer }) };
|
||||||
|
ASSERT_EQ(mixerIds.size(), 1);
|
||||||
|
EXPECT_EQ(mixerIds[0], artist1.getId());
|
||||||
|
|
||||||
|
const auto noFilter{ track->getArtistIds({}) };
|
||||||
|
EXPECT_EQ(noFilter.size(), 2);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
TEST_F(DatabaseFixture, Track_visitArtistLinks_orderedById)
|
||||||
|
{
|
||||||
|
ScopedTrack track{ session };
|
||||||
|
ScopedArtist artist1{ session, "Artist1" };
|
||||||
|
ScopedArtist artist2{ session, "Artist2" };
|
||||||
|
|
||||||
|
TrackArtistLinkId link1Id;
|
||||||
|
|
||||||
|
{
|
||||||
|
auto transaction{ session.createWriteTransaction() };
|
||||||
|
auto link1{ session.create<TrackArtistLink>(track.get(), artist1.get(), TrackArtistLinkType::Artist, false) };
|
||||||
|
link1Id = link1->getId();
|
||||||
|
session.create<TrackArtistLink>(track.get(), artist2.get(), TrackArtistLinkType::Artist, false);
|
||||||
|
}
|
||||||
|
|
||||||
|
{
|
||||||
|
auto transaction{ session.createReadTransaction() };
|
||||||
|
|
||||||
|
std::vector<db::TrackArtistLink::pointer> links;
|
||||||
|
track->visitArtistLinks([&](const db::TrackArtistLink::pointer& link) {
|
||||||
|
links.push_back(link);
|
||||||
|
});
|
||||||
|
|
||||||
|
ASSERT_EQ(links.size(), 2);
|
||||||
|
EXPECT_EQ(links[0]->getArtistId(), artist1.getId());
|
||||||
|
EXPECT_EQ(links[1]->getArtistId(), artist2.getId());
|
||||||
|
}
|
||||||
|
|
||||||
|
{
|
||||||
|
auto transaction{ session.createWriteTransaction() };
|
||||||
|
TrackArtistLink::find(session, link1Id).remove();
|
||||||
|
}
|
||||||
|
|
||||||
|
{
|
||||||
|
auto transaction{ session.createWriteTransaction() };
|
||||||
|
session.create<TrackArtistLink>(track.get(), artist1.get(), TrackArtistLinkType::Artist, false);
|
||||||
|
}
|
||||||
|
|
||||||
|
// artist2's link has lower id, artist1's re-created link has higher id.
|
||||||
|
{
|
||||||
|
auto transaction{ session.createReadTransaction() };
|
||||||
|
|
||||||
|
std::vector<db::TrackArtistLink::pointer> links;
|
||||||
|
track->visitArtistLinks([&](const db::TrackArtistLink::pointer& link) {
|
||||||
|
links.push_back(link);
|
||||||
|
});
|
||||||
|
|
||||||
|
ASSERT_EQ(links.size(), 2);
|
||||||
|
EXPECT_EQ(links[0]->getArtistId(), artist2.getId());
|
||||||
|
EXPECT_EQ(links[1]->getArtistId(), artist1.getId());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
} // namespace lms::db::tests
|
} // namespace lms::db::tests
|
||||||
@@ -41,17 +41,17 @@ namespace lms::api::subsonic
|
|||||||
|
|
||||||
namespace utils
|
namespace utils
|
||||||
{
|
{
|
||||||
std::string joinArtistNames(const std::vector<Artist::pointer>& artists)
|
std::string joinArtistNames(const std::vector<TrackArtistLink::pointer>& links)
|
||||||
{
|
{
|
||||||
if (artists.size() == 1)
|
if (links.size() == 1)
|
||||||
return artists.front()->getName();
|
return std::string{ links.front()->getArtistName() };
|
||||||
|
|
||||||
std::vector<std::string> names;
|
std::vector<std::string> names;
|
||||||
names.resize(artists.size());
|
names.resize(links.size());
|
||||||
|
|
||||||
std::transform(std::cbegin(artists), std::cend(artists), std::begin(names),
|
std::transform(std::cbegin(links), std::cend(links), std::begin(names),
|
||||||
[](const Artist::pointer& artist) {
|
[](const TrackArtistLink::pointer& link) {
|
||||||
return artist->getName();
|
return std::string{ link->getArtistName() };
|
||||||
});
|
});
|
||||||
|
|
||||||
return core::stringUtils::joinStrings(names, ", ");
|
return core::stringUtils::joinStrings(names, ", ");
|
||||||
|
|||||||
@@ -42,7 +42,7 @@ namespace lms::api::subsonic
|
|||||||
|
|
||||||
namespace utils
|
namespace utils
|
||||||
{
|
{
|
||||||
std::string joinArtistNames(const std::vector<db::ObjectPtr<db::Artist>>& artists);
|
std::string joinArtistNames(const std::vector<db::ObjectPtr<db::TrackArtistLink>>& links);
|
||||||
std::string_view toString(db::TrackArtistLinkType type);
|
std::string_view toString(db::TrackArtistLinkType type);
|
||||||
} // namespace utils
|
} // namespace utils
|
||||||
|
|
||||||
|
|||||||
@@ -134,16 +134,24 @@ namespace lms::api::subsonic
|
|||||||
trackResponse.setAttribute("coverArt", idToString(coverArtId));
|
trackResponse.setAttribute("coverArt", idToString(coverArtId));
|
||||||
}
|
}
|
||||||
|
|
||||||
const std::vector<db::Artist::pointer>& artists{ track->getArtists({ db::TrackArtistLinkType::Artist }) };
|
std::vector<db::TrackArtistLink::pointer> artistLinks;
|
||||||
if (!artists.empty())
|
std::vector<db::TrackArtistLink::pointer> trackArtistLinks;
|
||||||
|
track->visitArtistLinks([&](const db::TrackArtistLink::pointer& link) {
|
||||||
|
artistLinks.push_back(link);
|
||||||
|
|
||||||
|
if (link->getType() == db::TrackArtistLinkType::Artist)
|
||||||
|
trackArtistLinks.push_back(link);
|
||||||
|
});
|
||||||
|
|
||||||
|
if (!trackArtistLinks.empty())
|
||||||
{
|
{
|
||||||
if (!track->getArtistDisplayName().empty())
|
if (!track->getArtistDisplayName().empty())
|
||||||
trackResponse.setAttribute("artist", track->getArtistDisplayName());
|
trackResponse.setAttribute("artist", track->getArtistDisplayName());
|
||||||
else
|
else
|
||||||
trackResponse.setAttribute("artist", utils::joinArtistNames(artists));
|
trackResponse.setAttribute("artist", utils::joinArtistNames(trackArtistLinks));
|
||||||
|
|
||||||
if (artists.size() == 1)
|
if (trackArtistLinks.size() == 1)
|
||||||
trackResponse.setAttribute("artistId", idToString(artists.front()->getId()));
|
trackResponse.setAttribute("artistId", idToString(trackArtistLinks.front()->getArtistId()));
|
||||||
}
|
}
|
||||||
|
|
||||||
const db::Release::pointer release{ track->getRelease() };
|
const db::Release::pointer release{ track->getRelease() };
|
||||||
@@ -195,7 +203,8 @@ namespace lms::api::subsonic
|
|||||||
trackResponse.createEmptyArrayChild("artists");
|
trackResponse.createEmptyArrayChild("artists");
|
||||||
trackResponse.createEmptyArrayChild("contributors");
|
trackResponse.createEmptyArrayChild("contributors");
|
||||||
|
|
||||||
track->visitArtistLinks([&](const db::TrackArtistLink::pointer& artistLink) {
|
for (const auto& artistLink : artistLinks)
|
||||||
|
{
|
||||||
switch (artistLink->getType())
|
switch (artistLink->getType())
|
||||||
{
|
{
|
||||||
case db::TrackArtistLinkType::Artist:
|
case db::TrackArtistLinkType::Artist:
|
||||||
@@ -204,7 +213,7 @@ namespace lms::api::subsonic
|
|||||||
default:
|
default:
|
||||||
trackResponse.addArrayChild("contributors", createContributorNode(artistLink));
|
trackResponse.addArrayChild("contributors", createContributorNode(artistLink));
|
||||||
}
|
}
|
||||||
});
|
}
|
||||||
|
|
||||||
if (release)
|
if (release)
|
||||||
{
|
{
|
||||||
|
|||||||
Reference in New Issue
Block a user