Added a way to filter by release type
This commit is contained in:
@@ -51,7 +51,8 @@ namespace lms::db
|
||||
|| params.release.isValid()
|
||||
|| params.filters.clusters.size() == 1
|
||||
|| params.filters.mediaLibrary.isValid()
|
||||
|| params.filters.label.isValid())
|
||||
|| params.filters.label.isValid()
|
||||
|| params.filters.releaseType.isValid())
|
||||
{
|
||||
query.join("track_artist_link t_a_l ON t_a_l.artist_id = a.id");
|
||||
}
|
||||
@@ -61,7 +62,8 @@ namespace lms::db
|
||||
|| params.writtenAfter.isValid()
|
||||
|| params.release.isValid()
|
||||
|| params.filters.mediaLibrary.isValid()
|
||||
|| params.filters.label.isValid())
|
||||
|| params.filters.label.isValid()
|
||||
|| params.filters.releaseType.isValid())
|
||||
{
|
||||
query.join("track t ON t.id = t_a_l.track_id");
|
||||
|
||||
@@ -79,6 +81,12 @@ namespace lms::db
|
||||
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.filters.releaseType.isValid())
|
||||
{
|
||||
query.join("release_release_type r_r_t ON r_r_t.release_id = t.release_id");
|
||||
query.where("r_r_t.release_type_id = ?").bind(params.filters.releaseType);
|
||||
}
|
||||
}
|
||||
|
||||
if (params.linkType)
|
||||
|
||||
@@ -42,18 +42,26 @@ namespace lms::db
|
||||
|
||||
assert(!params.artist.isValid()); // poor check
|
||||
|
||||
if (params.filters.mediaLibrary.isValid() || params.filters.label.isValid())
|
||||
if (params.filters.mediaLibrary.isValid()
|
||||
|| params.filters.label.isValid()
|
||||
|| params.filters.releaseType.isValid())
|
||||
{
|
||||
query.join("track t ON t.id = t_a_l.track_id");
|
||||
}
|
||||
|
||||
if (params.filters.mediaLibrary.isValid())
|
||||
query.where("t.media_library_id = ?").bind(params.filters.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 t.release_id = r_l.release_id");
|
||||
query.where("r_l.label_id = ?").bind(params.filters.label);
|
||||
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.filters.releaseType.isValid())
|
||||
{
|
||||
query.join("release_release_type r_r_t ON r_r_t.release_id = t.release_id");
|
||||
query.where("r_r_t.release_type_id = ?").bind(params.filters.releaseType);
|
||||
}
|
||||
}
|
||||
|
||||
if (params.linkType)
|
||||
@@ -127,6 +135,12 @@ namespace lms::db
|
||||
query.where("r_l.label_id = ?").bind(params.filters.label);
|
||||
}
|
||||
|
||||
if (params.filters.releaseType.isValid())
|
||||
{
|
||||
query.join("release_release_type r_r_t ON r_r_t.release_id = r.id");
|
||||
query.where("r_r_t.release_type_id = ?").bind(params.filters.releaseType);
|
||||
}
|
||||
|
||||
if (!params.filters.clusters.empty())
|
||||
{
|
||||
std::ostringstream oss;
|
||||
@@ -180,6 +194,12 @@ namespace lms::db
|
||||
query.where("r_l.label_id = ?").bind(params.filters.label);
|
||||
}
|
||||
|
||||
if (params.filters.releaseType.isValid())
|
||||
{
|
||||
query.join("release_release_type r_r_t ON r_r_t.release_id = t.release_id");
|
||||
query.where("r_r_t.release_type_id = ?").bind(params.filters.releaseType);
|
||||
}
|
||||
|
||||
if (!params.filters.clusters.empty())
|
||||
{
|
||||
std::ostringstream oss;
|
||||
|
||||
@@ -83,6 +83,12 @@ namespace lms::db
|
||||
query.where("r_l.label_id = ?").bind(params.filters.label);
|
||||
}
|
||||
|
||||
if (params.filters.releaseType.isValid())
|
||||
{
|
||||
query.join("release_release_type r_r_t ON r_r_t.release_id = r.id");
|
||||
query.where("r_r_t.release_type_id = ?").bind(params.filters.releaseType);
|
||||
}
|
||||
|
||||
if (params.directory.isValid())
|
||||
query.where("t.directory_id = ?").bind(params.directory);
|
||||
|
||||
@@ -401,6 +407,24 @@ namespace lms::db
|
||||
return utils::fetchQuerySingleResult(session.getDboSession()->query<Wt::Dbo::ptr<ReleaseType>>("SELECT r_t from release_type r_t").where("r_t.name = ?").bind(name));
|
||||
}
|
||||
|
||||
void ReleaseType::find(Session& session, ReleaseTypeSortMethod sortMethod, std::function<void(const ReleaseType::pointer& releaseType)> func)
|
||||
{
|
||||
session.checkReadTransaction();
|
||||
|
||||
auto query{ session.getDboSession()->find<ReleaseType>() };
|
||||
switch (sortMethod)
|
||||
{
|
||||
case ReleaseTypeSortMethod::None:
|
||||
break;
|
||||
case ReleaseTypeSortMethod::Name:
|
||||
query.orderBy("name COLLATE NOCASE");
|
||||
}
|
||||
|
||||
utils::forEachQueryResult(query, [&](const ReleaseType::pointer& releaseType) {
|
||||
func(releaseType);
|
||||
});
|
||||
}
|
||||
|
||||
RangeResults<ReleaseTypeId> ReleaseType::findOrphanIds(Session& session, std::optional<Range> range)
|
||||
{
|
||||
session.checkReadTransaction();
|
||||
|
||||
@@ -238,7 +238,9 @@ namespace lms::db
|
||||
utils::executeCommand(_session, "CREATE INDEX IF NOT EXISTS release_mbid_idx ON release(mbid)");
|
||||
utils::executeCommand(_session, "CREATE INDEX IF NOT EXISTS release_name_idx ON release(name)");
|
||||
utils::executeCommand(_session, "CREATE INDEX IF NOT EXISTS release_name_nocase_idx ON release(name COLLATE NOCASE)");
|
||||
utils::executeCommand(_session, "CREATE INDEX IF NOT EXISTS release_type_name_idx ON release_type(name)");
|
||||
|
||||
utils::executeCommand(_session, "CREATE INDEX IF NOT EXISTS release_type_id_idx ON release_type(id)");
|
||||
utils::executeCommand(_session, "CREATE INDEX IF NOT EXISTS release_type_name_idx ON release_type(name COLLATE NOCASE)");
|
||||
|
||||
utils::executeCommand(_session, "CREATE INDEX IF NOT EXISTS track_id_idx ON track(id)");
|
||||
utils::executeCommand(_session, "CREATE INDEX IF NOT EXISTS track_absolute_path_idx ON track(absolute_file_path)");
|
||||
|
||||
@@ -168,6 +168,12 @@ namespace lms::db
|
||||
query.where("r_l.label_id = ?").bind(params.filters.label);
|
||||
}
|
||||
|
||||
if (params.filters.releaseType.isValid())
|
||||
{
|
||||
query.join("release_release_type r_r_t ON r_r_t.release_id = t.release_id");
|
||||
query.where("r_r_t.release_type_id = ?").bind(params.filters.releaseType);
|
||||
}
|
||||
|
||||
if (params.directory.isValid())
|
||||
query.where("t.directory_id = ?").bind(params.directory);
|
||||
|
||||
|
||||
@@ -54,7 +54,8 @@ namespace lms::db
|
||||
query.where("t_l.name LIKE ? ESCAPE '" ESCAPE_CHAR_STR "'").bind("%" + utils::escapeLikeKeyword(keyword) + "%");
|
||||
|
||||
if (params.filters.mediaLibrary.isValid()
|
||||
|| params.filters.label.isValid())
|
||||
|| params.filters.label.isValid()
|
||||
|| params.filters.releaseType.isValid())
|
||||
{
|
||||
query.join("track t ON t.id = t_l_e.track_id");
|
||||
|
||||
@@ -66,6 +67,12 @@ namespace lms::db
|
||||
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.filters.releaseType.isValid())
|
||||
{
|
||||
query.join("release_release_type r_r_t ON r_r_t.release_id = t.release_id");
|
||||
query.where("r_r_t.release_type_id = ?").bind(params.filters.releaseType);
|
||||
}
|
||||
}
|
||||
|
||||
if (params.user.isValid())
|
||||
|
||||
@@ -24,6 +24,7 @@
|
||||
#include "database/ClusterId.hpp"
|
||||
#include "database/LabelId.hpp"
|
||||
#include "database/MediaLibraryId.hpp"
|
||||
#include "database/ReleaseTypeId.hpp"
|
||||
|
||||
namespace lms::db
|
||||
{
|
||||
@@ -32,6 +33,7 @@ namespace lms::db
|
||||
MediaLibraryId mediaLibrary; // tracks that belongs to this library
|
||||
std::vector<ClusterId> clusters; // tracks that belong to all these clusters
|
||||
LabelId label; // tracks which release has this label
|
||||
ReleaseTypeId releaseType; // tracks which release has this type
|
||||
|
||||
Filters& setClusters(std::span<const ClusterId> _clusters)
|
||||
{
|
||||
@@ -48,5 +50,10 @@ namespace lms::db
|
||||
label = _label;
|
||||
return *this;
|
||||
}
|
||||
Filters& setReleaseType(ReleaseTypeId _releaseType)
|
||||
{
|
||||
releaseType = _releaseType;
|
||||
return *this;
|
||||
}
|
||||
};
|
||||
} // namespace lms::db
|
||||
@@ -124,6 +124,7 @@ namespace lms::db
|
||||
static std::size_t getCount(Session& session);
|
||||
static pointer find(Session& session, ReleaseTypeId id);
|
||||
static pointer find(Session& session, std::string_view name);
|
||||
static void find(Session& session, ReleaseTypeSortMethod sortMethod, std::function<void(const ReleaseType::pointer& releaseType)> func);
|
||||
static RangeResults<ReleaseTypeId> findOrphanIds(Session& session, std::optional<Range> range = std::nullopt);
|
||||
|
||||
// Accessors
|
||||
|
||||
@@ -158,6 +158,12 @@ namespace lms::db
|
||||
StarredDateDesc,
|
||||
};
|
||||
|
||||
enum class ReleaseTypeSortMethod
|
||||
{
|
||||
None,
|
||||
Name,
|
||||
};
|
||||
|
||||
enum class TrackListSortMethod
|
||||
{
|
||||
None,
|
||||
|
||||
Reference in New Issue
Block a user