diff --git a/approot/messages.xml b/approot/messages.xml
index cdaba83b..e895b0ef 100644
--- a/approot/messages.xml
+++ b/approot/messages.xml
@@ -85,6 +85,7 @@
Scanning: step {1}/{2}
Checking for duplicate files... {1} files
Checking files... {1}%
+Computing stats... {1}%
Discovering files: {1} files
Fetching track features from AcousticBrainz: {1}/{2} tracks ({3}%)...
Reloading similarity engine: {1}%...
diff --git a/approot/messages_fr.xml b/approot/messages_fr.xml
index c67ab668..59152411 100644
--- a/approot/messages_fr.xml
+++ b/approot/messages_fr.xml
@@ -85,6 +85,7 @@
En cours de scan : étape {1}/{2}
Vérification des fichiers dupliqués... {1} fichiers
Vérification des fichiers... {1}%
+Calcul des statistiques... {1}%
Découverte des fichiers : {1} fichiers
Récupération des métadonnées AcousticBrainz : {1}/{2} fichiers ({3}%)...
Rechargement du moteur de recommandation : {1}%...
diff --git a/approot/messages_it.xml b/approot/messages_it.xml
index 518fc9b6..0a5f358a 100644
--- a/approot/messages_it.xml
+++ b/approot/messages_it.xml
@@ -85,6 +85,7 @@
Scansione: passo {1}/{2}
Controllo file... {1}%
+
File trovati: {1} files
Recupero metadati da AcousticBrainz: {1}/{2} tracce ({3}%)...
Ricarica motore di tracce simili: {1}%...
diff --git a/approot/messages_zh.xml b/approot/messages_zh.xml
index 9442202c..7eb6472f 100644
--- a/approot/messages_zh.xml
+++ b/approot/messages_zh.xml
@@ -85,6 +85,7 @@
扫描中: 阶段 {1}/{2}
检查文件中... {1}%
+
检索文件中: {1} 文件
从 AcousticBrainz 获取音轨特征: {1}/{2} 音轨 ({3}%)...
重载相似引擎中 {1}%...
diff --git a/src/libs/services/database/impl/Cluster.cpp b/src/libs/services/database/impl/Cluster.cpp
index 1dcbf1b7..675d1691 100644
--- a/src/libs/services/database/impl/Cluster.cpp
+++ b/src/libs/services/database/impl/Cluster.cpp
@@ -32,11 +32,12 @@ namespace Database
{
namespace
{
- Wt::Dbo::Query createQuery(Session& session, const Cluster::FindParameters& params)
+ template
+ Wt::Dbo::Query createQuery(Session& session, std::string_view itemToSelect, const Cluster::FindParameters& params)
{
session.checkSharedLocked();
- auto query{ session.getDboSession().query("SELECT DISTINCT c.id,c.name FROM cluster c") };
+ auto query{ session.getDboSession().query("SELECT DISTINCT " + std::string{ itemToSelect } + " FROM cluster c") };
if (params.track.isValid() || params.release.isValid())
{
@@ -54,6 +55,21 @@ namespace Database
return query;
}
+
+ template
+ Wt::Dbo::Query createQuery(Session& session, const Cluster::FindParameters& params)
+ {
+ std::string_view itemToSelect;
+
+ if constexpr (std::is_same_v)
+ itemToSelect = "c.id";
+ else if constexpr (std::is_same_v>)
+ itemToSelect = "c";
+ else
+ static_assert("Unhandled type");
+
+ return createQuery(session, itemToSelect, params);
+ }
}
Cluster::Cluster(ObjectPtr type, std::string_view name)
@@ -74,10 +90,18 @@ namespace Database
return session.getDboSession().query("SELECT COUNT(*) FROM cluster");
}
- RangeResults Cluster::find(Session& session, const FindParameters& params)
+ RangeResults Cluster::findIds(Session& session, const FindParameters& params)
{
session.checkSharedLocked();
- auto query{ createQuery(session, params) };
+ auto query{ createQuery(session, params) };
+
+ return Utils::execQuery(query, params.range);
+ }
+
+ RangeResults Cluster::find(Session& session, const FindParameters& params)
+ {
+ session.checkSharedLocked();
+ auto query{ createQuery>(session, params) };
return Utils::execQuery(query, params.range);
}
@@ -97,6 +121,22 @@ namespace Database
return session.getDboSession().find().where("id = ?").bind(id).resultValue();
}
+ std::size_t Cluster::computeTrackCount(Session& session, ClusterId id)
+ {
+ session.checkSharedLocked();
+
+ return session.getDboSession().query("SELECT COUNT(t.id) FROM track t INNER JOIN track_cluster t_c ON t_c.track_id = t.id")
+ .where("t_c.cluster_id = ?").bind(id).resultValue();
+ }
+
+ std::size_t Cluster::computeReleaseCount(Session& session, ClusterId id)
+ {
+ session.checkSharedLocked();
+
+ return session.getDboSession().query("SELECT COUNT(DISTINCT r.id) 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 = ?").bind(id).resultValue();
+ }
+
void Cluster::addTrack(ObjectPtr