Fixed regression on lookup performance (introduced when added track/artist links)
This commit is contained in:
@@ -617,7 +617,7 @@ artistToResponseNode(const Database::User::pointer& user, const Database::Artist
|
|||||||
artistNode.setAttribute("name", artist->getName());
|
artistNode.setAttribute("name", artist->getName());
|
||||||
|
|
||||||
if (id3)
|
if (id3)
|
||||||
artistNode.setAttribute("albumCount", std::to_string(artist->getReleases().size()));
|
artistNode.setAttribute("albumCount", std::to_string(artist->getReleaseCount()));
|
||||||
|
|
||||||
if (user->hasStarredArtist(artist))
|
if (user->hasStarredArtist(artist))
|
||||||
artistNode.setAttribute("starred", reportedStarredDate);
|
artistNode.setAttribute("starred", reportedStarredDate);
|
||||||
|
|||||||
@@ -213,6 +213,18 @@ Artist::getReleases(const std::set<IdType>& clusterIds) const
|
|||||||
return std::vector<Wt::Dbo::ptr<Release>>(res.begin(), res.end());
|
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>>
|
std::vector<Wt::Dbo::ptr<Track>>
|
||||||
Artist::getTracks(boost::optional<TrackArtistLink::Type> linkType) const
|
Artist::getTracks(boost::optional<TrackArtistLink::Type> linkType) const
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -70,6 +70,7 @@ class Artist : public Wt::Dbo::Dbo<Artist>
|
|||||||
const std::string& getMBID(void) const { return _MBID; }
|
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::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>> 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>> getTracksWithRelease(boost::optional<TrackArtistLink::Type> linkType = {}) const;
|
||||||
std::vector<Wt::Dbo::ptr<Track>> getRandomTracks(boost::optional<std::size_t> count) const;
|
std::vector<Wt::Dbo::ptr<Track>> getRandomTracks(boost::optional<std::size_t> count) const;
|
||||||
|
|||||||
@@ -230,15 +230,23 @@ Handler::Handler(Wt::Dbo::SqlConnectionPool& connectionPool)
|
|||||||
Wt::Dbo::Transaction transaction {_session};
|
Wt::Dbo::Transaction transaction {_session};
|
||||||
|
|
||||||
// Indexes
|
// 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 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 artist_mbid_idx ON artist(mbid)");
|
||||||
_session.execute("CREATE INDEX IF NOT EXISTS track_release_idx ON track(release_id)");
|
|
||||||
_session.execute("CREATE INDEX IF NOT EXISTS cluster_name_idx ON cluster(name)");
|
_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 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_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_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);
|
_users = new UserDatabase(_session);
|
||||||
|
|||||||
@@ -237,6 +237,8 @@ testSingleTrackSingleArtist(Wt::Dbo::Session& session)
|
|||||||
auto artist {artists.front()};
|
auto artist {artists.front()};
|
||||||
CHECK(artist.id() == artistId);
|
CHECK(artist.id() == artistId);
|
||||||
|
|
||||||
|
CHECK(artist->getReleaseCount() == 0);
|
||||||
|
|
||||||
CHECK(track->getArtistLinks().size() == 1);
|
CHECK(track->getArtistLinks().size() == 1);
|
||||||
auto artistLink {track->getArtistLinks().front()};
|
auto artistLink {track->getArtistLinks().front()};
|
||||||
CHECK(artistLink->getTrack().id() == trackId);
|
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
|
static
|
||||||
void
|
void
|
||||||
testSingleTrackSingleReleaseSingleArtist(Wt::Dbo::Session& session)
|
testSingleTrackSingleReleaseSingleArtist(Wt::Dbo::Session& session)
|
||||||
@@ -809,6 +870,8 @@ testSingleTrackSingleReleaseSingleArtist(Wt::Dbo::Session& session)
|
|||||||
CHECK(releases.size() == 1);
|
CHECK(releases.size() == 1);
|
||||||
CHECK(releases.front().id() == releaseId);
|
CHECK(releases.front().id() == releaseId);
|
||||||
|
|
||||||
|
CHECK(artist->getReleaseCount() == 1);
|
||||||
|
|
||||||
auto release {Release::getById(session, releaseId)};
|
auto release {Release::getById(session, releaseId)};
|
||||||
CHECK(release);
|
CHECK(release);
|
||||||
auto artists {release->getArtists()};
|
auto artists {release->getArtists()};
|
||||||
@@ -1187,6 +1250,7 @@ int main(int argc, char* argv[])
|
|||||||
RUN_TEST(testSingleTrackSingleArtistMultiClusters);
|
RUN_TEST(testSingleTrackSingleArtistMultiClusters);
|
||||||
RUN_TEST(testSingleTrackSingleArtistMultiRolesMultiClusters);
|
RUN_TEST(testSingleTrackSingleArtistMultiRolesMultiClusters);
|
||||||
RUN_TEST(testMultiTracksSingleArtistMultiClusters);
|
RUN_TEST(testMultiTracksSingleArtistMultiClusters);
|
||||||
|
RUN_TEST(testMultiTracksSingleArtistSingleRelease);
|
||||||
|
|
||||||
RUN_TEST(testSingleTrackSingleReleaseSingleArtist);
|
RUN_TEST(testSingleTrackSingleReleaseSingleArtist);
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user