diff --git a/approot/messages.xml b/approot/messages.xml
index 146bfdbe..81819ddc 100644
--- a/approot/messages.xml
+++ b/approot/messages.xml
@@ -14,6 +14,8 @@
Discard
Edit
This field must be in upper case
+Display limit reached — refine your search to see more results
+No results found
Loading...
Login
Logout
diff --git a/approot/messages_es.xml b/approot/messages_es.xml
index 21ba6ad6..53be4490 100644
--- a/approot/messages_es.xml
+++ b/approot/messages_es.xml
@@ -14,6 +14,8 @@
Descartar
Editar
Este campo debe estar en mayúsculas
+Límite de visualización alcanzado — refine su búsqueda para ver más resultados
+No se han encontrado resultados
Cargando...
Usuario
Salir
diff --git a/approot/messages_fr.xml b/approot/messages_fr.xml
index 44a7f588..69751f6c 100644
--- a/approot/messages_fr.xml
+++ b/approot/messages_fr.xml
@@ -14,6 +14,8 @@
Annuler
Editer
Ce champ doit être en majuscule
+Limite d'affichage atteinte — affinez votre recherche pour voir plus de résultats
+Aucun résultat
Chargement...
Login
Quitter
diff --git a/approot/messages_it.xml b/approot/messages_it.xml
index 1ec58f23..3ea55b12 100644
--- a/approot/messages_it.xml
+++ b/approot/messages_it.xml
@@ -14,6 +14,8 @@
Annulla
Modifica
Questo campo deve essere in maiuscolo
+Limite di visualizzazione raggiunto — affina la ricerca per vedere più risultati
+Nessun risultato trovato
Caricamento...
Login
Logout
diff --git a/approot/messages_pl.xml b/approot/messages_pl.xml
index f35671cd..1b4613f1 100644
--- a/approot/messages_pl.xml
+++ b/approot/messages_pl.xml
@@ -14,6 +14,8 @@
Odrzuć
Zmień
Wartość musi się zaczynać wielką literą
+Osiągnięto limit wyświetlania — doprecyzuj wyszukiwanie, aby zobaczyć więcej wyników
+Brak wyników
Wczytywanie...
Login
Wyloguj
diff --git a/approot/messages_zh.xml b/approot/messages_zh.xml
index c0bc9f44..44cdfa56 100644
--- a/approot/messages_zh.xml
+++ b/approot/messages_zh.xml
@@ -14,6 +14,8 @@
撤销
编辑
此字段必须为大写
+已达到显示上限 — 请精简搜索条件以查看更多结果
+未找到结果
加载中...
登陆
注销
diff --git a/approot/misc.xml b/approot/misc.xml
index b62f3215..7a87c19a 100644
--- a/approot/misc.xml
+++ b/approot/misc.xml
@@ -9,6 +9,7 @@
+
${elements}
${loading-indicator}
diff --git a/src/libs/database/impl/Utils.hpp b/src/libs/database/impl/Utils.hpp
index 3d13303c..838cc39a 100644
--- a/src/libs/database/impl/Utils.hpp
+++ b/src/libs/database/impl/Utils.hpp
@@ -128,29 +128,10 @@ namespace lms::db::utils
}
template
- RangeResults execRangeQuery(Query& query, const std::optional range)
+ std::vector execRangeQuery(Query& query, const std::optional range)
{
- RangeResults res;
-
- if (range)
- {
- res.range.offset = range->offset;
- applyRange(query, Range{ range->offset, range->size + 1 });
-
- res.results.reserve(range->size);
- }
-
- // TODO optim useless last copy
- res.results = utils::fetchQueryResults(query);
- if (range && (res.results.size() == range->size + 1))
- {
- res.moreResults = true;
- res.results.pop_back();
- }
-
- res.range.size = res.results.size();
-
- return res;
+ applyRange(query, range);
+ return utils::fetchQueryResults(query);
}
template
@@ -162,35 +143,6 @@ namespace lms::db::utils
forEachQueryResult(query, std::forward(func));
}
- template
- void forEachQueryRangeResult(Query& query, std::optional range, bool& moreResults, UnaryFunc&& func)
- {
- using ResultType = typename QueryResultType::type;
-
- if (range)
- applyRange(query, Range{ range->offset, range->size + 1 });
-
- moreResults = false;
-
- std::size_t count{};
- ScopedQueryProfiler queryProfiler{ query };
- const auto collection{ query.resultList() };
- auto it{ fetchFirstResult(collection) };
- while (it != collection.end())
- {
- if (range && (count++ == static_cast(range->size)))
- {
- moreResults = true;
- break;
- }
-
- queryProfiler.suspend();
- func(*it);
- queryProfiler.resume();
- fetchNextResult(it);
- }
- }
-
template
void executeCommand(Wt::Dbo::Session& session, std::string_view command, const Args&... args)
{
diff --git a/src/libs/database/impl/objects/Artist.cpp b/src/libs/database/impl/objects/Artist.cpp
index ea9e6b48..ffa512f8 100644
--- a/src/libs/database/impl/objects/Artist.cpp
+++ b/src/libs/database/impl/objects/Artist.cpp
@@ -135,14 +135,13 @@ namespace lms::db
if (params.starringUser.isValid())
{
- assert(params.feedbackBackend);
query.join("starred_artist s_a ON s_a.artist_id = a.id")
+ .join("user u ON u.id = s_a.user_id")
.where("s_a.user_id = ?")
.bind(params.starringUser)
- .where("s_a.backend = ?")
- .bind(*params.feedbackBackend)
.where("s_a.sync_state <> ?")
- .bind(SyncState::PendingRemove);
+ .bind(SyncState::PendingRemove)
+ .where("s_a.backend = u.feedback_backend");
}
if (params.filters.clusters.size() == 1)
@@ -323,7 +322,7 @@ namespace lms::db
return utils::fetchQuerySingleResult(session.getDboSession()->query>("SELECT a FROM artist a").where("a.id = ?").bind(id));
}
- RangeResults Artist::findIds(Session& session, const FindParameters& params)
+ std::vector Artist::findIds(Session& session, const FindParameters& params)
{
session.checkReadTransaction();
@@ -331,7 +330,7 @@ namespace lms::db
return utils::execRangeQuery(query, params.range);
}
- RangeResults Artist::find(Session& session, const FindParameters& params)
+ std::vector Artist::find(Session& session, const FindParameters& params)
{
session.checkReadTransaction();
@@ -357,7 +356,7 @@ namespace lms::db
return IdRange{ .first = std::get<0>(res), .last = std::get<1>(res) };
}
- RangeResults Artist::findOrphanIds(Session& session, std::optional range)
+ std::vector Artist::findOrphanIds(Session& session, std::optional range)
{
// TODO extend with release artists
session.checkReadTransaction();
@@ -388,7 +387,7 @@ AND NOT EXISTS (
return utils::fetchQuerySingleResult(session.getDboSession()->query("SELECT 1 FROM artist").where("id = ?").bind(id)) == 1;
}
- RangeResults Artist::findWithMBIDNameVariants(Session& session, ArtistId& lastRetrievedArtist, std::optional range)
+ std::vector Artist::findWithMBIDNameVariants(Session& session, ArtistId& lastRetrievedArtist, std::optional range)
{
session.checkReadTransaction();
@@ -407,8 +406,8 @@ AND NOT EXISTS (
auto results{ utils::execRangeQuery(query, range) };
- if (!results.results.empty())
- lastRetrievedArtist = results.results.back()->getId();
+ if (!results.empty())
+ lastRetrievedArtist = results.back()->getId();
return results;
}
diff --git a/src/libs/database/impl/objects/Cluster.cpp b/src/libs/database/impl/objects/Cluster.cpp
index b574e798..2d57d9a4 100644
--- a/src/libs/database/impl/objects/Cluster.cpp
+++ b/src/libs/database/impl/objects/Cluster.cpp
@@ -130,7 +130,7 @@ namespace lms::db
return utils::fetchQuerySingleResult(session.getDboSession()->query("SELECT COUNT(*) FROM cluster"));
}
- RangeResults Cluster::findIds(Session& session, const FindParameters& params)
+ std::vector Cluster::findIds(Session& session, const FindParameters& params)
{
session.checkReadTransaction();
auto query{ createQuery(session, params) };
@@ -138,7 +138,7 @@ namespace lms::db
return utils::execRangeQuery(query, params.range);
}
- RangeResults Cluster::find(Session& session, const FindParameters& params)
+ std::vector Cluster::find(Session& session, const FindParameters& params)
{
session.checkReadTransaction();
auto query{ createQuery>(session, params) };
@@ -154,7 +154,7 @@ namespace lms::db
return utils::forEachQueryResult(query, _func);
}
- RangeResults Cluster::findOrphanIds(Session& session, std::optional range)
+ std::vector Cluster::findOrphanIds(Session& session, std::optional range)
{
session.checkReadTransaction();
auto query{ session.getDboSession()->query("SELECT DISTINCT c.id FROM cluster c WHERE NOT EXISTS(SELECT 1 FROM track_cluster t_c WHERE t_c.cluster_id = c.id)") };
@@ -188,7 +188,7 @@ namespace lms::db
_tracks.insert(getDboPtr(track));
}
- RangeResults Cluster::getTracks(std::optional range) const
+ std::vector Cluster::getTracks(std::optional range) const
{
assert(session());
@@ -217,7 +217,7 @@ namespace lms::db
return utils::fetchQuerySingleResult(session.getDboSession()->query("SELECT COUNT(*) FROM cluster_type"));
}
- RangeResults ClusterType::findOrphanIds(Session& session, std::optional range)
+ std::vector ClusterType::findOrphanIds(Session& session, std::optional range)
{
session.checkReadTransaction();
@@ -229,7 +229,7 @@ namespace lms::db
return utils::execRangeQuery(query, range);
}
- RangeResults ClusterType::findUsed(Session& session, std::optional range)
+ std::vector ClusterType::findUsed(Session& session, std::optional range)
{
session.checkReadTransaction();
@@ -263,7 +263,7 @@ namespace lms::db
return utils::fetchQuerySingleResult(session.getDboSession()->find().where("id = ?").bind(id));
}
- RangeResults ClusterType::findIds(Session& session, std::optional range)
+ std::vector ClusterType::findIds(Session& session, std::optional range)
{
session.checkReadTransaction();
diff --git a/src/libs/database/impl/objects/Directory.cpp b/src/libs/database/impl/objects/Directory.cpp
index 47be8b9a..822ce273 100644
--- a/src/libs/database/impl/objects/Directory.cpp
+++ b/src/libs/database/impl/objects/Directory.cpp
@@ -173,7 +173,7 @@ namespace lms::db
});
}
- RangeResults Directory::find(Session& session, const FindParameters& params)
+ std::vector Directory::find(Session& session, const FindParameters& params)
{
auto query{ createQuery(session, params) };
return utils::execRangeQuery(query, params.range);
@@ -187,7 +187,7 @@ namespace lms::db
});
}
- RangeResults Directory::findOrphanIds(Session& session, std::optional range)
+ std::vector Directory::findOrphanIds(Session& session, std::optional range)
{
session.checkReadTransaction();
@@ -208,7 +208,7 @@ namespace lms::db
return utils::execRangeQuery(query, range);
}
- RangeResults Directory::findMismatchedLibrary(Session& session, std::optional range, const std::filesystem::path& rootPath, MediaLibraryId expectedLibraryId)
+ std::vector Directory::findMismatchedLibrary(Session& session, std::optional range, const std::filesystem::path& rootPath, MediaLibraryId expectedLibraryId)
{
session.checkReadTransaction();
@@ -219,7 +219,7 @@ namespace lms::db
return utils::execRangeQuery(query, range);
}
- RangeResults Directory::findRootDirectories(Session& session, std::optional range)
+ std::vector Directory::findRootDirectories(Session& session, std::optional range)
{
auto query{ session.getDboSession()->query>("SELECT d from directory d").where("d.parent_directory_id IS NULL") };
return utils::execRangeQuery(query, range);
diff --git a/src/libs/database/impl/objects/Genre.cpp b/src/libs/database/impl/objects/Genre.cpp
index d2149ad3..8f546257 100644
--- a/src/libs/database/impl/objects/Genre.cpp
+++ b/src/libs/database/impl/objects/Genre.cpp
@@ -128,14 +128,14 @@ namespace lms::db
return utils::fetchQuerySingleResult(session.getDboSession()->query("SELECT COUNT(*) FROM genre"));
}
- RangeResults Genre::findIds(Session& session, const FindParameters& params)
+ std::vector Genre::findIds(Session& session, const FindParameters& params)
{
session.checkReadTransaction();
auto query{ createQuery(session, params) };
return utils::execRangeQuery(query, params.range);
}
- RangeResults Genre::find(Session& session, const FindParameters& params)
+ std::vector Genre::find(Session& session, const FindParameters& params)
{
session.checkReadTransaction();
auto query{ createQuery>(session, params) };
@@ -165,7 +165,7 @@ namespace lms::db
return utils::fetchQuerySingleResult(session.getDboSession()->find().where("name = ?").bind(name));
}
- RangeResults Genre::findOrphanIds(Session& session, std::optional range)
+ std::vector Genre::findOrphanIds(Session& session, std::optional range)
{
session.checkReadTransaction();
auto query{ session.getDboSession()->query("SELECT g.id FROM genre g WHERE NOT EXISTS (SELECT 1 FROM track_genre t_g WHERE t_g.genre_id = g.id)") };
diff --git a/src/libs/database/impl/objects/Grouping.cpp b/src/libs/database/impl/objects/Grouping.cpp
index 96f6683a..80590c5f 100644
--- a/src/libs/database/impl/objects/Grouping.cpp
+++ b/src/libs/database/impl/objects/Grouping.cpp
@@ -128,14 +128,14 @@ namespace lms::db
return utils::fetchQuerySingleResult(session.getDboSession()->query("SELECT COUNT(*) FROM grouping"));
}
- RangeResults Grouping::findIds(Session& session, const FindParameters& params)
+ std::vector Grouping::findIds(Session& session, const FindParameters& params)
{
session.checkReadTransaction();
auto query{ createQuery(session, params) };
return utils::execRangeQuery(query, params.range);
}
- RangeResults Grouping::find(Session& session, const FindParameters& params)
+ std::vector Grouping::find(Session& session, const FindParameters& params)
{
session.checkReadTransaction();
auto query{ createQuery>(session, params) };
@@ -165,7 +165,7 @@ namespace lms::db
return utils::fetchQuerySingleResult(session.getDboSession()->find().where("name = ?").bind(name));
}
- RangeResults Grouping::findOrphanIds(Session& session, std::optional range)
+ std::vector Grouping::findOrphanIds(Session& session, std::optional range)
{
session.checkReadTransaction();
auto query{ session.getDboSession()->query("SELECT g.id FROM grouping g WHERE NOT EXISTS (SELECT 1 FROM track_grouping t_gr WHERE t_gr.grouping_id = g.id)") };
diff --git a/src/libs/database/impl/objects/Image.cpp b/src/libs/database/impl/objects/Image.cpp
index 152b076a..dde98c30 100644
--- a/src/libs/database/impl/objects/Image.cpp
+++ b/src/libs/database/impl/objects/Image.cpp
@@ -105,7 +105,7 @@ namespace lms::db
});
}
- RangeResults Image::find(Session& session, const FindParameters& params)
+ std::vector Image::find(Session& session, const FindParameters& params)
{
session.checkReadTransaction();
diff --git a/src/libs/database/impl/objects/Language.cpp b/src/libs/database/impl/objects/Language.cpp
index 9a3698c2..00230538 100644
--- a/src/libs/database/impl/objects/Language.cpp
+++ b/src/libs/database/impl/objects/Language.cpp
@@ -128,14 +128,14 @@ namespace lms::db
return utils::fetchQuerySingleResult(session.getDboSession()->query("SELECT COUNT(*) FROM language"));
}
- RangeResults Language::findIds(Session& session, const FindParameters& params)
+ std::vector Language::findIds(Session& session, const FindParameters& params)
{
session.checkReadTransaction();
auto query{ createQuery(session, params) };
return utils::execRangeQuery(query, params.range);
}
- RangeResults Language::find(Session& session, const FindParameters& params)
+ std::vector Language::find(Session& session, const FindParameters& params)
{
session.checkReadTransaction();
auto query{ createQuery>(session, params) };
@@ -165,7 +165,7 @@ namespace lms::db
return utils::fetchQuerySingleResult(session.getDboSession()->find().where("name = ?").bind(name));
}
- RangeResults Language::findOrphanIds(Session& session, std::optional range)
+ std::vector Language::findOrphanIds(Session& session, std::optional range)
{
session.checkReadTransaction();
auto query{ session.getDboSession()->query("SELECT l.id FROM language l WHERE NOT EXISTS (SELECT 1 FROM track_language t_l WHERE t_l.language_id = l.id)") };
diff --git a/src/libs/database/impl/objects/Listen.cpp b/src/libs/database/impl/objects/Listen.cpp
index 1736dd90..5370ddc7 100644
--- a/src/libs/database/impl/objects/Listen.cpp
+++ b/src/libs/database/impl/objects/Listen.cpp
@@ -23,10 +23,12 @@
#include
#include "database/Session.hpp"
+#include "database/objects/Artist.hpp"
#include "database/objects/Genre.hpp"
#include "database/objects/Grouping.hpp"
#include "database/objects/Language.hpp"
#include "database/objects/Mood.hpp"
+#include "database/objects/Release.hpp"
#include "database/objects/Track.hpp"
#include "database/objects/User.hpp"
@@ -46,10 +48,12 @@ namespace lms::db
auto query{ session.getDboSession()->query("SELECT a.id from artist a").join("track_artist_link t_a_l ON t_a_l.artist_id = a.id").join("listen l ON l.track_id = t_a_l.track_id") };
if (params.user.isValid())
- query.where("l.user_id = ?").bind(params.user);
-
- if (params.backend)
- query.where("l.backend = ?").bind(*params.backend);
+ {
+ query.join("user u ON u.id = l.user_id")
+ .where("l.user_id = ?")
+ .bind(params.user)
+ .where("l.backend = u.scrobbling_backend");
+ }
assert(!params.artist.isValid()); // poor check
@@ -161,10 +165,12 @@ namespace lms::db
auto query{ session.getDboSession()->query("SELECT r.id from release r").join("track t ON t.release_id = r.id").join("listen l ON l.track_id = t.id") };
if (params.user.isValid())
- query.where("l.user_id = ?").bind(params.user);
-
- if (params.backend)
- query.where("l.backend = ?").bind(*params.backend);
+ {
+ query.join("user u ON u.id = l.user_id")
+ .where("l.user_id = ?")
+ .bind(params.user)
+ .where("l.backend = u.scrobbling_backend");
+ }
if (params.artist.isValid())
{
@@ -244,10 +250,12 @@ namespace lms::db
auto query{ session.getDboSession()->query("SELECT t.id from track t").join("listen l ON l.track_id = t.id") };
if (params.user.isValid())
- query.where("l.user_id = ?").bind(params.user);
-
- if (params.backend)
- query.where("l.backend = ?").bind(*params.backend);
+ {
+ query.join("user u ON u.id = l.user_id")
+ .where("l.user_id = ?")
+ .bind(params.user)
+ .where("l.backend = u.scrobbling_backend");
+ }
if (params.artist.isValid())
{
@@ -348,7 +356,7 @@ namespace lms::db
return utils::fetchQuerySingleResult(session.getDboSession()->query>("SELECT l from listen l").where("l.id = ?").bind(id));
}
- RangeResults Listen::find(Session& session, const FindParameters& parameters)
+ std::vector Listen::find(Session& session, const FindParameters& parameters)
{
session.checkReadTransaction();
@@ -373,39 +381,88 @@ namespace lms::db
return utils::fetchQuerySingleResult(session.getDboSession()->find().where("user_id = ?").bind(userId).where("track_id = ?").bind(trackId).where("backend = ?").bind(backend).where("date_time = ?").bind(Wt::WDateTime::fromTime_t(dateTime.toTime_t())));
}
- RangeResults Listen::getTopArtists(Session& session, const ArtistStatsFindParameters& params)
+ std::vector Listen::getTopArtists(Session& session, const ArtistStatsFindParameters& params)
{
session.checkReadTransaction();
- auto query{ createArtistsQuery(session, params) };
-
- auto collection{ query
- .orderBy("COUNT(a.id) DESC")
- .groupBy("a.id") };
-
+ auto query{ createArtistsQuery(session, params).orderBy("COUNT(a.id) DESC").groupBy("a.id") };
return utils::execRangeQuery(query, params.range);
}
- RangeResults Listen::getTopReleases(Session& session, const StatsFindParameters& params)
+ std::vector Listen::getTopReleases(Session& session, const StatsFindParameters& params)
+ {
+ session.checkReadTransaction();
+ auto query{ createReleasesQuery(session, params).orderBy("COUNT(r.id) DESC").groupBy("r.id") };
+ return utils::execRangeQuery(query, params.range);
+ }
+
+ std::vector Listen::getTopTracks(Session& session, const StatsFindParameters& params)
+ {
+ session.checkReadTransaction();
+ auto query{ createTracksQuery(session, params).orderBy("COUNT(t.id) DESC").groupBy("t.id") };
+ return utils::execRangeQuery(query, params.range);
+ }
+
+ std::vector Listen::getRecentArtists(Session& session, const ArtistStatsFindParameters& params)
+ {
+ session.checkReadTransaction();
+ auto query{ createArtistsQuery(session, params).groupBy("a.id").having("l.date_time = MAX(l.date_time)").orderBy("l.date_time DESC") };
+ return utils::execRangeQuery(query, params.range);
+ }
+
+ std::vector Listen::getRecentReleases(Session& session, const StatsFindParameters& params)
+ {
+ session.checkReadTransaction();
+ auto query{ createReleasesQuery(session, params).groupBy("r.id").having("l.date_time = MAX(l.date_time)").orderBy("l.date_time DESC") };
+ return utils::execRangeQuery(query, params.range);
+ }
+
+ std::vector Listen::getRecentTracks(Session& session, const StatsFindParameters& params)
+ {
+ session.checkReadTransaction();
+ auto query{ createTracksQuery(session, params).groupBy("t.id").having("l.date_time = MAX(l.date_time)").orderBy("l.date_time DESC") };
+ return utils::execRangeQuery(query, params.range);
+ }
+
+ void Listen::getTopArtists(Session& session, const ArtistStatsFindParameters& params, const std::function&)>& func)
+ {
+ session.checkReadTransaction();
+ auto query{ createArtistsQuery(session, params)
+ .orderBy("COUNT(a.id) DESC")
+ .groupBy("a.id") };
+
+ utils::forEachQueryRangeResult(query, params.range, [&](const ArtistId& id) {
+ if (const auto artist{ Artist::find(session, id) })
+ func(artist);
+ });
+ }
+
+ void Listen::getTopReleases(Session& session, const StatsFindParameters& params, const std::function&)>& func)
{
session.checkReadTransaction();
auto query{ createReleasesQuery(session, params)
.orderBy("COUNT(r.id) DESC")
.groupBy("r.id") };
- return utils::execRangeQuery(query, params.range);
+ utils::forEachQueryRangeResult(query, params.range, [&](const ReleaseId& id) {
+ if (const auto release{ Release::find(session, id) })
+ func(release);
+ });
}
- RangeResults Listen::getTopTracks(Session& session, const StatsFindParameters& params)
+ void Listen::getTopTracks(Session& session, const StatsFindParameters& params, const std::function&)>& func)
{
session.checkReadTransaction();
auto query{ createTracksQuery(session, params)
.orderBy("COUNT(t.id) DESC")
.groupBy("t.id") };
- return utils::execRangeQuery(query, params.range);
+ utils::forEachQueryRangeResult(query, params.range, [&](const TrackId& id) {
+ if (const auto track{ Track::find(session, id) })
+ func(track);
+ });
}
- RangeResults Listen::getRecentArtists(Session& session, const ArtistStatsFindParameters& params)
+ void Listen::getRecentArtists(Session& session, const ArtistStatsFindParameters& params, const std::function&)>& func)
{
session.checkReadTransaction();
auto query{ createArtistsQuery(session, params)
@@ -413,10 +470,13 @@ namespace lms::db
.having("l.date_time = MAX(l.date_time)")
.orderBy("l.date_time DESC") };
- return utils::execRangeQuery(query, params.range);
+ utils::forEachQueryRangeResult(query, params.range, [&](const ArtistId& id) {
+ if (const auto artist{ Artist::find(session, id) })
+ func(artist);
+ });
}
- RangeResults Listen::getRecentReleases(Session& session, const StatsFindParameters& params)
+ void Listen::getRecentReleases(Session& session, const StatsFindParameters& params, const std::function&)>& func)
{
session.checkReadTransaction();
auto query{ createReleasesQuery(session, params)
@@ -424,10 +484,13 @@ namespace lms::db
.having("l.date_time = MAX(l.date_time)")
.orderBy("l.date_time DESC") };
- return utils::execRangeQuery(query, params.range);
+ utils::forEachQueryRangeResult(query, params.range, [&](const ReleaseId& id) {
+ if (const auto release{ Release::find(session, id) })
+ func(release);
+ });
}
- RangeResults Listen::getRecentTracks(Session& session, const StatsFindParameters& params)
+ void Listen::getRecentTracks(Session& session, const StatsFindParameters& params, const std::function&)>& func)
{
session.checkReadTransaction();
auto query{ createTracksQuery(session, params)
@@ -435,7 +498,10 @@ namespace lms::db
.having("l.date_time = MAX(l.date_time)")
.orderBy("l.date_time DESC") };
- return utils::execRangeQuery(query, params.range);
+ utils::forEachQueryRangeResult(query, params.range, [&](const TrackId& id) {
+ if (const auto track{ Track::find(session, id) })
+ func(track);
+ });
}
std::size_t Listen::getCount(Session& session, UserId userId, TrackId trackId)
diff --git a/src/libs/database/impl/objects/Medium.cpp b/src/libs/database/impl/objects/Medium.cpp
index b98fbb72..4c2cd5ac 100644
--- a/src/libs/database/impl/objects/Medium.cpp
+++ b/src/libs/database/impl/objects/Medium.cpp
@@ -110,7 +110,7 @@ namespace lms::db
return IdRange{ .first = std::get<0>(res), .last = std::get<1>(res) };
}
- RangeResults Medium::findOrphanIds(Session& session, std::optional range)
+ std::vector Medium::findOrphanIds(Session& session, std::optional range)
{
session.checkReadTransaction();
diff --git a/src/libs/database/impl/objects/Mood.cpp b/src/libs/database/impl/objects/Mood.cpp
index 18430ba4..c2e5d478 100644
--- a/src/libs/database/impl/objects/Mood.cpp
+++ b/src/libs/database/impl/objects/Mood.cpp
@@ -128,14 +128,14 @@ namespace lms::db
return utils::fetchQuerySingleResult(session.getDboSession()->query("SELECT COUNT(*) FROM mood"));
}
- RangeResults Mood::findIds(Session& session, const FindParameters& params)
+ std::vector Mood::findIds(Session& session, const FindParameters& params)
{
session.checkReadTransaction();
auto query{ createQuery(session, params) };
return utils::execRangeQuery(query, params.range);
}
- RangeResults Mood::find(Session& session, const FindParameters& params)
+ std::vector Mood::find(Session& session, const FindParameters& params)
{
session.checkReadTransaction();
auto query{ createQuery>(session, params) };
@@ -165,7 +165,7 @@ namespace lms::db
return utils::fetchQuerySingleResult(session.getDboSession()->find().where("name = ?").bind(name));
}
- RangeResults Mood::findOrphanIds(Session& session, std::optional range)
+ std::vector Mood::findOrphanIds(Session& session, std::optional range)
{
session.checkReadTransaction();
auto query{ session.getDboSession()->query("SELECT m.id FROM mood m WHERE NOT EXISTS (SELECT 1 FROM track_mood t_m WHERE t_m.mood_id = m.id)") };
diff --git a/src/libs/database/impl/objects/Release.cpp b/src/libs/database/impl/objects/Release.cpp
index 71c5f402..62202405 100644
--- a/src/libs/database/impl/objects/Release.cpp
+++ b/src/libs/database/impl/objects/Release.cpp
@@ -150,14 +150,13 @@ namespace lms::db
if (params.starringUser.isValid())
{
- assert(params.feedbackBackend);
query.join("starred_release s_r ON s_r.release_id = r.id")
+ .join("user u ON u.id = s_r.user_id")
.where("s_r.user_id = ?")
.bind(params.starringUser)
- .where("s_r.backend = ?")
- .bind(*params.feedbackBackend)
.where("s_r.sync_state <> ?")
- .bind(SyncState::PendingRemove);
+ .bind(SyncState::PendingRemove)
+ .where("s_r.backend = u.feedback_backend");
}
if (params.artist.isValid())
@@ -356,7 +355,7 @@ namespace lms::db
return utils::fetchQuerySingleResult(session.getDboSession()->query>("SELECT c from country c").where("c.name = ?").bind(name));
}
- RangeResults Country::findOrphanIds(Session& session, std::optional range)
+ std::vector Country::findOrphanIds(Session& session, std::optional range)
{
session.checkReadTransaction();
@@ -418,7 +417,7 @@ namespace lms::db
});
}
- RangeResults Label::findOrphanIds(Session& session, std::optional range)
+ std::vector Label::findOrphanIds(Session& session, std::optional range)
{
session.checkReadTransaction();
@@ -480,7 +479,7 @@ namespace lms::db
});
}
- RangeResults ReleaseType::findOrphanIds(Session& session, std::optional range)
+ std::vector ReleaseType::findOrphanIds(Session& session, std::optional range)
{
session.checkReadTransaction();
@@ -527,7 +526,7 @@ namespace lms::db
return utils::fetchQuerySingleResult(session.getDboSession()->query("SELECT COUNT(*) FROM release"));
}
- RangeResults Release::findOrphanIds(Session& session, std::optional range)
+ std::vector Release::findOrphanIds(Session& session, std::optional range)
{
session.checkReadTransaction();
@@ -574,7 +573,7 @@ namespace lms::db
return IdRange{ .first = std::get<0>(res), .last = std::get<1>(res) };
}
- RangeResults Release::find(Session& session, const FindParameters& params)
+ std::vector Release::find(Session& session, const FindParameters& params)
{
session.checkReadTransaction();
@@ -590,7 +589,7 @@ namespace lms::db
utils::forEachQueryRangeResult(query, params.range, func);
}
- RangeResults Release::findIds(Session& session, const FindParameters& params)
+ std::vector Release::findIds(Session& session, const FindParameters& params)
{
session.checkReadTransaction();
diff --git a/src/libs/database/impl/objects/StarredTrack.cpp b/src/libs/database/impl/objects/StarredTrack.cpp
index ed6ebecf..c21b2682 100644
--- a/src/libs/database/impl/objects/StarredTrack.cpp
+++ b/src/libs/database/impl/objects/StarredTrack.cpp
@@ -78,7 +78,7 @@ namespace lms::db
return utils::fetchQuerySingleResult(session.getDboSession()->query("SELECT 1 from starred_track").where("track_id = ?").bind(trackId).where("user_id = ?").bind(userId).where("backend = ?").bind(backend));
}
- RangeResults StarredTrack::find(Session& session, const FindParameters& params)
+ std::vector StarredTrack::find(Session& session, const FindParameters& params)
{
session.checkReadTransaction();
diff --git a/src/libs/database/impl/objects/Track.cpp b/src/libs/database/impl/objects/Track.cpp
index 2e95d3ce..1b01fd72 100644
--- a/src/libs/database/impl/objects/Track.cpp
+++ b/src/libs/database/impl/objects/Track.cpp
@@ -77,14 +77,13 @@ namespace lms::db
if (params.starringUser.isValid())
{
- assert(params.feedbackBackend);
query.join("starred_track s_t ON s_t.track_id = t.id")
+ .join("user u ON u.id = s_t.user_id")
.where("s_t.user_id = ?")
.bind(params.starringUser)
- .where("s_t.backend = ?")
- .bind(*params.feedbackBackend)
.where("s_t.sync_state <> ?")
- .bind(SyncState::PendingRemove);
+ .bind(SyncState::PendingRemove)
+ .where("s_t.backend = u.feedback_backend");
}
if (params.filters.clusters.size() == 1)
@@ -435,7 +434,7 @@ namespace lms::db
return utils::fetchQueryResults(session.getDboSession()->query>("SELECT t from track t").where("t.recording_mbid = ?").bind(mbid));
}
- RangeResults Track::findIdsTrackMBIDDuplicates(Session& session, std::optional range)
+ std::vector Track::findIdsTrackMBIDDuplicates(Session& session, std::optional range)
{
session.checkReadTransaction();
@@ -564,7 +563,7 @@ namespace lms::db
return _preferredMediaArtwork.id();
}
- RangeResults Track::findIds(Session& session, const FindParameters& parameters)
+ std::vector Track::findIds(Session& session, const FindParameters& parameters)
{
session.checkReadTransaction();
@@ -572,7 +571,7 @@ namespace lms::db
return utils::execRangeQuery(query, parameters.range);
}
- RangeResults Track::find(Session& session, const FindParameters& parameters)
+ std::vector Track::find(Session& session, const FindParameters& parameters)
{
session.checkReadTransaction();
@@ -588,14 +587,6 @@ namespace lms::db
utils::forEachQueryRangeResult(query, params.range, func);
}
- void Track::find(Session& session, const FindParameters& params, bool& moreResults, const std::function& func)
- {
- session.checkReadTransaction();
-
- auto query{ createQuery>(session, params) };
- utils::forEachQueryRangeResult(query, params.range, moreResults, func);
- }
-
std::size_t Track::getCount(Session& session, const FindParameters& params)
{
session.checkReadTransaction();
diff --git a/src/libs/database/impl/objects/TrackBookmark.cpp b/src/libs/database/impl/objects/TrackBookmark.cpp
index 7da5f4fc..5ca7f1a5 100644
--- a/src/libs/database/impl/objects/TrackBookmark.cpp
+++ b/src/libs/database/impl/objects/TrackBookmark.cpp
@@ -54,7 +54,7 @@ namespace lms::db
return utils::fetchQuerySingleResult(session.getDboSession()->query("SELECT COUNT(*) FROM track_bookmark"));
}
- RangeResults TrackBookmark::find(Session& session, UserId userId, std::optional range)
+ std::vector TrackBookmark::find(Session& session, UserId userId, std::optional range)
{
session.checkReadTransaction();
diff --git a/src/libs/database/impl/objects/TrackEmbeddedImage.cpp b/src/libs/database/impl/objects/TrackEmbeddedImage.cpp
index 5a75f034..c800afdc 100644
--- a/src/libs/database/impl/objects/TrackEmbeddedImage.cpp
+++ b/src/libs/database/impl/objects/TrackEmbeddedImage.cpp
@@ -150,7 +150,7 @@ namespace lms::db
return utils::fetchQuerySingleResult(query);
}
- RangeResults TrackEmbeddedImage::findOrphanIds(Session& session, std::optional range)
+ std::vector TrackEmbeddedImage::findOrphanIds(Session& session, std::optional range)
{
session.checkReadTransaction();
diff --git a/src/libs/database/impl/objects/TrackList.cpp b/src/libs/database/impl/objects/TrackList.cpp
index bfdf6b5a..486aa5b9 100644
--- a/src/libs/database/impl/objects/TrackList.cpp
+++ b/src/libs/database/impl/objects/TrackList.cpp
@@ -182,7 +182,7 @@ namespace lms::db
return utils::fetchQuerySingleResult(session.getDboSession()->query>("select t_l from tracklist t_l").where("t_l.name = ?").bind(name).where("t_l.type = ?").bind(type).where("t_l.user_id = ?").bind(userId));
}
- RangeResults TrackList::find(Session& session, const FindParameters& params)
+ std::vector TrackList::find(Session& session, const FindParameters& params)
{
session.checkReadTransaction();
auto query{ createQuery(session, params) };
@@ -218,13 +218,13 @@ namespace lms::db
TrackListEntry::pointer res;
auto entries = getEntries(Range{ pos, 1 });
- if (!entries.results.empty())
- res = entries.results.front();
+ if (!entries.empty())
+ res = entries.front();
return res;
}
- RangeResults> TrackList::getEntries(std::optional range) const
+ std::vector> TrackList::getEntries(std::optional range) const
{
assert(session());
diff --git a/src/libs/database/impl/objects/TrackLyrics.cpp b/src/libs/database/impl/objects/TrackLyrics.cpp
index 666492a2..59576066 100644
--- a/src/libs/database/impl/objects/TrackLyrics.cpp
+++ b/src/libs/database/impl/objects/TrackLyrics.cpp
@@ -121,7 +121,7 @@ namespace lms::db
});
}
- RangeResults TrackLyrics::findOrphanIds(Session& session, std::optional range)
+ std::vector TrackLyrics::findOrphanIds(Session& session, std::optional range)
{
session.checkReadTransaction();
diff --git a/src/libs/database/impl/objects/TrackMusicNNEmbeddings.cpp b/src/libs/database/impl/objects/TrackMusicNNEmbeddings.cpp
index 214afc43..a9c2a153 100644
--- a/src/libs/database/impl/objects/TrackMusicNNEmbeddings.cpp
+++ b/src/libs/database/impl/objects/TrackMusicNNEmbeddings.cpp
@@ -66,7 +66,7 @@ namespace lms::db
return utils::fetchQuerySingleResult(session.getDboSession()->find().where("track_id = ?").bind(trackId));
}
- RangeResults TrackMusicNNEmbeddings::find(Session& session, std::optional range)
+ std::vector TrackMusicNNEmbeddings::find(Session& session, std::optional range)
{
session.checkReadTransaction();
diff --git a/src/libs/database/impl/objects/User.cpp b/src/libs/database/impl/objects/User.cpp
index 1de617f3..050a5a68 100644
--- a/src/libs/database/impl/objects/User.cpp
+++ b/src/libs/database/impl/objects/User.cpp
@@ -61,7 +61,7 @@ namespace lms::db
return utils::fetchQuerySingleResult(session.getDboSession()->query("SELECT COUNT(*) FROM user"));
}
- RangeResults User::find(Session& session, const FindParameters& params)
+ std::vector User::find(Session& session, const FindParameters& params)
{
session.checkReadTransaction();
diff --git a/src/libs/database/include/database/Types.hpp b/src/libs/database/include/database/Types.hpp
index 46c1661d..849c79cd 100644
--- a/src/libs/database/include/database/Types.hpp
+++ b/src/libs/database/include/database/Types.hpp
@@ -38,8 +38,6 @@ namespace lms::db
// Request:
// size = 0 => means we don't want data
- // Response (via RangeResults)
- // size => results size
struct Range
{
std::size_t offset{};
@@ -65,40 +63,6 @@ namespace lms::db
}
}
- template
- struct RangeResults
- {
- Range range;
- std::vector