Made the cluster types that are displayed configurable in the release and artist view

This commit is contained in:
emeric
2018-05-11 13:42:25 +02:00
parent 6a96af5d48
commit 070d466380
15 changed files with 194 additions and 58 deletions
+35 -10
View File
@@ -182,23 +182,48 @@ Artist::getReleases(const std::set<id_type>& clusterIds) const
return std::vector< Wt::Dbo::ptr<Release> > (res.begin(), res.end());
}
std::vector<Wt::Dbo::ptr<Cluster>>
Artist::getClusters(int size) const
std::vector<std::vector<Wt::Dbo::ptr<Cluster>>>
Artist::getClusterGroups(std::vector<ClusterType::pointer> clusterTypes, std::size_t size) const
{
assert(self());
assert(self()->id() != Wt::Dbo::dbo_traits<Artist>::invalidId() );
assert(session());
Wt::Dbo::Query<Cluster::pointer> query = session()->query<Cluster::pointer>
("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 artist a ON t.artist_id = a.id")
.where("a.id = ?").bind(self()->id())
.groupBy("c.id")
.orderBy("COUNT(c.id) DESC")
.limit(size);
WhereClause where;
Wt::Dbo::collection<Cluster::pointer> res = query;
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 INNER JOIN artist a ON t.artist_id = a.id";
return std::vector<Cluster::pointer>(res.begin(), res.end());
where.And(WhereClause("a.id = ?")).bind(std::to_string(self()->id()));
{
WhereClause clusterClause;
for (auto clusterType : clusterTypes)
clusterClause.Or(WhereClause("c_type.id = ?")).bind(std::to_string(clusterType.id()));
where.And(clusterClause);
}
oss << " " << where.get();
oss << "GROUP BY c.id ORDER BY COUNT(c.id) DESC";
Wt::Dbo::Query<Cluster::pointer> query = session()->query<Cluster::pointer>( oss.str() );
for (const std::string& bindArg : where.getBindArgs())
query.bind(bindArg);
Wt::Dbo::collection<Cluster::pointer> queryRes = query;
std::map<ClusterType::id_type, std::vector<Cluster::pointer>> clusters;
for (auto cluster : queryRes)
{
if (clusters[cluster->getType().id()].size() < size)
clusters[cluster->getType().id()].push_back(cluster);
}
std::vector<std::vector<Cluster::pointer>> res;
for (auto cluster_list : clusters)
res.push_back(cluster_list.second);
return res;
}
} // namespace Database
+4 -1
View File
@@ -31,6 +31,7 @@ namespace Database
class Track;
class Cluster;
class ClusterType;
class Release;
class Artist : public Wt::Dbo::Dbo<Artist>
@@ -65,7 +66,9 @@ class Artist : public Wt::Dbo::Dbo<Artist>
std::vector<Wt::Dbo::ptr<Release>> getReleases(const std::set<id_type>& clusterIds = std::set<id_type>()) const;
// Get the cluster of the tracks made by this artist
std::vector<Wt::Dbo::ptr<Cluster>> getClusters(int size) const;
// Each clusters are grouped by cluster type, sorted by the number of occurence
// size is the max number of cluster per cluster type
std::vector<std::vector<Wt::Dbo::ptr<Cluster>>> getClusterGroups(std::vector<Wt::Dbo::ptr<ClusterType>> clusterTypes, std::size_t size) const;
void setMBID(std::string mbid) { _MBID = mbid; }
+35 -10
View File
@@ -226,23 +226,48 @@ Release::getTracks(const std::set<id_type>& clusterIds) const
return std::vector< Wt::Dbo::ptr<Track> > (res.begin(), res.end());
}
std::vector<Wt::Dbo::ptr<Cluster>>
Release::getClusters(int size) const
std::vector<std::vector<Wt::Dbo::ptr<Cluster>>>
Release::getClusterGroups(std::vector<ClusterType::pointer> clusterTypes, std::size_t size) const
{
assert(self());
assert(self()->id() != Wt::Dbo::dbo_traits<Artist>::invalidId() );
assert(session());
Wt::Dbo::Query<Cluster::pointer> query = session()->query<Cluster::pointer>
("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 release r ON t.release_id = r.id")
.where("r.id = ?").bind(self()->id())
.groupBy("c.id")
.orderBy("COUNT(c.id) DESC")
.limit(size);
WhereClause where;
Wt::Dbo::collection<Cluster::pointer> res = query;
std::ostringstream oss;
return std::vector<Cluster::pointer>(res.begin(), res.end());
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 INNER JOIN release r ON t.release_id = r.id";
where.And(WhereClause("r.id = ?")).bind(std::to_string(self()->id()));
{
WhereClause clusterClause;
for (auto clusterType : clusterTypes)
clusterClause.Or(WhereClause("c_type.id = ?")).bind(std::to_string(clusterType.id()));
where.And(clusterClause);
}
oss << " " << where.get();
oss << "GROUP BY c.id ORDER BY COUNT(c.id) DESC";
Wt::Dbo::Query<Cluster::pointer> query = session()->query<Cluster::pointer>( oss.str() );
for (const std::string& bindArg : where.getBindArgs())
query.bind(bindArg);
Wt::Dbo::collection<Cluster::pointer> queryRes = query;
std::map<ClusterType::id_type, std::vector<Cluster::pointer>> clusters;
for (auto cluster : queryRes)
{
if (clusters[cluster->getType().id()].size() < size)
clusters[cluster->getType().id()].push_back(cluster);
}
std::vector<std::vector<Cluster::pointer>> res;
for (auto cluster_list : clusters)
res.push_back(cluster_list.second);
return res;
}
} // namespace Database
+4 -1
View File
@@ -55,7 +55,10 @@ class Release : public Wt::Dbo::Dbo<Release>
bool& moreExpected);
std::vector<Wt::Dbo::ptr<Track>> getTracks(const std::set<id_type>& clusters = std::set<id_type>()) const;
std::vector<Wt::Dbo::ptr<Cluster>> getClusters(int size) const;
// Get the cluster of the tracks that belong to this release
// Each clusters are grouped by cluster type, sorted by the number of occurence
// size is the max number of cluster per cluster type
std::vector<std::vector<Wt::Dbo::ptr<Cluster>>> getClusterGroups(std::vector<Wt::Dbo::ptr<ClusterType>> clusterTypes, std::size_t size) const;
// Create
static pointer create(Wt::Dbo::Session& session, const std::string& name, const std::string& MBID = "");