More permissive grouping of multi disc albums (each disc can now be split on sub directories) when musicbrainz ids are not set, fixes #481

This commit is contained in:
emeric
2024-09-08 11:56:27 +02:00
parent 4a70d9c24f
commit 95a5b58f48
7 changed files with 100 additions and 80 deletions
+14 -8
View File
@@ -41,6 +41,9 @@ namespace lms::db
template<typename ResultType>
Wt::Dbo::Query<ResultType> createQuery(Session& session, std::string_view itemToSelect, const Release::FindParameters& params)
{
assert(params.keywords.empty() || params.name.empty());
assert(!params.directory.isValid() || !params.parentDirectory.isValid());
auto query{ session.getDboSession()->query<ResultType>("SELECT " + std::string{ itemToSelect } + " from release r") };
if (params.sortMethod == ReleaseSortMethod::ArtistNameThenName
@@ -54,11 +57,18 @@ namespace lms::db
|| params.artist.isValid()
|| params.clusters.size() == 1
|| params.mediaLibrary.isValid()
|| params.directory.isValid())
|| params.directory.isValid()
|| params.parentDirectory.isValid())
{
query.join("track t ON t.release_id = r.id");
}
if (params.parentDirectory.isValid())
{
query.join("directory d ON t.directory_id = d.id");
query.where("d.parent_directory_id = ?").bind(params.parentDirectory);
}
if (params.mediaLibrary.isValid())
query.where("t.media_library_id = ?").bind(params.mediaLibrary);
@@ -82,6 +92,9 @@ namespace lms::db
query.where("COALESCE(CAST(SUBSTR(t.date, 1, 4) AS INTEGER), t.year) <= ?").bind(params.dateRange->end);
}
if (!params.name.empty())
query.where("r.name = ?").bind(params.name);
for (std::string_view keyword : params.keywords)
query.where("r.name LIKE ? ESCAPE '" ESCAPE_CHAR_STR "'").bind("%" + utils::escapeLikeKeyword(keyword) + "%");
@@ -287,13 +300,6 @@ namespace lms::db
return session.getDboSession()->add(std::unique_ptr<Release>{ new Release{ name, MBID } });
}
std::vector<Release::pointer> Release::find(Session& session, const std::string& name, const std::filesystem::path& releaseDirectory)
{
session.checkReadTransaction();
return utils::fetchQueryResults<Release::pointer>(session.getDboSession()->query<Wt::Dbo::ptr<Release>>("SELECT DISTINCT r from release r").join("track t ON t.release_id = r.id").where("r.name = ?").bind(std::string(name, 0, _maxNameLength)).where("t.absolute_file_path LIKE ? ESCAPE '" ESCAPE_CHAR_STR "'").bind(utils::escapeLikeKeyword(releaseDirectory.string()) + "%"));
}
Release::pointer Release::find(Session& session, const core::UUID& mbid)
{
session.checkReadTransaction();