Order albums by original date, if available (fallback on date)

This commit is contained in:
emeric
2023-06-18 16:08:23 +02:00
parent 85709fa426
commit fe53b6469b
8 changed files with 106 additions and 27 deletions
+1 -1
View File
@@ -15,7 +15,7 @@
<h2>${name}</h2>
${<if-has-release-artists>}${artists}${</if-has-release-artists>}
${<if-has-various-release-artists>}<div class="text-secondary">${tr:Lms.Explore.various-artists}</div>${</if-has-various-release-artists>}
<div class="small text-muted">${<if-has-year>}${year}${<if-has-orig-year>} (${orig-year})${</if-has-orig-year>} · ${</if-has-year>}${duration}</div>
<div class="small text-muted">${<if-has-year>}${year} · ${</if-has-year>}${duration}</div>
${clusters class="mb-2"}
<div class="btn-group">
${play-btn class="btn btn-primary"}
+8 -2
View File
@@ -41,6 +41,9 @@ createQuery(Session& session, const Release::FindParameters& params)
auto query {session.getDboSession().query<ReleaseId>("SELECT DISTINCT r.id from release r")};
if (params.sortMethod == ReleaseSortMethod::LastWritten
|| params.sortMethod == ReleaseSortMethod::Date
|| params.sortMethod == ReleaseSortMethod::OriginalDate
|| params.sortMethod == ReleaseSortMethod::OriginalDateDesc
|| params.writtenAfter.isValid()
|| params.dateRange
|| params.artist.isValid())
@@ -160,8 +163,11 @@ createQuery(Session& session, const Release::FindParameters& params)
case ReleaseSortMethod::Date:
query.orderBy("t.date, r.name COLLATE NOCASE");
break;
case ReleaseSortMethod::DateDesc:
query.orderBy("t.date DESC, r.name COLLATE NOCASE");
case ReleaseSortMethod::OriginalDate:
query.orderBy("CASE WHEN t.original_date IS NULL THEN t.date ELSE t.original_date END, t.date, r.name COLLATE NOCASE");
break;
case ReleaseSortMethod::OriginalDateDesc:
query.orderBy("CASE WHEN t.original_date IS NULL THEN t.date ELSE t.original_date END DESC, t.date, r.name COLLATE NOCASE");
break;
case ReleaseSortMethod::StarredDateDesc:
assert(params.starringUser.isValid());
@@ -98,7 +98,8 @@ namespace Database
None,
Name,
Date,
DateDesc,
OriginalDate,
OriginalDateDesc,
Random,
LastWritten,
StarredDateDesc,
@@ -530,3 +530,73 @@ TEST_F(DatabaseFixture, Release_releaseType)
EXPECT_TRUE(release.get()->getSecondaryTypes().contains(ReleaseTypeSecondary::Compilation));
}
}
TEST_F(DatabaseFixture, ReleaseSortOrder)
{
ScopedRelease release1 {session, "MyRelease1"};
const Wt::WDate release1Date {Wt::WDate {2000, 2, 3}};
const Wt::WDate release1OriginalDate {Wt::WDate {1993, 4, 5}};
ScopedRelease release2 {session, "MyRelease2"};
const Wt::WDate release2Date {Wt::WDate {1994, 2, 3}};
ScopedTrack track1 {session, "MyTrack1"};
ScopedTrack track2 {session, "MyTrack2"};
ASSERT_LT(release2Date, release1Date);
ASSERT_GT(release2Date, release1OriginalDate);
{
auto transaction {session.createUniqueTransaction()};
track1.get().modify()->setRelease(release1.get());
track1.get().modify()->setOriginalDate(release1OriginalDate);
track1.get().modify()->setDate(release1Date);
track2.get().modify()->setRelease(release2.get());
track2.get().modify()->setDate(release2Date);
}
{
auto transaction {session.createSharedTransaction()};
const auto releases {Release::find(session, Release::FindParameters {}.setSortMethod(ReleaseSortMethod::Name) )};
ASSERT_EQ(releases.results.size(), 2);
EXPECT_EQ(releases.results.front(), release1.getId());
EXPECT_EQ(releases.results.back(), release2.getId());
}
{
auto transaction {session.createSharedTransaction()};
const auto releases {Release::find(session, Release::FindParameters {}.setSortMethod(ReleaseSortMethod::Random) )};
ASSERT_EQ(releases.results.size(), 2);
}
{
auto transaction {session.createSharedTransaction()};
const auto releases {Release::find(session, Release::FindParameters {}.setSortMethod(ReleaseSortMethod::Date) )};
ASSERT_EQ(releases.results.size(), 2);
EXPECT_EQ(releases.results.front(), release2.getId());
EXPECT_EQ(releases.results.back(), release1.getId());
}
{
auto transaction {session.createSharedTransaction()};
const auto releases {Release::find(session, Release::FindParameters {}.setSortMethod(ReleaseSortMethod::OriginalDate) )};
ASSERT_EQ(releases.results.size(), 2);
EXPECT_EQ(releases.results.front(), release1.getId());
EXPECT_EQ(releases.results.back(), release2.getId());
}
{
auto transaction {session.createSharedTransaction()};
const auto releases {Release::find(session, Release::FindParameters {}.setSortMethod(ReleaseSortMethod::OriginalDateDesc) )};
ASSERT_EQ(releases.results.size(), 2);
EXPECT_EQ(releases.results.front(), release2.getId());
EXPECT_EQ(releases.results.back(), release1.getId());
}
}
+2 -2
View File
@@ -212,7 +212,7 @@ Artist::refreshReleases()
Release::FindParameters params;
params.setClusters(_filters.getClusterIds());
params.setArtist(_artistId, {TrackArtistLinkType::ReleaseArtist}, {});
params.setSortMethod(ReleaseSortMethod::DateDesc);
params.setSortMethod(ReleaseSortMethod::OriginalDateDesc);
const auto releases {Release::find(LmsApp->getDbSession(), params)};
if (!releases.results.empty())
@@ -272,7 +272,7 @@ Artist::refreshAppearsOnReleases()
Release::FindParameters params;
params.setClusters(_filters.getClusterIds());
params.setArtist(_artistId, types, {TrackArtistLinkType::ReleaseArtist});
params.setSortMethod(ReleaseSortMethod::DateDesc);
params.setSortMethod(ReleaseSortMethod::OriginalDateDesc);
const auto releases {Release::find(LmsApp->getDbSession(), params)};
if (!releases.results.empty())
+19 -11
View File
@@ -66,19 +66,11 @@ namespace UserInterface::ReleaseListHelpers
if (showYear)
{
if (std::optional<int> year {release->getReleaseYear()})
Wt::WString year {ReleaseHelpers::buildReleaseYearString(release->getReleaseYear(), release->getReleaseYear(true))};
if (!year.empty())
{
entry->setCondition("if-has-year", true);
std::string strYear {std::to_string(*year)};
std::optional<int> originalYear {release->getReleaseYear(true)};
if (originalYear && *originalYear != *year)
{
strYear += " (" + std::to_string(*originalYear) + ")";
}
entry->bindString("year", strYear, Wt::TextFormat::Plain);
entry->bindString("year", year, Wt::TextFormat::Plain);
}
}
@@ -142,4 +134,20 @@ namespace UserInterface::ReleaseHelpers
return res;
}
Wt::WString buildReleaseYearString(std::optional<int> year, std::optional<int> originalYear)
{
Wt::WString res;
// Year can be here, but originalYear can't be here without year (enforced by scanner)
if (!year)
return res;
if (originalYear && *originalYear != *year)
res = std::to_string(*originalYear) + " (" + std::to_string(*year) + ")";
else
res = std::to_string(*year);
return res;
}
} // namespace UserInterface::ReleaseHelpers}
+1
View File
@@ -41,4 +41,5 @@ namespace UserInterface::ReleaseListHelpers
namespace UserInterface::ReleaseHelpers
{
Wt::WString buildReleaseTypeString(Database::ReleaseTypePrimary primaryType, EnumSet<Database::ReleaseTypeSecondary> secondaryTypes);
Wt::WString buildReleaseYearString(std::optional<int> year, std::optional<int> originalYear);
}
+3 -10
View File
@@ -246,18 +246,11 @@ Release::refreshView()
bindString("name", Wt::WString::fromUTF8(release->getName()), Wt::TextFormat::Plain);
std::optional<int> year {release->getReleaseYear()};
if (year)
Wt::WString year {ReleaseHelpers::buildReleaseYearString(release->getReleaseYear(), release->getReleaseYear(true))};
if (!year.empty())
{
setCondition("if-has-year", true);
bindInt("year", *year);
std::optional<int> originalYear {release->getReleaseYear(true)};
if (originalYear && *originalYear != *year)
{
setCondition("if-has-orig-year", true);
bindInt("orig-year", *originalYear);
}
bindString("year", year, Wt::TextFormat::Plain);
}
bindString("duration", Utils::durationToString(release->getDuration()), Wt::TextFormat::Plain);