diff --git a/src/core/library/LocalSimpleDataProvider.cpp b/src/core/library/LocalSimpleDataProvider.cpp index d9ca78802..20945e518 100644 --- a/src/core/library/LocalSimpleDataProvider.cpp +++ b/src/core/library/LocalSimpleDataProvider.cpp @@ -81,11 +81,15 @@ ITrackList* LocalSimpleDataProvider::QueryTracks(const char* query, int limit, i } ITrackList* LocalSimpleDataProvider::QueryTracksByCategory( - const char* categoryType, unsigned long long selectedId, int limit, int offset) + const char* categoryType, + unsigned long long selectedId, + const char* filter, + int limit, + int offset) { try { std::shared_ptr search( - new CategoryTrackListQuery(this->library, categoryType, selectedId)); + new CategoryTrackListQuery(this->library, categoryType, selectedId, filter)); if (limit >= 0) { search->SetLimitAndOffset(limit, offset); diff --git a/src/core/library/LocalSimpleDataProvider.h b/src/core/library/LocalSimpleDataProvider.h index eac852eee..edf8ae925 100644 --- a/src/core/library/LocalSimpleDataProvider.h +++ b/src/core/library/LocalSimpleDataProvider.h @@ -55,6 +55,7 @@ namespace musik { namespace core { namespace db { namespace local { QueryTracksByCategory( const char* categoryType, unsigned long long selectedId, + const char* filter = "", int limit = -1, int offset = 0); diff --git a/src/core/library/query/local/CategoryTrackListQuery.cpp b/src/core/library/query/local/CategoryTrackListQuery.cpp index 6d5d2372c..b03a6210e 100755 --- a/src/core/library/query/local/CategoryTrackListQuery.cpp +++ b/src/core/library/query/local/CategoryTrackListQuery.cpp @@ -39,6 +39,9 @@ #include #include +#include +#include + #include using musik::core::db::Statement; @@ -50,6 +53,7 @@ using musik::core::ILibraryPtr; using namespace musik::core::db; using namespace musik::core::db::local; using namespace musik::core::library::constants; +using namespace boost::algorithm; static std::map FIELD_TO_FOREIGN_KEY = { @@ -59,13 +63,22 @@ static std::map FIELD_TO_FOREIGN_KEY = std::make_pair(Track::ALBUM_ARTIST, Track::ALBUM_ARTIST_ID) }; -CategoryTrackListQuery::CategoryTrackListQuery(ILibraryPtr library, const std::string& column, DBID id) { +CategoryTrackListQuery::CategoryTrackListQuery( + ILibraryPtr library, + const std::string& column, + DBID id, + const std::string& filter) +{ this->library = library; this->id = id; this->result.reset(new musik::core::TrackList(library)); this->headers.reset(new std::set()); this->hash = 0; + if (filter.size()) { + this->filter = "%" + trim_copy(to_lower_copy(filter)) + "%"; + } + if (FIELD_TO_FOREIGN_KEY.find(column) == FIELD_TO_FOREIGN_KEY.end()) { throw std::runtime_error("invalid input column specified"); } @@ -105,14 +118,31 @@ bool CategoryTrackListQuery::OnRun(Connection& db) { std::string lastAlbum; size_t index = 0; - std::string query = boost::str(boost::format( - "SELECT DISTINCT t.id, al.name " \ - "FROM tracks t, albums al, artists ar, genres gn " \ - "WHERE t.%s=? AND t.album_id=al.id AND t.visual_genre_id=gn.id AND t.visual_artist_id=ar.id " - "ORDER BY al.name, disc, track, ar.name %s") % this->column % this->GetLimitAndOffset()); + std::string query = + "SELECT DISTINCT t.id, al.name " + "FROM tracks t, albums al, artists ar, genres gn " + "WHERE t.%s=? AND t.album_id=al.id AND t.visual_genre_id=gn.id AND t.visual_artist_id=ar.id "; + + if (this->filter.size()) { + query += " AND (t.title LIKE ? OR al.name LIKE ? OR ar.name LIKE ? OR gn.name LIKE ?) "; + } + + query += "ORDER BY al.name, disc, track, ar.name %s"; + + query = boost::str(boost::format(query) % this->column % this->GetLimitAndOffset()); Statement trackQuery(query.c_str(), db); - trackQuery.BindInt(0, this->id); + + if (this->filter.size()) { + trackQuery.BindInt(0, this->id); + trackQuery.BindText(1, this->filter); + trackQuery.BindText(2, this->filter); + trackQuery.BindText(3, this->filter); + trackQuery.BindText(4, this->filter); + } + else { + trackQuery.BindInt(0, this->id); + } while (trackQuery.Step() == Row) { DBID id = trackQuery.ColumnInt64(0); diff --git a/src/core/library/query/local/CategoryTrackListQuery.h b/src/core/library/query/local/CategoryTrackListQuery.h index 0d5b48c68..7d0681f7c 100755 --- a/src/core/library/query/local/CategoryTrackListQuery.h +++ b/src/core/library/query/local/CategoryTrackListQuery.h @@ -47,7 +47,8 @@ namespace musik { namespace core { namespace db { namespace local { CategoryTrackListQuery( musik::core::ILibraryPtr library, const std::string& column, - DBID id); + DBID id, + const std::string& filter = ""); virtual ~CategoryTrackListQuery(); @@ -67,6 +68,7 @@ namespace musik { namespace core { namespace db { namespace local { std::string column; DBID id; size_t hash; + std::string filter; }; } } } } diff --git a/src/core/sdk/ISimpleDataProvider.h b/src/core/sdk/ISimpleDataProvider.h index f3cfa1f23..d32708836 100644 --- a/src/core/sdk/ISimpleDataProvider.h +++ b/src/core/sdk/ISimpleDataProvider.h @@ -50,6 +50,7 @@ namespace musik { namespace core { namespace sdk { virtual ITrackList* QueryTracksByCategory( const char* categoryType, unsigned long long selectedId, + const char* filter = "", int limit = -1, int offset = 0) = 0;