When max similarity count is set to 0, return nothing instead of everything

This commit is contained in:
emeric
2023-10-18 13:41:09 +02:00
parent c5d26a7647
commit 4562e0368a
@@ -29,80 +29,83 @@
namespace Recommendation { namespace Recommendation {
using namespace Database; using namespace Database;
std::unique_ptr<IEngine> createClustersEngine(Db& db) std::unique_ptr<IEngine> createClustersEngine(Db& db)
{ {
return std::make_unique<ClusterEngine>(db); return std::make_unique<ClusterEngine>(db);
} }
TrackContainer TrackContainer ClusterEngine::findSimilarTracks(const std::vector<TrackId>& trackIds, std::size_t maxCount) const
ClusterEngine::findSimilarTracks(const std::vector<TrackId>& trackIds, std::size_t maxCount) const {
{ if (maxCount == 0)
Session& dbSession {_db.getTLSSession()}; return {};
auto transaction {dbSession.createSharedTransaction()}; Session& dbSession{ _db.getTLSSession() };
auto transaction{ dbSession.createSharedTransaction() };
const auto similarTrackIds {Track::findSimilarTracks(dbSession, trackIds, Range {0, maxCount})}; const auto similarTrackIds{ Track::findSimilarTracks(dbSession, trackIds, Range {0, maxCount}) };
return std::move(similarTrackIds.results); return std::move(similarTrackIds.results);
} }
TrackContainer TrackContainer ClusterEngine::findSimilarTracksFromTrackList(TrackListId tracklistId, std::size_t maxCount) const
ClusterEngine::findSimilarTracksFromTrackList(TrackListId tracklistId, std::size_t maxCount) const {
{ TrackContainer res;
Session& dbSession {_db.getTLSSession()}; if (maxCount == 0)
return res;
TrackContainer res; {
Session& dbSession{ _db.getTLSSession() };
auto transaction{ dbSession.createSharedTransaction() };
{ const TrackList::pointer trackList{ TrackList::find(dbSession, tracklistId) };
auto transaction {dbSession.createSharedTransaction()}; if (!trackList)
return res;
const TrackList::pointer trackList {TrackList::find(dbSession, tracklistId)}; const auto tracks{ trackList->getSimilarTracks(0, maxCount) };
if (!trackList) res.reserve(tracks.size());
return res; std::transform(std::cbegin(tracks), std::cend(tracks), std::back_inserter(res), [](const auto& track) { return track->getId(); });
}
const auto tracks {trackList->getSimilarTracks(0, maxCount)}; return res;
res.reserve(tracks.size()); }
std::transform(std::cbegin(tracks), std::cend(tracks), std::back_inserter(res), [](const auto& track) { return track->getId(); });
}
return res; ReleaseContainer ClusterEngine::getSimilarReleases(ReleaseId releaseId, std::size_t maxCount) const
} {
ReleaseContainer res;
if (maxCount == 0)
return res;
ReleaseContainer {
ClusterEngine::getSimilarReleases(ReleaseId releaseId, std::size_t maxCount) const Session& dbSession{ _db.getTLSSession() };
{ auto transaction{ dbSession.createSharedTransaction() };
Session& dbSession {_db.getTLSSession()};
ReleaseContainer res; auto release{ Release::find(dbSession, releaseId) };
{ if (!release)
auto transaction {dbSession.createSharedTransaction()}; return res;
auto release {Release::find(dbSession, releaseId)}; const auto releases{ release->getSimilarReleases(0, maxCount) };
if (!release) res.reserve(releases.size());
return res; std::transform(std::cbegin(releases), std::cend(releases), std::back_inserter(res), [](const auto& release) { return release->getId(); });
}
const auto releases {release->getSimilarReleases(0, maxCount)}; return res;
res.reserve(releases.size()); }
std::transform(std::cbegin(releases), std::cend(releases), std::back_inserter(res), [](const auto& release) { return release->getId(); });
}
return res; ArtistContainer ClusterEngine::getSimilarArtists(ArtistId artistId, EnumSet<TrackArtistLinkType> artistLinkTypes, std::size_t maxCount) const
} {
if (maxCount == 0)
return {};
ArtistContainer Session& dbSession{ _db.getTLSSession() };
ClusterEngine::getSimilarArtists(ArtistId artistId, EnumSet<TrackArtistLinkType> artistLinkTypes, std::size_t maxCount) const auto transaction{ dbSession.createSharedTransaction() };
{
Session& dbSession {_db.getTLSSession()};
auto transaction {dbSession.createSharedTransaction()}; auto artist{ Artist::find(dbSession, artistId) };
if (!artist)
return {};
auto artist {Artist::find(dbSession, artistId)}; const auto similarArtistIds{ artist->findSimilarArtists(artistLinkTypes, Range {0, maxCount}) };
if (!artist) return std::move(similarArtistIds.results);
return {}; }
const auto similarArtistIds {artist->findSimilarArtists(artistLinkTypes, Range {0, maxCount})};
return std::move(similarArtistIds.results);
}
} // namespace Recommendation } // namespace Recommendation