Fixed regression: restored tag cloud for releases

This commit is contained in:
emeric
2024-04-21 00:16:55 +02:00
parent 0780d1ab21
commit 2e24cf5fab
+9 -7
View File
@@ -576,13 +576,13 @@ namespace lms::db
std::ostringstream oss; std::ostringstream oss;
oss << "SELECT c 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 cluster_type c_type ON c.cluster_type_id = c_type.id "; oss << "SELECT c from cluster c INNER JOIN track_cluster t_c ON t_c.cluster_id = c.id INNER JOIN track t ON t.id = t_c.track_id ";
where.And(WhereClause("t.release_id = ?")).bind(getId().toString()); where.And(WhereClause("t.release_id = ?")).bind(getId().toString());
{ {
WhereClause clusterClause; WhereClause clusterClause;
for (const ClusterTypeId clusterTypeId : clusterTypeIds) for (const ClusterTypeId clusterTypeId : clusterTypeIds)
clusterClause.Or(WhereClause("+c_type.id = ?")).bind(clusterTypeId.toString()); // Exclude this since the query planner does not do a good job when db is not analyzed clusterClause.Or(WhereClause("c.cluster_type_id = ?")).bind(clusterTypeId.toString());
where.And(clusterClause); where.And(clusterClause);
} }
oss << " " << where.get(); oss << " " << where.get();
@@ -592,12 +592,14 @@ namespace lms::db
for (const std::string& bindArg : where.getBindArgs()) for (const std::string& bindArg : where.getBindArgs())
query.bind(bindArg); query.bind(bindArg);
auto queryRes{ query.resultList() };
std::map<ClusterTypeId, std::vector<Cluster::pointer>> clustersByType; std::map<ClusterTypeId, std::vector<Cluster::pointer>> clustersByType;
utils::forEachQueryResult(query, [&](const Cluster::pointer& cluster) for (const Wt::Dbo::ptr<Cluster>& cluster : queryRes)
{ {
if (clustersByType[cluster->getType()->getId()].size() < size) if (clustersByType[cluster->getType()->getId()].size() < size)
clustersByType[cluster->getType()->getId()].push_back(cluster); clustersByType[cluster->getType()->getId()].push_back(cluster);
}); }
std::vector<std::vector<Cluster::pointer>> res; std::vector<std::vector<Cluster::pointer>> res;
for (const auto& [clusterTypeId, clusters] : clustersByType) for (const auto& [clusterTypeId, clusters] : clustersByType)