Centralized some db filters

This commit is contained in:
emeric
2025-02-09 18:35:09 +01:00
parent 13698c379b
commit b4bce77877
36 changed files with 297 additions and 386 deletions
+14 -14
View File
@@ -49,9 +49,9 @@ namespace lms::db
|| params.linkType
|| params.track.isValid()
|| params.release.isValid()
|| params.clusters.size() == 1
|| params.mediaLibrary.isValid()
|| params.label.isValid())
|| params.filters.clusters.size() == 1
|| params.filters.mediaLibrary.isValid()
|| params.filters.label.isValid())
{
query.join("track_artist_link t_a_l ON t_a_l.artist_id = a.id");
}
@@ -60,8 +60,8 @@ namespace lms::db
|| params.sortMethod == ArtistSortMethod::AddedDesc
|| params.writtenAfter.isValid()
|| params.release.isValid()
|| params.mediaLibrary.isValid()
|| params.label.isValid())
|| params.filters.mediaLibrary.isValid()
|| params.filters.label.isValid())
{
query.join("track t ON t.id = t_a_l.track_id");
@@ -71,13 +71,13 @@ namespace lms::db
if (params.release.isValid())
query.where("t.release_id = ?").bind(params.release);
if (params.mediaLibrary.isValid())
query.where("t.media_library_id = ?").bind(params.mediaLibrary);
if (params.filters.mediaLibrary.isValid())
query.where("t.media_library_id = ?").bind(params.filters.mediaLibrary);
if (params.label.isValid())
if (params.filters.label.isValid())
{
query.join("release_label r_l ON r_l.release_id = t.release_id");
query.where("r_l.label_id = ?").bind(params.label);
query.where("r_l.label_id = ?").bind(params.filters.label);
}
}
@@ -116,27 +116,27 @@ namespace lms::db
.bind(SyncState::PendingRemove);
}
if (params.clusters.size() == 1)
if (params.filters.clusters.size() == 1)
{
query.join("track_cluster t_c ON t_c.track_id = t_a_l.track_id")
.where("t_c.cluster_id = ?")
.bind(params.clusters.front());
.bind(params.filters.clusters.front());
}
else if (params.clusters.size() > 1)
else if (params.filters.clusters.size() > 1)
{
std::ostringstream oss;
oss << "a.id IN (SELECT DISTINCT t_a_l.artist_id FROM track_artist_link t_a_l"
" INNER JOIN track_cluster t_c ON t_c.track_id = t_a_l.track_id";
WhereClause clusterClause;
for (const ClusterId clusterId : params.clusters)
for (const ClusterId clusterId : params.filters.clusters)
{
clusterClause.Or(WhereClause("t_c.cluster_id = ?"));
query.bind(clusterId);
}
oss << " " << clusterClause.get();
oss << " GROUP BY t_a_l.track_id,t_a_l.artist_id HAVING COUNT(DISTINCT t_c.cluster_id) = " << params.clusters.size() << ")";
oss << " GROUP BY t_a_l.track_id,t_a_l.artist_id HAVING COUNT(DISTINCT t_c.cluster_id) = " << params.filters.clusters.size() << ")";
query.where(oss.str());
}
+22 -22
View File
@@ -42,38 +42,38 @@ namespace lms::db
assert(!params.artist.isValid()); // poor check
if (params.library.isValid() || params.label.isValid())
if (params.filters.mediaLibrary.isValid() || params.filters.label.isValid())
{
query.join("track t ON t.id = t_a_l.track_id");
}
if (params.library.isValid())
query.where("t.media_library_id = ?").bind(params.library);
if (params.filters.mediaLibrary.isValid())
query.where("t.media_library_id = ?").bind(params.filters.mediaLibrary);
if (params.label.isValid())
if (params.filters.label.isValid())
{
query.join("release_label r_l ON t.release_id = r_l.release_id");
query.where("r_l.label_id = ?").bind(params.label);
query.where("r_l.label_id = ?").bind(params.filters.label);
}
if (params.linkType)
query.where("t_a_l.type = ?").bind(*params.linkType);
if (!params.clusters.empty())
if (!params.filters.clusters.empty())
{
std::ostringstream oss;
oss << "a.id IN (SELECT DISTINCT t_a_l.artist_id FROM track_artist_link t_a_l"
" INNER JOIN track_cluster t_c ON t_c.track_id = t_a_l.track_id";
WhereClause clusterClause;
for (auto id : params.clusters)
for (const db::ClusterId id : params.filters.clusters)
{
clusterClause.Or(WhereClause("t_c.cluster_id = ?"));
query.bind(id);
}
oss << " " << clusterClause.get();
oss << " GROUP BY t_a_l.track_id,t_a_l.artist_id HAVING COUNT(DISTINCT t_c.cluster_id) = " << params.clusters.size() << ")";
oss << " GROUP BY t_a_l.track_id,t_a_l.artist_id HAVING COUNT(DISTINCT t_c.cluster_id) = " << params.filters.clusters.size() << ")";
query.where(oss.str());
}
@@ -118,16 +118,16 @@ namespace lms::db
.bind(params.artist);
}
if (params.library.isValid())
query.where("t.media_library_id = ?").bind(params.library);
if (params.filters.mediaLibrary.isValid())
query.where("t.media_library_id = ?").bind(params.filters.mediaLibrary);
if (params.label.isValid())
if (params.filters.label.isValid())
{
query.join("release_label r_l ON r_l.release_id = r.id");
query.where("r_l.label_id = ?").bind(params.label);
query.where("r_l.label_id = ?").bind(params.filters.label);
}
if (!params.clusters.empty())
if (!params.filters.clusters.empty())
{
std::ostringstream oss;
oss << "r.id IN (SELECT DISTINCT r.id FROM release r"
@@ -136,14 +136,14 @@ namespace lms::db
" INNER JOIN track_cluster t_c ON t_c.track_id = t.id";
WhereClause clusterClause;
for (ClusterId id : params.clusters)
for (const ClusterId id : params.filters.clusters)
{
clusterClause.Or(WhereClause("c.id = ?"));
query.bind(id);
}
oss << " " << clusterClause.get();
oss << " GROUP BY t.id HAVING COUNT(DISTINCT c.id) = " << params.clusters.size() << ")";
oss << " GROUP BY t.id HAVING COUNT(DISTINCT c.id) = " << params.filters.clusters.size() << ")";
query.where(oss.str());
}
@@ -171,16 +171,16 @@ namespace lms::db
.bind(params.artist);
}
if (params.library.isValid())
query.where("t.media_library_id = ?").bind(params.library);
if (params.filters.mediaLibrary.isValid())
query.where("t.media_library_id = ?").bind(params.filters.mediaLibrary);
if (params.label.isValid())
if (params.filters.label.isValid())
{
query.join("release_label r_l ON r_l.release_id = t.release_id");
query.where("r_l.label_id = ?").bind(params.label);
query.where("r_l.label_id = ?").bind(params.filters.label);
}
if (!params.clusters.empty())
if (!params.filters.clusters.empty())
{
std::ostringstream oss;
oss << "t.id IN (SELECT DISTINCT t.id FROM track t"
@@ -188,14 +188,14 @@ namespace lms::db
" INNER JOIN cluster c ON c.id = t_c.cluster_id";
WhereClause clusterClause;
for (auto id : params.clusters)
for (const ClusterId id : params.filters.clusters)
{
clusterClause.Or(WhereClause("c.id = ?")).bind(id.toString());
query.bind(id);
}
oss << " " << clusterClause.get();
oss << " GROUP BY t.id HAVING COUNT(*) = " << params.clusters.size() << ")";
oss << " GROUP BY t.id HAVING COUNT(*) = " << params.filters.clusters.size() << ")";
query.where(oss.str());
}
+11 -11
View File
@@ -60,8 +60,8 @@ namespace lms::db
|| params.writtenAfter.isValid()
|| params.dateRange
|| params.artist.isValid()
|| params.clusters.size() == 1
|| params.mediaLibrary.isValid()
|| params.filters.clusters.size() == 1
|| params.filters.mediaLibrary.isValid()
|| params.directory.isValid()
|| params.parentDirectory.isValid())
{
@@ -74,13 +74,13 @@ namespace lms::db
query.where("d.parent_directory_id = ?").bind(params.parentDirectory);
}
if (params.mediaLibrary.isValid())
query.where("t.media_library_id = ?").bind(params.mediaLibrary);
if (params.filters.mediaLibrary.isValid())
query.where("t.media_library_id = ?").bind(params.filters.mediaLibrary);
if (params.label.isValid())
if (params.filters.label.isValid())
{
query.join("release_label r_l ON r_l.release_id = r.id");
query.where("r_l.label_id = ?").bind(params.label);
query.where("r_l.label_id = ?").bind(params.filters.label);
}
if (params.directory.isValid())
@@ -174,27 +174,27 @@ namespace lms::db
}
}
if (params.clusters.size() == 1)
if (params.filters.clusters.size() == 1)
{
query.join("track_cluster t_c ON t_c.track_id = t.id")
.where("t_c.cluster_id = ?")
.bind(params.clusters.front());
.bind(params.filters.clusters.front());
}
else if (params.clusters.size() > 1)
else if (params.filters.clusters.size() > 1)
{
std::ostringstream oss;
oss << "r.id IN (SELECT DISTINCT t.release_id FROM track t"
" INNER JOIN track_cluster t_c ON t_c.track_id = t.id";
WhereClause clusterClause;
for (const ClusterId clusterId : params.clusters)
for (const ClusterId clusterId : params.filters.clusters)
{
clusterClause.Or(WhereClause("t_c.cluster_id = ?"));
query.bind(clusterId);
}
oss << " " << clusterClause.get();
oss << " GROUP BY t.id HAVING COUNT(*) = " << params.clusters.size() << ")";
oss << " GROUP BY t.id HAVING COUNT(*) = " << params.filters.clusters.size() << ")";
query.where(oss.str());
}
+9 -9
View File
@@ -79,28 +79,28 @@ namespace lms::db
.bind(SyncState::PendingRemove);
}
if (params.clusters.size() == 1)
if (params.filters.clusters.size() == 1)
{
// optim
query.join("track_cluster t_c ON t_c.track_id = t.id")
.where("t_c.cluster_id = ?")
.bind(params.clusters.front());
.bind(params.filters.clusters.front());
}
else if (params.clusters.size() > 1)
else if (params.filters.clusters.size() > 1)
{
std::ostringstream oss;
oss << "t.id IN (SELECT DISTINCT t.id FROM track t"
" INNER JOIN track_cluster t_c ON t_c.track_id = t.id";
WhereClause clusterClause;
for (const ClusterId clusterId : params.clusters)
for (const ClusterId clusterId : params.filters.clusters)
{
clusterClause.Or(WhereClause("t_c.cluster_id = ?"));
query.bind(clusterId);
}
oss << " " << clusterClause.get();
oss << " GROUP BY t.id HAVING COUNT(*) = " << params.clusters.size() << ")";
oss << " GROUP BY t.id HAVING COUNT(*) = " << params.filters.clusters.size() << ")";
query.where(oss.str());
}
@@ -159,13 +159,13 @@ namespace lms::db
if (params.discNumber)
query.where("t.disc_number = ?").bind(*params.discNumber);
if (params.mediaLibrary.isValid())
query.where("t.media_library_id = ?").bind(params.mediaLibrary);
if (params.filters.mediaLibrary.isValid())
query.where("t.media_library_id = ?").bind(params.filters.mediaLibrary);
if (params.label.isValid())
if (params.filters.label.isValid())
{
query.join("release_label r_l ON r_l.release_id = t.release_id");
query.where("r_l.label_id = ?").bind(params.label);
query.where("r_l.label_id = ?").bind(params.filters.label);
}
if (params.directory.isValid())
+18 -7
View File
@@ -42,7 +42,9 @@ namespace lms::db
auto query{ session.getDboSession()->query<ResultType>("SELECT " + std::string{ itemToSelect } + " FROM tracklist t_l") };
if (!params.clusters.empty() || params.mediaLibrary.isValid())
if (!params.filters.clusters.empty()
|| params.filters.mediaLibrary.isValid()
|| params.filters.label.isValid())
{
query.join("tracklist_entry t_l_e ON t_l_e.tracklist_id = t_l.id");
query.groupBy("t_l.id");
@@ -51,11 +53,20 @@ namespace lms::db
for (std::string_view keyword : params.keywords)
query.where("t_l.name LIKE ? ESCAPE '" ESCAPE_CHAR_STR "'").bind("%" + utils::escapeLikeKeyword(keyword) + "%");
if (params.mediaLibrary.isValid())
if (params.filters.mediaLibrary.isValid()
|| params.filters.label.isValid())
{
query.join("track t ON t.id = t_l_e.track_id");
if (params.mediaLibrary.isValid())
query.where("t.media_library_id = ?").bind(params.mediaLibrary);
if (params.filters.mediaLibrary.isValid())
query.where("t.media_library_id = ?").bind(params.filters.mediaLibrary);
if (params.filters.label.isValid())
{
query.join("release_label r_l ON r_l.release_id = t.release_id");
query.where("r_l.label_id = ?").bind(params.filters.label);
}
}
if (params.user.isValid())
query.where("t_l.user_id = ?").bind(params.user);
@@ -68,7 +79,7 @@ namespace lms::db
if (params.visibility)
query.where("t_l.visibility = ?").bind(*params.visibility);
if (!params.clusters.empty())
if (!params.filters.clusters.empty())
{
std::ostringstream oss;
oss << "t_l_e.track_id IN (SELECT DISTINCT t.id FROM track t"
@@ -76,14 +87,14 @@ namespace lms::db
" INNER JOIN cluster c ON c.id = t_c.cluster_id";
WhereClause clusterClause;
for (const ClusterId clusterId : params.clusters)
for (const ClusterId clusterId : params.filters.clusters)
{
clusterClause.Or(WhereClause("c.id = ?"));
query.bind(clusterId);
}
oss << " " << clusterClause.get();
oss << " GROUP BY t.id HAVING COUNT(*) = " << params.clusters.size() << ")";
oss << " GROUP BY t.id HAVING COUNT(*) = " << params.filters.clusters.size() << ")";
query.where(oss.str());
}