Small optim when visiting artist links
This commit is contained in:
@@ -30,11 +30,11 @@ namespace lms::db
|
||||
{
|
||||
namespace
|
||||
{
|
||||
Wt::Dbo::Query<TrackArtistLinkId> createQuery(Session& session, const TrackArtistLink::FindParameters& params)
|
||||
Wt::Dbo::Query<Wt::Dbo::ptr<TrackArtistLink>> createQuery(Session& session, const TrackArtistLink::FindParameters& params)
|
||||
{
|
||||
session.checkReadTransaction();
|
||||
|
||||
auto query{ session.getDboSession()->query<TrackArtistLinkId>("SELECT DISTINCT t_a_l.id FROM track_artist_link t_a_l") };
|
||||
auto query{ session.getDboSession()->query<Wt::Dbo::ptr<TrackArtistLink>>("SELECT t_a_l FROM track_artist_link t_a_l") };
|
||||
|
||||
if (params.linkType)
|
||||
query.where("t_a_l.type = ?").bind(*params.linkType);
|
||||
@@ -51,6 +51,8 @@ namespace lms::db
|
||||
if (params.track.isValid())
|
||||
query.where("t.id = ?").bind(params.track);
|
||||
|
||||
query.groupBy("t_a_l.id");
|
||||
|
||||
return query;
|
||||
}
|
||||
}
|
||||
@@ -79,12 +81,14 @@ namespace lms::db
|
||||
return utils::fetchQuerySingleResult(session.getDboSession()->find<TrackArtistLink>().where("id = ?").bind(id));
|
||||
}
|
||||
|
||||
RangeResults<TrackArtistLinkId> TrackArtistLink::find(Session& session, const FindParameters& params)
|
||||
void TrackArtistLink::find(Session& session, const FindParameters& parameters, const std::function<void(const TrackArtistLink::pointer&)>& func)
|
||||
{
|
||||
session.checkReadTransaction();
|
||||
const auto query{ createQuery(session, parameters) };
|
||||
|
||||
auto query{ createQuery(session, params) };
|
||||
return utils::execRangeQuery<TrackArtistLinkId>(query, params.range);
|
||||
utils::forEachQueryResult(query, [&](const TrackArtistLink::pointer& link)
|
||||
{
|
||||
func(link);
|
||||
});
|
||||
}
|
||||
|
||||
core::EnumSet<TrackArtistLinkType> TrackArtistLink::findUsedTypes(Session& session)
|
||||
|
||||
@@ -62,7 +62,7 @@ namespace lms::db
|
||||
TrackArtistLink() = default;
|
||||
TrackArtistLink(ObjectPtr<Track> track, ObjectPtr<Artist> artist, TrackArtistLinkType type, std::string_view subType);
|
||||
|
||||
static RangeResults<TrackArtistLinkId> find(Session& session, const FindParameters& parameters);
|
||||
static void find(Session& session, const FindParameters& parameters, const std::function<void(const TrackArtistLink::pointer&)>&);
|
||||
static pointer find(Session& session, TrackArtistLinkId linkId);
|
||||
static pointer create(Session& session, ObjectPtr<Track> track, ObjectPtr<Artist> artist, TrackArtistLinkType type, std::string_view subType = {});
|
||||
static core::EnumSet<TrackArtistLinkType> findUsedTypes(Session& session);
|
||||
|
||||
@@ -65,7 +65,6 @@ namespace lms::api::subsonic
|
||||
std::string path;
|
||||
|
||||
// The track path has to be relative from the root
|
||||
|
||||
const auto release{ track->getRelease() };
|
||||
if (release)
|
||||
{
|
||||
@@ -191,40 +190,31 @@ namespace lms::api::subsonic
|
||||
trackResponse.setAttribute("musicBrainzId", mbid ? mbid->getAsString() : "");
|
||||
}
|
||||
|
||||
trackResponse.createEmptyArrayChild("contributors");
|
||||
{
|
||||
TrackArtistLink::FindParameters params;
|
||||
params.setTrack(track->getId());
|
||||
|
||||
for (const TrackArtistLinkId linkId : TrackArtistLink::find(context.dbSession, params).results)
|
||||
trackResponse.createEmptyArrayChild("albumartists");
|
||||
trackResponse.createEmptyArrayChild("artists");
|
||||
trackResponse.createEmptyArrayChild("contributors");
|
||||
|
||||
TrackArtistLink::find(context.dbSession, params, [&](const TrackArtistLink::pointer& link)
|
||||
{
|
||||
TrackArtistLink::pointer link{ TrackArtistLink::find(context.dbSession, linkId) };
|
||||
// Don't report artists nor release artists as they are set in dedicated fields
|
||||
if (link && link->getType() != TrackArtistLinkType::Artist && link->getType() != TrackArtistLinkType::ReleaseArtist)
|
||||
trackResponse.addArrayChild("contributors", createContributorNode(link));
|
||||
}
|
||||
switch (link->getType())
|
||||
{
|
||||
case TrackArtistLinkType::Artist:
|
||||
trackResponse.addArrayChild("artists", createArtistNode(link->getArtist()));
|
||||
break;
|
||||
case TrackArtistLinkType::ReleaseArtist:
|
||||
trackResponse.addArrayChild("albumartists", createArtistNode(link->getArtist()));
|
||||
break;
|
||||
default:
|
||||
trackResponse.addArrayChild("contributors", createContributorNode(link));
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
auto addArtistLinks{ [&](Response::Node::Key nodeName, TrackArtistLinkType type)
|
||||
{
|
||||
trackResponse.createEmptyArrayChild(nodeName);
|
||||
|
||||
TrackArtistLink::FindParameters params;
|
||||
params.setTrack(track->getId());
|
||||
params.setLinkType(type);
|
||||
|
||||
for (const TrackArtistLinkId linkId : TrackArtistLink::find(context.dbSession, params).results)
|
||||
{
|
||||
TrackArtistLink::pointer link{ TrackArtistLink::find(context.dbSession, linkId) };
|
||||
if (link)
|
||||
trackResponse.addArrayChild(nodeName, createArtistNode(link->getArtist()));
|
||||
}
|
||||
} };
|
||||
|
||||
addArtistLinks("artists", TrackArtistLinkType::Artist);
|
||||
trackResponse.setAttribute("displayArtist", track->getArtistDisplayName());
|
||||
|
||||
addArtistLinks("albumartists", TrackArtistLinkType::ReleaseArtist);
|
||||
if (release)
|
||||
trackResponse.setAttribute("displayAlbumArtist", release->getArtistDisplayName());
|
||||
|
||||
|
||||
@@ -95,18 +95,10 @@ namespace lms::ui
|
||||
TrackArtistLink::FindParameters params;
|
||||
params.setRelease(releaseId);
|
||||
params.setLinkType(TrackArtistLinkType::Performer);
|
||||
const auto links{ TrackArtistLink::find(LmsApp->getDbSession(), params) };
|
||||
if (links.results.empty())
|
||||
return;
|
||||
|
||||
for (const TrackArtistLinkId linkId : links.results)
|
||||
{
|
||||
const TrackArtistLink::pointer link{ TrackArtistLink::find(LmsApp->getDbSession(), linkId) };
|
||||
if (!link)
|
||||
continue;
|
||||
|
||||
artistMap[std::string{ link->getSubType() }].insert(link->getArtist()->getId());
|
||||
}
|
||||
TrackArtistLink::find(LmsApp->getDbSession(), params, [&](const TrackArtistLink::pointer& link)
|
||||
{
|
||||
artistMap[std::string{ link->getSubType() }].insert(link->getArtist()->getId());
|
||||
});
|
||||
};
|
||||
|
||||
addArtists(TrackArtistLinkType::Composer, "Lms.Explore.Artists.linktype-composer");
|
||||
|
||||
@@ -82,18 +82,11 @@ namespace lms::ui::TrackListHelpers
|
||||
TrackArtistLink::FindParameters params;
|
||||
params.setTrack(trackId);
|
||||
params.setLinkType(TrackArtistLinkType::Performer);
|
||||
const auto links{ TrackArtistLink::find(LmsApp->getDbSession(), params) };
|
||||
if (links.results.empty())
|
||||
return;
|
||||
|
||||
for (const TrackArtistLinkId linkId : links.results)
|
||||
{
|
||||
const TrackArtistLink::pointer link{ TrackArtistLink::find(LmsApp->getDbSession(), linkId) };
|
||||
if (!link)
|
||||
continue;
|
||||
|
||||
artistMap[std::string{ link->getSubType() }].insert(link->getArtist()->getId());
|
||||
}
|
||||
TrackArtistLink::find(LmsApp->getDbSession(), params, [&](const TrackArtistLink::pointer& link)
|
||||
{
|
||||
artistMap[std::string{ link->getSubType() }].insert(link->getArtist()->getId());
|
||||
});
|
||||
};
|
||||
|
||||
addArtists(TrackArtistLinkType::Composer, "Lms.Explore.Artists.linktype-composer");
|
||||
|
||||
Reference in New Issue
Block a user