From 75c3df6958428653d220fc3fec7274ac0ee004eb Mon Sep 17 00:00:00 2001 From: emeric Date: Sun, 16 Jun 2024 20:43:02 +0200 Subject: [PATCH] Support fromYear > lastYear to sort by descending order. fixes #482 --- src/libs/database/impl/Release.cpp | 10 +++++++--- src/libs/database/include/database/Types.hpp | 3 ++- src/libs/database/test/Release.cpp | 11 ++++++++++- src/libs/subsonic/impl/entrypoints/AlbumSongLists.cpp | 4 ++-- 4 files changed, 21 insertions(+), 7 deletions(-) diff --git a/src/libs/database/impl/Release.cpp b/src/libs/database/impl/Release.cpp index 75810ff3..ff37fe94 100644 --- a/src/libs/database/impl/Release.cpp +++ b/src/libs/database/impl/Release.cpp @@ -45,7 +45,8 @@ namespace lms::db if (params.sortMethod == ReleaseSortMethod::ArtistNameThenName || params.sortMethod == ReleaseSortMethod::LastWritten - || params.sortMethod == ReleaseSortMethod::Date + || params.sortMethod == ReleaseSortMethod::DateAsc + || params.sortMethod == ReleaseSortMethod::DateDesc || params.sortMethod == ReleaseSortMethod::OriginalDate || params.sortMethod == ReleaseSortMethod::OriginalDateDesc || params.writtenAfter.isValid() @@ -189,8 +190,11 @@ namespace lms::db case ReleaseSortMethod::LastWritten: query.orderBy("t.file_last_write DESC"); break; - case ReleaseSortMethod::Date: - query.orderBy("COALESCE(t.date, CAST(t.year AS TEXT)), r.name COLLATE NOCASE"); + case ReleaseSortMethod::DateAsc: + query.orderBy("COALESCE(t.date, CAST(t.year AS TEXT)) ASC, r.name COLLATE NOCASE"); + break; + case ReleaseSortMethod::DateDesc: + query.orderBy("COALESCE(t.date, CAST(t.year AS TEXT)) DESC, r.name COLLATE NOCASE"); break; case ReleaseSortMethod::OriginalDate: query.orderBy("COALESCE(original_date, CAST(original_year AS TEXT), date, CAST(year AS TEXT)), r.name COLLATE NOCASE"); diff --git a/src/libs/database/include/database/Types.hpp b/src/libs/database/include/database/Types.hpp index a6c323c8..4c330313 100644 --- a/src/libs/database/include/database/Types.hpp +++ b/src/libs/database/include/database/Types.hpp @@ -129,7 +129,8 @@ namespace lms::db Id, Name, ArtistNameThenName, - Date, + DateAsc, + DateDesc, OriginalDate, OriginalDateDesc, Random, diff --git a/src/libs/database/test/Release.cpp b/src/libs/database/test/Release.cpp index c0b7cb48..eb17c6fb 100644 --- a/src/libs/database/test/Release.cpp +++ b/src/libs/database/test/Release.cpp @@ -849,12 +849,21 @@ namespace lms::db::tests { auto transaction{ session.createReadTransaction() }; - const auto releases{ Release::findIds(session, Release::FindParameters{}.setSortMethod(ReleaseSortMethod::Date)) }; + const auto releases{ Release::findIds(session, Release::FindParameters{}.setSortMethod(ReleaseSortMethod::DateAsc)) }; ASSERT_EQ(releases.results.size(), 2); EXPECT_EQ(releases.results.front(), release2.getId()); EXPECT_EQ(releases.results.back(), release1.getId()); } + { + auto transaction{ session.createReadTransaction() }; + + const auto releases{ Release::findIds(session, Release::FindParameters{}.setSortMethod(ReleaseSortMethod::DateDesc)) }; + ASSERT_EQ(releases.results.size(), 2); + EXPECT_EQ(releases.results.front(), release1.getId()); + EXPECT_EQ(releases.results.back(), release2.getId()); + } + { auto transaction{ session.createReadTransaction() }; diff --git a/src/libs/subsonic/impl/entrypoints/AlbumSongLists.cpp b/src/libs/subsonic/impl/entrypoints/AlbumSongLists.cpp index 00245248..59d6966c 100644 --- a/src/libs/subsonic/impl/entrypoints/AlbumSongLists.cpp +++ b/src/libs/subsonic/impl/entrypoints/AlbumSongLists.cpp @@ -104,9 +104,9 @@ namespace lms::api::subsonic const int toYear{ getMandatoryParameterAs(context.parameters, "toYear") }; Release::FindParameters params; - params.setSortMethod(ReleaseSortMethod::Date); + params.setSortMethod(fromYear > toYear ? ReleaseSortMethod::DateDesc : ReleaseSortMethod::DateAsc); params.setRange(range); - params.setDateRange(DateRange::fromYearRange(fromYear, toYear)); + params.setDateRange(DateRange::fromYearRange(std::min(fromYear, toYear), std::max(fromYear, toYear))); params.setMediaLibrary(mediaLibraryId); releases = Release::findIds(context.dbSession, params);