diff --git a/YACReaderLibrary/YACReaderLibrary.pro b/YACReaderLibrary/YACReaderLibrary.pro index 63c2bdc8..70e558f8 100644 --- a/YACReaderLibrary/YACReaderLibrary.pro +++ b/YACReaderLibrary/YACReaderLibrary.pro @@ -83,6 +83,7 @@ HEADERS += comic_flow.h \ db/comic_query_result_processor.h \ db/folder_query_result_processor.h \ db/query_lexer.h \ + db/search_query.h \ folder_content_view.h \ initial_comic_info_extractor.h \ library_comic_opener.h \ @@ -166,6 +167,7 @@ SOURCES += comic_flow.cpp \ db/comic_query_result_processor.cpp \ db/folder_query_result_processor.cpp \ db/query_lexer.cpp \ + db/search_query.cpp \ folder_content_view.cpp \ initial_comic_info_extractor.cpp \ library_comic_opener.cpp \ diff --git a/YACReaderLibrary/db/comic_query_result_processor.cpp b/YACReaderLibrary/db/comic_query_result_processor.cpp index 2e075004..e1cf5e52 100644 --- a/YACReaderLibrary/db/comic_query_result_processor.cpp +++ b/YACReaderLibrary/db/comic_query_result_processor.cpp @@ -4,10 +4,7 @@ #include "comic_model.h" #include "data_base_management.h" #include "qnaturalsorting.h" -#include "db_helper.h" -#include "query_parser.h" - -#include "QsLog.h" +#include "search_query.h" YACReader::ComicQueryResultProcessor::ComicQueryResultProcessor() : querySearchQueue(1) @@ -22,25 +19,10 @@ void YACReader::ComicQueryResultProcessor::createModelData(const QString &filter QString connectionName = ""; { QSqlDatabase db = DataBaseManagement::loadDatabase(databasePath); - QSqlQuery selectQuery(db); - - std::string queryString("SELECT ci.number,ci.title,c.fileName,ci.numPages,c.id,c.parentId,c.path,ci.hash,ci.read,ci.isBis,ci.currentPage,ci.rating,ci.hasBeenOpened " - "FROM comic c INNER JOIN comic_info ci ON (c.comicInfoId = ci.id) LEFT JOIN folder f ON (f.id == c.parentId) WHERE "); - try { - QueryParser parser; - auto result = parser.parse(filter.toStdString()); - result.buildSqlString(queryString); + auto query = comicsSearchQuery(db, filter); - queryString += " LIMIT :limit"; - - selectQuery.prepare(queryString.c_str()); - selectQuery.bindValue(":limit", 500); // TODO, load this value from settings - result.bindValues(selectQuery); - - selectQuery.exec(); - - auto data = modelData(selectQuery); + auto data = modelData(query); emit newData(data, databasePath); } catch (const std::exception &e) { diff --git a/YACReaderLibrary/db/folder_query_result_processor.cpp b/YACReaderLibrary/db/folder_query_result_processor.cpp index 7670e9d3..41774eb2 100644 --- a/YACReaderLibrary/db/folder_query_result_processor.cpp +++ b/YACReaderLibrary/db/folder_query_result_processor.cpp @@ -1,13 +1,9 @@ #include "folder_query_result_processor.h" #include "folder_item.h" -#include "qnaturalsorting.h" -#include "yacreader_global_gui.h" -#include "query_parser.h" #include "folder_model.h" #include "data_base_management.h" - -#include "QsLog.h" +#include "search_query.h" #include #include @@ -20,7 +16,7 @@ YACReader::FolderQueryResultProcessor::FolderQueryResultProcessor(FolderModel *m { } -void YACReader::FolderQueryResultProcessor::createModelData(const QString &filter, bool includeComics) +void YACReader::FolderQueryResultProcessor::createModelData(const QString &filter) { querySearchQueue.cancelPending(); @@ -28,33 +24,13 @@ void YACReader::FolderQueryResultProcessor::createModelData(const QString &filte QString connectionName = ""; { QSqlDatabase db = DataBaseManagement::loadDatabase(model->getDatabase()); + try { + auto query = foldersSearchQuery(db, filter); - QSqlQuery selectQuery(db); // TODO check - if (!includeComics) { - selectQuery.prepare("select * from folder where id <> 1 and upper(name) like upper(:filter) order by parentId,name "); - selectQuery.bindValue(":filter", "%%" + filter + "%%"); - } else { - std::string queryString("SELECT DISTINCT f.id, f.parentId, f.name, f.path, f.finished, f.completed " - "FROM folder f LEFT JOIN comic c ON (f.id = c.parentId) " - "INNER JOIN comic_info ci ON (c.comicInfoId = ci.id) WHERE "); - - try { - QueryParser parser; - auto result = parser.parse(filter.toStdString()); - result.buildSqlString(queryString); - - queryString += " AND f.id <> 1 ORDER BY f.parentId,f.name"; - - selectQuery.prepare(queryString.c_str()); - result.bindValues(selectQuery); - - selectQuery.exec(); - - setupFilteredModelData(selectQuery); - } catch (const std::exception &e) { - // Do nothing, uncomplete search string will end here and it is part of how the QueryParser works - // I don't like the idea of using exceptions for this though - } + setupFilteredModelData(query); + } catch (const std::exception &e) { + // Do nothing, uncomplete search string will end here and it is part of how the QueryParser works + // I don't like the idea of using exceptions for this though } connectionName = db.connectionName(); diff --git a/YACReaderLibrary/db/folder_query_result_processor.h b/YACReaderLibrary/db/folder_query_result_processor.h index c375100d..92d5aa34 100644 --- a/YACReaderLibrary/db/folder_query_result_processor.h +++ b/YACReaderLibrary/db/folder_query_result_processor.h @@ -19,7 +19,7 @@ public: FolderQueryResultProcessor(FolderModel *model); public slots: - void createModelData(const QString &filter, bool includeComics); + void createModelData(const QString &filter); signals: void newData(QMap *filteredItems, FolderItem *root); diff --git a/YACReaderLibrary/db/query_parser.h b/YACReaderLibrary/db/query_parser.h index 4b8f0c4e..69a5a315 100644 --- a/YACReaderLibrary/db/query_parser.h +++ b/YACReaderLibrary/db/query_parser.h @@ -9,6 +9,9 @@ #include #include +#define SEARCH_FOLDERS_QUERY "SELECT DISTINCT f.id, f.parentId, f.name, f.path, f.finished, f.completed, f.numChildren, f.firstChildHash FROM folder f LEFT JOIN comic c ON (f.id = c.parentId) INNER JOIN comic_info ci ON (c.comicInfoId = ci.id) WHERE " +#define SEARCH_COMICS_QUERY "SELECT ci.number,ci.title,c.fileName,ci.numPages,c.id,c.parentId,c.path,ci.hash,ci.read,ci.isBis,ci.currentPage,ci.rating,ci.hasBeenOpened,ci.coverSizeRatio,ci.lastTimeOpened,ci.manga FROM comic c INNER JOIN comic_info ci ON (c.comicInfoId = ci.id) LEFT JOIN folder f ON (f.id == c.parentId) WHERE " + /** * This class is used to generate an SQL query string from a search expression, * with a syntax very similar to that used by the Google search engine. diff --git a/YACReaderLibrary/db/search_query.cpp b/YACReaderLibrary/db/search_query.cpp new file mode 100644 index 00000000..bd1d6cd3 --- /dev/null +++ b/YACReaderLibrary/db/search_query.cpp @@ -0,0 +1,43 @@ + +#include "search_query.h" +#include "query_parser.h" + +#include +#include + +QSqlQuery foldersSearchQuery(QSqlDatabase &db, const QString &filter) +{ + QueryParser parser; + auto result = parser.parse(filter.toStdString()); + + std::string queryString(SEARCH_FOLDERS_QUERY); + result.buildSqlString(queryString); + queryString += " AND f.id <> 1 ORDER BY f.parentId,f.name"; + + QSqlQuery selectQuery(db); + selectQuery.prepare(queryString.c_str()); + result.bindValues(selectQuery); + + selectQuery.exec(); + + return selectQuery; +} + +QSqlQuery comicsSearchQuery(QSqlDatabase &db, const QString &filter) +{ + QueryParser parser; + auto result = parser.parse(filter.toStdString()); + + std::string queryString(SEARCH_COMICS_QUERY); + result.buildSqlString(queryString); + queryString += " LIMIT :limit"; + + QSqlQuery selectQuery(db); + selectQuery.prepare(queryString.c_str()); + selectQuery.bindValue(":limit", 500); // TODO, load this value from settings + result.bindValues(selectQuery); + + selectQuery.exec(); + + return selectQuery; +} diff --git a/YACReaderLibrary/db/search_query.h b/YACReaderLibrary/db/search_query.h new file mode 100644 index 00000000..208100a5 --- /dev/null +++ b/YACReaderLibrary/db/search_query.h @@ -0,0 +1,10 @@ + +#ifndef SEARCHQUERY_H +#define SEARCHQUERY_H + +#include + +QSqlQuery foldersSearchQuery(QSqlDatabase &db, const QString &filter); +QSqlQuery comicsSearchQuery(QSqlDatabase &db, const QString &filter); + +#endif // SEARCHQUERY_H diff --git a/YACReaderLibrary/library_window.cpp b/YACReaderLibrary/library_window.cpp index 0ac891e6..608cd88e 100644 --- a/YACReaderLibrary/library_window.cpp +++ b/YACReaderLibrary/library_window.cpp @@ -2415,7 +2415,7 @@ void LibraryWindow::toNormal() void LibraryWindow::setSearchFilter(QString filter) { if (!filter.isEmpty()) { - folderQueryResultProcessor->createModelData(filter, true); + folderQueryResultProcessor->createModelData(filter); comicQueryResultProcessor.createModelData(filter, foldersModel->getDatabase()); } else if (status == LibraryWindow::Searching) { // if no searching, then ignore this clearSearchFilter();