gui: Perform content search and path search by default

Search for content and paths. Merge lone words for content search.

This behaviour is much more natural than typing "c:()".
This commit is contained in:
Albert S. 2021-12-30 12:17:12 +01:00
джерело bb5a793300
коміт 407ee1210c
6 змінених файлів з 27 додано та 10 видалено

@ -24,7 +24,7 @@ int CommandList::handle(QStringList arguments)
QStringList files = parser.positionalArguments(); QStringList files = parser.positionalArguments();
QString queryStrings = files.join(' '); QString queryStrings = files.join(' ');
auto results = dbService->search(LooqsQuery::build(queryStrings)); auto results = dbService->search(LooqsQuery::build(queryStrings, TokenType::FILTER_PATH_CONTAINS, false));
for(SearchResult &result : results) for(SearchResult &result : results)
{ {

@ -16,7 +16,7 @@ int CommandSearch::handle(QStringList arguments)
QStringList files = parser.positionalArguments(); QStringList files = parser.positionalArguments();
QString queryStrings = files.join(' '); QString queryStrings = files.join(' ');
LooqsQuery query = LooqsQuery::build(queryStrings); LooqsQuery query = LooqsQuery::build(queryStrings, TokenType::FILTER_PATH_CONTAINS, false);
bool reverse = parser.isSet("reverse"); bool reverse = parser.isSet("reverse");
if(reverse) if(reverse)
{ {

@ -166,8 +166,13 @@ void MainWindow::lineEditReturnPressed()
[&, q]() [&, q]()
{ {
SqliteSearch searcher(db); SqliteSearch searcher(db);
this->currentQuery = LooqsQuery::build(q); this->contentSearchQuery = LooqsQuery::build(q, TokenType::FILTER_CONTENT_CONTAINS, true);
return searcher.search(this->currentQuery);
LooqsQuery filesQuery = LooqsQuery::build(q, TokenType::FILTER_PATH_CONTAINS, false);
QVector<SearchResult> results;
results.append(searcher.search(filesQuery));
results.append(searcher.search(this->contentSearchQuery));
return results;
}); });
searchWatcher.setFuture(searchFuture); searchWatcher.setFuture(searchFuture);
} }
@ -243,7 +248,7 @@ void MainWindow::makePdfPreview(int page)
QVector<QString> wordsToHighlight; QVector<QString> wordsToHighlight;
QRegularExpression extractor(R"#("([^"]*)"|(\w+))#"); QRegularExpression extractor(R"#("([^"]*)"|(\w+))#");
for(const Token &token : this->currentQuery.getTokens()) for(const Token &token : this->contentSearchQuery.getTokens())
{ {
if(token.type == FILTER_CONTENT_CONTAINS) if(token.type == FILTER_CONTENT_CONTAINS)
{ {

@ -45,7 +45,7 @@ class MainWindow : public QMainWindow
unsigned int processedPdfPreviews; unsigned int processedPdfPreviews;
void handleSearchResults(const QVector<SearchResult> &results); void handleSearchResults(const QVector<SearchResult> &results);
void handleSearchError(QString error); void handleSearchError(QString error);
LooqsQuery currentQuery; LooqsQuery contentSearchQuery;
int pdfPreviewsPerPage; int pdfPreviewsPerPage;
void createSearchResutlMenu(QMenu &menu, const QFileInfo &fileInfo); void createSearchResutlMenu(QMenu &menu, const QFileInfo &fileInfo);
void ipcDocOpen(QString path, int num); void ipcDocOpen(QString path, int num);

@ -157,15 +157,15 @@ void LooqsQuery::addToken(Token t)
* thus, "Downloads zip" becomes essentailly "path.contains:(Downloads) AND path.contains:(zip)" * thus, "Downloads zip" becomes essentailly "path.contains:(Downloads) AND path.contains:(zip)"
* *
* TODO: It's a bit ugly still*/ * TODO: It's a bit ugly still*/
LooqsQuery LooqsQuery::build(QString expression) LooqsQuery LooqsQuery::build(QString expression, TokenType loneWordsTokenType, bool mergeLoneWords)
{ {
if(!checkParanthesis(expression)) if(!checkParanthesis(expression))
{ {
throw LooqsGeneralException("Invalid paranthesis"); throw LooqsGeneralException("Invalid paranthesis");
} }
QStringList loneWords;
LooqsQuery result; LooqsQuery result;
// TODO: merge lonewords
QRegularExpression rx("((?<filtername>(\\.|\\w)+):(?<args>\\((?<innerargs>[^\\)]+)\\)|([\\w,])+)|(?<boolean>AND|OR)" QRegularExpression rx("((?<filtername>(\\.|\\w)+):(?<args>\\((?<innerargs>[^\\)]+)\\)|([\\w,])+)|(?<boolean>AND|OR)"
"|(?<negation>!)|(?<bracket>\\(|\\))|(?<loneword>\\w+))"); "|(?<negation>!)|(?<bracket>\\(|\\))|(?<loneword>\\w+))");
QRegularExpressionMatchIterator i = rx.globalMatch(expression); QRegularExpressionMatchIterator i = rx.globalMatch(expression);
@ -233,7 +233,14 @@ LooqsQuery LooqsQuery::build(QString expression)
if(loneword != "") if(loneword != "")
{ {
result.addToken(Token(FILTER_PATH_CONTAINS, loneword)); if(mergeLoneWords)
{
loneWords.append(loneword);
}
else
{
result.addToken(Token(loneWordsTokenType, loneword));
}
} }
if(filtername != "") if(filtername != "")
@ -292,6 +299,11 @@ LooqsQuery LooqsQuery::build(QString expression)
} }
} }
if(mergeLoneWords)
{
result.addToken(Token(loneWordsTokenType, loneWords.join(' ')));
}
bool contentsearch = (result.getTokensMask() & FILTER_CONTENT) == FILTER_CONTENT; bool contentsearch = (result.getTokensMask() & FILTER_CONTENT) == FILTER_CONTENT;
bool sortsForContent = std::any_of(result.sortConditions.begin(), result.sortConditions.end(), bool sortsForContent = std::any_of(result.sortConditions.begin(), result.sortConditions.end(),
[](SortCondition c) { return c.field == CONTENT_TEXT; }); [](SortCondition c) { return c.field == CONTENT_TEXT; });

@ -54,7 +54,7 @@ class LooqsQuery
} }
void addSortCondition(SortCondition sc); void addSortCondition(SortCondition sc);
static bool checkParanthesis(QString query); static bool checkParanthesis(QString query);
static LooqsQuery build(QString query); static LooqsQuery build(QString query, TokenType loneWordsTokenType, bool mergeLoneWords);
}; };
#endif // LOOQSQUERY_H #endif // LOOQSQUERY_H