From 5fa7da1e4660ab64b6e62ed038c0d28746f519dc Mon Sep 17 00:00:00 2001 From: Iain Benson Date: Sat, 24 Nov 2018 09:54:31 +0000 Subject: [PATCH] Add folder into the query parser --- YACReaderLibrary/db/query_parser.cpp | 13 ++++++++++--- YACReaderLibrary/db/query_parser.h | 2 +- 2 files changed, 11 insertions(+), 4 deletions(-) diff --git a/YACReaderLibrary/db/query_parser.cpp b/YACReaderLibrary/db/query_parser.cpp index f5b1adee..e69c8b81 100644 --- a/YACReaderLibrary/db/query_parser.cpp +++ b/YACReaderLibrary/db/query_parser.cpp @@ -11,20 +11,27 @@ const std::map> QueryParser::fi {FieldType::text, {"title", "volume", "storyarc", "genere", "writer", "penciller", "inker", "colorist", "letterer", "coverartist", "publisher", "format", "agerating", "synopsis", "characters", "notes"}}, {FieldType::boolean, {"isbis", "color"}}, - {FieldType::date, {"date"} } }; + {FieldType::date, {"date"}}, + {FieldType::filename, {"filename"}}, + {FieldType::folder, {"folder"}} }; int QueryParser::TreeNode::buildSqlString(std::string& sqlString, int bindPosition) const { if (t == "token") { ++bindPosition; std::ostringstream oss; - if (children[0].t == "all") { + if (toLower(children[0].t) == "all") { oss << "("; for (const auto& field: fieldNames.at(FieldType::text)) { oss << "UPPER(ci." << field << ") LIKE UPPER(:bindPosition" << bindPosition << ") OR "; } - oss << "UPPER(c.fileName) LIKE UPPER(:bindPosition" << bindPosition << ")) "; + oss << "UPPER(c.filename) LIKE UPPER(:bindPosition" << bindPosition << ") OR "; + oss << "UPPER(f.name) LIKE UPPER(:bindPosition" << bindPosition << ")) "; } else if (isIn(fieldType(children[0].t), FieldType::numeric, FieldType::boolean)) { oss << "ci." << children[0].t << " = :bindPosition" << bindPosition << " "; + } else if (fieldType(children[0].t) == FieldType::filename) { + oss << "(UPPER(c." << children[0].t << ") LIKE UPPER(:bindPosition" << bindPosition << ")) "; + } else if (fieldType(children[0].t) == FieldType::folder) { + oss << "(UPPER(f.name) LIKE UPPER(:bindPosition" << bindPosition << ")) "; } else { oss << "(UPPER(ci." << children[0].t << ") LIKE UPPER(:bindPosition" << bindPosition << ")) "; } diff --git a/YACReaderLibrary/db/query_parser.h b/YACReaderLibrary/db/query_parser.h index 868d2b97..d77e1243 100644 --- a/YACReaderLibrary/db/query_parser.h +++ b/YACReaderLibrary/db/query_parser.h @@ -39,7 +39,7 @@ private: template static bool isIn(First &&first, T && ... t) {return ((first == t) || ...);} - enum class FieldType {unknown, numeric, text, boolean, date}; + enum class FieldType {unknown, numeric, text, boolean, date, folder, filename}; static FieldType fieldType(const std::string& str); void tokenize (const std::string& expr);