From 2910be8a9a85ecf343d7594b6170c6edb724cdc4 Mon Sep 17 00:00:00 2001 From: emeric Date: Wed, 1 Nov 2023 23:55:24 +0100 Subject: [PATCH] Similarity by clusters: removed duplicates in the list of clusters to search --- src/libs/services/database/impl/Artist.cpp | 2 +- src/libs/services/database/impl/Release.cpp | 8 +++++++- src/libs/services/database/impl/Track.cpp | 2 +- src/libs/services/database/impl/TrackList.cpp | 2 +- 4 files changed, 10 insertions(+), 4 deletions(-) diff --git a/src/libs/services/database/impl/Artist.cpp b/src/libs/services/database/impl/Artist.cpp index a1b33294..a5e9e6fc 100644 --- a/src/libs/services/database/impl/Artist.cpp +++ b/src/libs/services/database/impl/Artist.cpp @@ -223,7 +223,7 @@ Artist::findSimilarArtists(EnumSet artistLinkTypes, Range r " INNER JOIN track t ON t.id = t_a_l.track_id" " INNER JOIN track_cluster t_c ON t_c.track_id = t.id" " WHERE " - " t_c.cluster_id IN (SELECT c.id from cluster c" + " t_c.cluster_id IN (SELECT DISTINCT c.id from cluster c" " INNER JOIN track t ON c.id = t_c.cluster_id" " INNER JOIN track_cluster t_c ON t_c.track_id = t.id" " INNER JOIN artist a ON a.id = t_a_l.artist_id" diff --git a/src/libs/services/database/impl/Release.cpp b/src/libs/services/database/impl/Release.cpp index a04bf9ab..fbd25c59 100644 --- a/src/libs/services/database/impl/Release.cpp +++ b/src/libs/services/database/impl/Release.cpp @@ -382,12 +382,18 @@ namespace Database { assert(session()); + // Select the similar releases using the 5 most used clusters of the release auto res{ session()->query>( "SELECT r FROM release r" " INNER JOIN track t ON t.release_id = r.id" " INNER JOIN track_cluster t_c ON t_c.track_id = t.id" " WHERE " - " t_c.cluster_id IN (SELECT c.id from cluster c INNER JOIN track t ON c.id = t_c.cluster_id INNER JOIN track_cluster t_c ON t_c.track_id = t.id INNER JOIN release r ON r.id = t.release_id WHERE r.id = ?)" + " t_c.cluster_id IN " + "(SELECT DISTINCT c.id FROM cluster c" + " INNER JOIN track t ON c.id = t_c.cluster_id" + " INNER JOIN track_cluster t_c ON t_c.track_id = t.id" + " INNER JOIN release r ON r.id = t.release_id" + " WHERE r.id = ?)" " AND r.id <> ?" ) .bind(getId()) diff --git a/src/libs/services/database/impl/Track.cpp b/src/libs/services/database/impl/Track.cpp index 5f3933e5..4d2b8612 100644 --- a/src/libs/services/database/impl/Track.cpp +++ b/src/libs/services/database/impl/Track.cpp @@ -327,7 +327,7 @@ Track::findSimilarTracks(Session& session, const std::vector& tracks, R auto query {session.getDboSession().query( "SELECT t.id FROM track t" " INNER JOIN track_cluster t_c ON t_c.track_id = t.id" - " AND t_c.cluster_id IN (SELECT c.id FROM cluster c INNER JOIN track_cluster t_c ON t_c.cluster_id = c.id WHERE t_c.track_id IN (" + oss.str() + "))" + " AND t_c.cluster_id IN (SELECT DISTINCT c.id FROM cluster c INNER JOIN track_cluster t_c ON t_c.cluster_id = c.id WHERE t_c.track_id IN (" + oss.str() + "))" " AND t.id NOT IN (" + oss.str() + ")") .groupBy("t.id") .orderBy("COUNT(*) DESC, RANDOM()")}; diff --git a/src/libs/services/database/impl/TrackList.cpp b/src/libs/services/database/impl/TrackList.cpp index 227eaa4c..490fc06a 100644 --- a/src/libs/services/database/impl/TrackList.cpp +++ b/src/libs/services/database/impl/TrackList.cpp @@ -538,7 +538,7 @@ TrackList::getSimilarTracks(std::optional offset, std::optional