Updated ISimpleDataProvider interface to allow filtering albums by

category (e.g. artists).
This commit is contained in:
casey langen 2017-02-11 23:40:33 -08:00
parent 0f7ebff1bf
commit c506d69fde
5 changed files with 70 additions and 6 deletions

View File

@ -126,10 +126,16 @@ IMetadataValueList* LocalSimpleDataProvider::QueryCategory(const char* type, con
return nullptr;
}
IMetadataMapList* LocalSimpleDataProvider::QueryAlbums(const char* filter) {
IMetadataMapList* LocalSimpleDataProvider::QueryAlbums(
const char* categoryIdName,
unsigned long long categoryIdValue,
const char* filter)
{
try {
std::shared_ptr<AlbumListQuery> search(
new AlbumListQuery(std::string(filter ? filter : "")));
std::shared_ptr<AlbumListQuery> search(new AlbumListQuery(
std::string(categoryIdName ? categoryIdName : ""),
categoryIdValue,
std::string(filter ? filter : "")));
this->library->Enqueue(search, ILibrary::QuerySynchronous);
@ -142,4 +148,8 @@ IMetadataMapList* LocalSimpleDataProvider::QueryAlbums(const char* filter) {
}
return nullptr;
}
IMetadataMapList* LocalSimpleDataProvider::QueryAlbums(const char* filter) {
return this->QueryAlbums(nullptr, -1, filter);
}

View File

@ -67,6 +67,11 @@ namespace musik { namespace core { namespace db { namespace local {
virtual musik::core::sdk::IMetadataMapList*
QueryAlbums(const char* filter = "");
virtual musik::core::sdk::IMetadataMapList* QueryAlbums(
const char* categoryIdName,
unsigned long long categoryIdValue,
const char* filter = "");
private:
musik::core::ILibraryPtr library;
};

View File

@ -47,6 +47,13 @@ using namespace musik::core::db::local;
using namespace musik::core::library::constants;
using namespace musik::core::sdk;
static std::map<std::string, std::string> FIELD_TO_FOREIGN_KEY = {
std::make_pair(Track::ALBUM, Track::ALBUM_ID),
std::make_pair(Track::ARTIST, Track::ARTIST_ID),
std::make_pair(Track::GENRE, Track::GENRE_ID),
std::make_pair(Track::ALBUM_ARTIST, Track::ALBUM_ARTIST_ID)
};
#define RESET_RESULT(x) x.reset(new MetadataMapList())
static const std::string COLUMNS =
@ -63,7 +70,10 @@ static const std::string TABLES =
"albums, tracks, artists ";
static const std::string FILTER_PREDICATE =
"LOWER(album) like ? AND ";
" LOWER(album) like ? AND ";
static const std::string CATEGORY_PREDICATE =
" tracks.%s=? AND ";
static const std::string GENERAL_PREDICATE =
"albums.id = tracks.album_id AND "
@ -73,7 +83,18 @@ static const std::string ORDER =
"albums.name asc ";
AlbumListQuery::AlbumListQuery(const std::string& filter)
: filter(filter) {
: filter(filter)
, fieldIdValue(-1) {
RESET_RESULT(result);
}
AlbumListQuery::AlbumListQuery(
const std::string& fieldIdName,
unsigned long long fieldIdValue,
const std::string& filter)
: filter(filter)
, fieldIdValue(fieldIdValue) {
this->fieldIdName = FIELD_TO_FOREIGN_KEY[fieldIdName];
RESET_RESULT(result);
}
@ -93,19 +114,35 @@ bool AlbumListQuery::OnRun(Connection& db) {
RESET_RESULT(result);
bool filtered = this->filter.size() > 0;
bool category = fieldIdName.size() && fieldIdValue != -1;
std::string query = "SELECT DISTINCT " + COLUMNS + " FROM " + TABLES + " WHERE ";
query += filtered ? FILTER_PREDICATE : "";
if (category) {
query += boost::str(boost::format(CATEGORY_PREDICATE) % fieldIdName);
}
query += GENERAL_PREDICATE + " ORDER BY " + ORDER + ";";
Statement stmt(query.c_str(), db);
if (filtered) {
}
int bindIndex = 0;
if (filtered) {
/* transform "FilteR" => "%filter%" */
std::string wild = this->filter;
std::transform(wild.begin(), wild.end(), wild.begin(), tolower);
wild = "%" + wild + "%";
stmt.BindText(0, wild);
stmt.BindText(bindIndex++, wild);
}
if (category) {
stmt.BindInt(bindIndex, this->fieldIdValue);
}
while (stmt.Step() == Row) {

View File

@ -42,6 +42,11 @@ namespace musik { namespace core { namespace db { namespace local {
class AlbumListQuery : public musik::core::db::LocalQueryBase {
public:
AlbumListQuery(
const std::string& fieldIdName,
unsigned long long fieldIdValue,
const std::string& filter = "");
AlbumListQuery(
const std::string& filter = "");
@ -56,6 +61,8 @@ namespace musik { namespace core { namespace db { namespace local {
virtual bool OnRun(musik::core::db::Connection &db);
std::string filter;
std::string fieldIdName;
unsigned long long fieldIdValue;
musik::core::MetadataMapListPtr result;
};

View File

@ -59,6 +59,11 @@ namespace musik { namespace core { namespace sdk {
const char* filter = "") = 0;
virtual IMetadataMapList* QueryAlbums(const char* filter = "") = 0;
virtual IMetadataMapList* QueryAlbums(
const char* categoryIdName,
unsigned long long categoryIdValue,
const char* filter = "") = 0;
};
} } }