A bit more refactoring -- but I think this is gonna get merged together

with some subsequent work. I think I have working queries now.
This commit is contained in:
casey langen 2018-01-02 22:25:47 -08:00
parent 14442d8a0b
commit 912bf13ef3
3 changed files with 59 additions and 53 deletions

View File

@ -370,11 +370,12 @@ IValueList* LocalSimpleDataProvider::QueryCategoryWithPredicate(
const char* type, const char* predicateType, int64_t predicateId, const char* filter)
{
try {
std::string field = predicateType ? predicateType : "";
std::shared_ptr<CategoryListQuery> search(
new CategoryListQuery(
type,
predicateType ? predicateType : "",
predicateId,
{ field, predicateId },
std::string(filter ? filter : "")));
this->library->Enqueue(search, ILibrary::QuerySynchronous);

View File

@ -66,7 +66,7 @@ static const std::string EXTENDED_QUERY_PREDICATE_TABLES =
", track_meta tm, meta_keys mk, meta_values mv ";
static const std::string EXTENDED_QUERY_PREDICATE =
" AND t.id=tm.track_id "
" AND tracks.id=tm.track_id "
" AND tm.meta_value_id=mv.id "
" AND mv.meta_key_id=mk.id "
" AND mk.id=? "
@ -98,36 +98,36 @@ static const std::string FILTERED_PROPERTY_QUERY =
"WHERE {{table}}.id = tracks.{{id_column}} AND LOWER({{table}}.name) LIKE ? AND tracks.visible = 1 {{predicate}} "
"ORDER BY {{table}}.sort_order;";
static const std::string UNFILTERED_EXTENDED_PROPERTY_QUERY =
"SELECT DISTINCT meta_values.* "
"FROM meta_values, track_meta, tracks "
"WHERE "
" meta_values.id = track_meta.meta_value_id AND "
" track_meta.track_id = tracks.id AND "
" tracks.visible = 1 AND "
" meta_values.meta_key_id IN( "
" SELECT DISTINCT meta_keys.id "
" FROM meta_keys "
" WHERE LOWER(meta_keys.name) = LOWER(?) "
" ) "
"{{predicate}} "
"ORDER BY meta_values.content ASC";
static const std::string FILTERED_EXTENDED_PROPERTY_QUERY =
"SELECT DISTINCT meta_values.* "
"FROM meta_values, track_meta, tracks "
"WHERE "
" meta_values.id = track_meta.meta_value_id AND "
" track_meta.track_id = tracks.id AND "
" tracks.visible = 1 AND "
" meta_values.meta_key_id IN( "
" SELECT DISTINCT meta_keys.id "
" FROM meta_keys "
" WHERE LOWER(meta_keys.name) = LOWER(?) "
" ) "
"AND LOWER(meta_values.content) LIKE LOWER(?) "
"{{predicate}} "
"ORDER BY meta_values.content ASC";
//static const std::string UNFILTERED_EXTENDED_PROPERTY_QUERY =
// "SELECT DISTINCT meta_values.* "
// "FROM meta_values, track_meta, tracks "
// "WHERE "
// " meta_values.id = track_meta.meta_value_id AND "
// " track_meta.track_id = tracks.id AND "
// " tracks.visible = 1 AND "
// " meta_values.meta_key_id IN( "
// " SELECT DISTINCT meta_keys.id "
// " FROM meta_keys "
// " WHERE LOWER(meta_keys.name) = LOWER(?) "
// " ) "
// "{{predicate}} "
// "ORDER BY meta_values.content ASC";
//
//static const std::string FILTERED_EXTENDED_PROPERTY_QUERY =
// "SELECT DISTINCT meta_values.* "
// "FROM meta_values, track_meta, tracks "
// "WHERE "
// " meta_values.id = track_meta.meta_value_id AND "
// " track_meta.track_id = tracks.id AND "
// " tracks.visible = 1 AND "
// " meta_values.meta_key_id IN( "
// " SELECT DISTINCT meta_keys.id "
// " FROM meta_keys "
// " WHERE LOWER(meta_keys.name) = LOWER(?) "
// " ) "
// "AND LOWER(meta_values.content) LIKE LOWER(?) "
// "{{predicate}} "
// "ORDER BY meta_values.content ASC";
static const std::string UNFILTERED_PLAYLISTS_QUERY =
"SELECT DISTINCT id, name "
@ -173,17 +173,15 @@ static void replaceAll(std::string& input, const std::string& find, const std::s
CategoryListQuery::CategoryListQuery(
const std::string& trackField, const std::string& filter)
: CategoryListQuery(trackField, "", -1LL, filter) {
: CategoryListQuery(trackField, { "", -1LL }, filter) {
}
CategoryListQuery::CategoryListQuery(
const std::string& trackField,
const std::string& predicateField,
int64_t predicateFieldId,
const Predicate predicate,
const std::string& filter)
: trackField(trackField)
, predicateField(predicateField)
, predicateFieldId(predicateFieldId)
, predicate(predicate)
, filter(filter) {
RESET_RESULT(result);
@ -231,9 +229,9 @@ void CategoryListQuery::QueryRegular(musik::core::db::Connection &db) {
bool filtered = this->filter.size() > 0;
bool predicated =
predicateField.size() &&
predicateField != Playlists::TABLE_NAME &&
predicateFieldId > 0;
predicate.first.size() &&
predicate.first != Playlists::TABLE_NAME &&
predicate.second > 0;
std::string query;
@ -249,27 +247,27 @@ void CategoryListQuery::QueryRegular(musik::core::db::Connection &db) {
int64_t extendedKeyId = 0;
std::string predicateTables = "";
std::string predicate = "";
std::string predicateStatement = "";
if (predicated) {
auto end = PREDICATE_TO_COLUMN_MAP.end();
if (PREDICATE_TO_COLUMN_MAP.find(predicateField) != end) {
if (PREDICATE_TO_COLUMN_MAP.find(predicate.first) != end) {
/* regular/simple/optimized predicate... */
predicate = boost::str(boost::format(
REGULAR_QUERY_PREDICATE) % PREDICATE_TO_COLUMN_MAP[predicateField]);
predicateStatement = boost::str(boost::format(
REGULAR_QUERY_PREDICATE) % PREDICATE_TO_COLUMN_MAP[predicate.first]);
predicateTables = REGULAR_QUERY_PREDICATE_TABLES;
}
else {
/* extended metadata predicate. gotta do more work. whee... */
Statement keyQuery("SELECT DISTINCT id FROM meta_keys WHERE LOWER(name)=LOWER(?)", db);
keyQuery.BindText(0, this->trackField);
keyQuery.BindText(0, this->predicate.first);
if (keyQuery.Step() == db::Row) {
extendedKeyId = keyQuery.ColumnInt64(0);
}
if (extendedKeyId > 0) {
predicate = EXTENDED_QUERY_PREDICATE;
predicateStatement = EXTENDED_QUERY_PREDICATE;
predicateTables = EXTENDED_QUERY_PREDICATE_TABLES;
}
else {
@ -278,7 +276,7 @@ void CategoryListQuery::QueryRegular(musik::core::db::Connection &db) {
}
}
replaceAll(query, "{{predicate}}", predicate);
replaceAll(query, "{{predicate}}", predicateStatement);
replaceAll(query, "{{extended_tables}}", predicateTables);
int bindIndex = 0;
@ -289,7 +287,13 @@ void CategoryListQuery::QueryRegular(musik::core::db::Connection &db) {
}
if (predicated) {
stmt.BindInt64(bindIndex++, predicateFieldId);
if (extendedKeyId > 0) {
stmt.BindInt64(bindIndex++, extendedKeyId);
stmt.BindInt64(bindIndex++, predicate.second);
}
else {
stmt.BindInt64(bindIndex++, predicate.second);
}
}
this->ProcessResult(stmt);

View File

@ -72,6 +72,9 @@ namespace musik { namespace core { namespace db { namespace local {
int64_t id;
};
using Predicate = std::pair<std::string, int64_t>;
using PredicateList = std::vector<Predicate>;
typedef std::shared_ptr<std::vector<
std::shared_ptr<Result> > > ResultList;
@ -81,8 +84,7 @@ namespace musik { namespace core { namespace db { namespace local {
CategoryListQuery(
const std::string& trackField,
const std::string& predicateField,
const int64_t predicateFieldId,
const Predicate predicate,
const std::string& filter = "");
virtual ~CategoryListQuery();
@ -106,9 +108,8 @@ namespace musik { namespace core { namespace db { namespace local {
std::string trackField;
std::string filter;
std::string predicateField;
Type type;
int64_t predicateFieldId;
Predicate predicate;
ResultList result;
};