Fixed regression on lookup performance (introduced when added track/artist links)

This commit is contained in:
emeric
2019-06-17 13:43:29 +02:00
parent ef648d5cb6
commit 56260ed727
5 changed files with 90 additions and 5 deletions
+1 -1
View File
@@ -617,7 +617,7 @@ artistToResponseNode(const Database::User::pointer& user, const Database::Artist
artistNode.setAttribute("name", artist->getName());
if (id3)
artistNode.setAttribute("albumCount", std::to_string(artist->getReleases().size()));
artistNode.setAttribute("albumCount", std::to_string(artist->getReleaseCount()));
if (user->hasStarredArtist(artist))
artistNode.setAttribute("starred", reportedStarredDate);
+12
View File
@@ -213,6 +213,18 @@ Artist::getReleases(const std::set<IdType>& clusterIds) const
return std::vector<Wt::Dbo::ptr<Release>>(res.begin(), res.end());
}
std::size_t
Artist::getReleaseCount() const
{
assert(self());
assert(IdIsValid(self()->id()));
assert(session());
int res = session()->query<int>("SELECT COUNT(DISTINCT r.id) FROM release r INNER JOIN artist a ON a.id = t_a_l.artist_id INNER JOIN track_artist_link t_a_l ON t_a_l.track_id = t.id INNER JOIN track t ON t.release_id = r.id")
.where("a.id = ?").bind(self()->id());
return res;
}
std::vector<Wt::Dbo::ptr<Track>>
Artist::getTracks(boost::optional<TrackArtistLink::Type> linkType) const
{
+1
View File
@@ -70,6 +70,7 @@ class Artist : public Wt::Dbo::Dbo<Artist>
const std::string& getMBID(void) const { return _MBID; }
std::vector<Wt::Dbo::ptr<Release>> getReleases(const std::set<IdType>& clusterIds = std::set<IdType>()) const;
std::size_t getReleaseCount() const;
std::vector<Wt::Dbo::ptr<Track>> getTracks(boost::optional<TrackArtistLink::Type> linkType = {}) const;
std::vector<Wt::Dbo::ptr<Track>> getTracksWithRelease(boost::optional<TrackArtistLink::Type> linkType = {}) const;
std::vector<Wt::Dbo::ptr<Track>> getRandomTracks(boost::optional<std::size_t> count) const;
+12 -4
View File
@@ -230,15 +230,23 @@ Handler::Handler(Wt::Dbo::SqlConnectionPool& connectionPool)
Wt::Dbo::Transaction transaction {_session};
// Indexes
_session.execute("CREATE INDEX IF NOT EXISTS track_path_idx ON track(file_path)");
_session.execute("CREATE INDEX IF NOT EXISTS track_name_idx ON track(name)");
_session.execute("CREATE INDEX IF NOT EXISTS artist_name_idx ON artist(name)");
_session.execute("CREATE INDEX IF NOT EXISTS release_name_idx ON release(name)");
_session.execute("CREATE INDEX IF NOT EXISTS track_release_idx ON track(release_id)");
_session.execute("CREATE INDEX IF NOT EXISTS artist_mbid_idx ON artist(mbid)");
_session.execute("CREATE INDEX IF NOT EXISTS cluster_name_idx ON cluster(name)");
_session.execute("CREATE INDEX IF NOT EXISTS cluster_type_name_idx ON cluster_type(name)");
_session.execute("CREATE INDEX IF NOT EXISTS release_name_idx ON release(name)");
_session.execute("CREATE INDEX IF NOT EXISTS release_mbid_idx ON release(mbid)");
_session.execute("CREATE INDEX IF NOT EXISTS track_path_idx ON track(file_path)");
_session.execute("CREATE INDEX IF NOT EXISTS track_name_idx ON track(name)");
_session.execute("CREATE INDEX IF NOT EXISTS track_mbid_idx ON track(mbid)");
_session.execute("CREATE INDEX IF NOT EXISTS track_release_idx ON track(release_id)");
_session.execute("CREATE INDEX IF NOT EXISTS tracklist_name_idx ON tracklist(name)");
_session.execute("CREATE INDEX IF NOT EXISTS tracklist_user_idx ON tracklist(user_id)");
_session.execute("CREATE INDEX IF NOT EXISTS track_features_track_idx ON track_features(track_id)");
_session.execute("CREATE INDEX IF NOT EXISTS track_artist_link_artist_idx ON track_artist_link(artist_id)");
_session.execute("CREATE INDEX IF NOT EXISTS track_artist_link_name_idx ON track_artist_link(name)");
_session.execute("CREATE INDEX IF NOT EXISTS track_artist_link_track_idx ON track_artist_link(track_id)");
_session.execute("CREATE INDEX IF NOT EXISTS track_artist_link_type_idx ON track_artist_link(type)");
}
_users = new UserDatabase(_session);
+64
View File
@@ -237,6 +237,8 @@ testSingleTrackSingleArtist(Wt::Dbo::Session& session)
auto artist {artists.front()};
CHECK(artist.id() == artistId);
CHECK(artist->getReleaseCount() == 0);
CHECK(track->getArtistLinks().size() == 1);
auto artistLink {track->getArtistLinks().front()};
CHECK(artistLink->getTrack().id() == trackId);
@@ -777,6 +779,65 @@ testMultiTracksSingleArtistMultiClusters(Wt::Dbo::Session& session)
}
}
static
void
testMultiTracksSingleArtistSingleRelease(Wt::Dbo::Session& session)
{
const std::size_t nbTracks {10};
IdType artistId {};
IdType releaseId {};
{
Wt::Dbo::Transaction transaction {session};
auto artist {Artist::create(session, "MyArtist")};
auto release {Release::create(session, "MyRelease")};
for (std::size_t i {}; i < nbTracks; ++i)
{
auto track {Track::create(session, "MyTrackFile")};
TrackArtistLink::create(session, track, artist, TrackArtistLink::Type::Artist);
track.modify()->setRelease(release);
}
session.flush();
artistId = artist.id();
releaseId = release.id();
}
{
Wt::Dbo::Transaction transaction {session};
CHECK(Release::getAllOrphans(session).empty());
CHECK(Artist::getAllOrphans(session).empty());
}
{
Wt::Dbo::Transaction transaction {session};
auto artist {Artist::getById(session, artistId)};
CHECK(artist);
CHECK(artist->getReleaseCount() == 1);
CHECK(artist->getReleases().size() == 1);
CHECK(artist->getReleases().front().id() == releaseId);
auto release {Release::getById(session, releaseId)};
CHECK(release);
CHECK(release->getTracks().size() == nbTracks);
}
{
Wt::Dbo::Transaction transaction {session};
std::vector<Track::pointer> tracks {Track::getAll(session)};
for (auto& track : tracks)
track.remove();
auto artist {Artist::getById(session, artistId)};
auto release {Release::getById(session, releaseId)};
artist.remove();
release.remove();
}
}
static
void
testSingleTrackSingleReleaseSingleArtist(Wt::Dbo::Session& session)
@@ -809,6 +870,8 @@ testSingleTrackSingleReleaseSingleArtist(Wt::Dbo::Session& session)
CHECK(releases.size() == 1);
CHECK(releases.front().id() == releaseId);
CHECK(artist->getReleaseCount() == 1);
auto release {Release::getById(session, releaseId)};
CHECK(release);
auto artists {release->getArtists()};
@@ -1187,6 +1250,7 @@ int main(int argc, char* argv[])
RUN_TEST(testSingleTrackSingleArtistMultiClusters);
RUN_TEST(testSingleTrackSingleArtistMultiRolesMultiClusters);
RUN_TEST(testMultiTracksSingleArtistMultiClusters);
RUN_TEST(testMultiTracksSingleArtistSingleRelease);
RUN_TEST(testSingleTrackSingleReleaseSingleArtist);