diff --git a/shared/looqsquery.cpp b/shared/looqsquery.cpp index c702014..5da291c 100644 --- a/shared/looqsquery.cpp +++ b/shared/looqsquery.cpp @@ -220,19 +220,8 @@ LooqsQuery LooqsQuery::build(QString expression, TokenType loneWordsTokenType, b { throw LooqsGeneralException("Can't have two negations following each other"); } - if(!previousWasBool()) - { - result.addToken(Token(BOOL_AND)); // Implicit and, our default operation - } result.addToken(Token(NEGATION)); } - if(!result.tokens.isEmpty() && !previousWasBool() && !previousWas(NEGATION) && !previousWas(BRACKET_OPEN) && - bracket != ")") - { - // the current token isn't a negation, isn't a boolean. Thus, implicit AND is required - result.addToken(Token(BOOL_AND)); - } - if(bracket != "") { if(bracket == "(") @@ -259,7 +248,7 @@ LooqsQuery LooqsQuery::build(QString expression, TokenType loneWordsTokenType, b if(filtername != "") { - TokenType tokenType; + TokenType tokenType = WORD; QString value = m.captured("innerargs"); if(value == "") { @@ -294,21 +283,21 @@ LooqsQuery LooqsQuery::build(QString expression, TokenType loneWordsTokenType, b { tokenType = FILTER_CONTENT_PAGE; } - else if(filtername == - "sort") // TODO: given this is not really a "filter", this feels slightly misplaced here + // TODO: given this is not really a "filter", this feels slightly misplaced here + else if(filtername == "sort") { if(!result.sortConditions.empty()) { throw LooqsGeneralException("Two sort statements are illegal"); } - // TODO: hack, since we are not a "filter", we must remove a preceeding (implicit) boolean - if((result.tokens.last().type & BOOL) == BOOL) - { - result.tokens.pop_back(); - } result.sortConditions = createSortConditions(value); continue; } + else if(filtername == "limit") + { + result.limit = value.toInt(); + continue; + } else { throw LooqsGeneralException("Unknown filter provided!"); @@ -326,6 +315,26 @@ LooqsQuery LooqsQuery::build(QString expression, TokenType loneWordsTokenType, b } } + /* Add our default implicit AND boolean condition where appropriate */ + QVector newTokens; + + TokenType prevType = BOOL_AND; + int needsBoolean = FILTER_CONTENT | FILTER_PATH | NEGATION; + for(Token &t : result.tokens) + { + if(t.type == BRACKET_OPEN || t.type & needsBoolean) + { + if(!((prevType & BOOL) == BOOL) && !((prevType & NEGATION) == NEGATION) && + !((prevType & BRACKET_OPEN) == BRACKET_OPEN)) + { + newTokens.append(Token(BOOL_AND)); + } + } + prevType = t.type; + newTokens.append(t); + } + result.tokens = newTokens; + bool contentsearch = result.hasContentSearch(); bool sortsForContent = std::any_of(result.sortConditions.begin(), result.sortConditions.end(), [](SortCondition c) { return c.field == CONTENT_TEXT; }); diff --git a/shared/looqsquery.h b/shared/looqsquery.h index 115377e..2ec19a8 100644 --- a/shared/looqsquery.h +++ b/shared/looqsquery.h @@ -40,6 +40,7 @@ class LooqsQuery /* Helper field to determine quertype as well as to quickly check what kind of filters etc. * are being used in this query*/ int tokensMask = 0; + int limit = -1; QVector tokens; QVector sortConditions; void addToken(Token t); @@ -52,6 +53,14 @@ class LooqsQuery { return tokensMask; } + int getLimit() const + { + return limit; + } + void setLimit(int limit) + { + this->limit = limit; + } bool hasContentSearch(); bool hasPathSearch(); diff --git a/shared/token.h b/shared/token.h index c8d2c21..84521d7 100644 --- a/shared/token.h +++ b/shared/token.h @@ -4,24 +4,25 @@ enum TokenType { - WORD, - NEGATION = 2, - BOOL = 4, + WORD = 8, + NEGATION = 16, + BOOL = 32, BOOL_AND, BOOL_OR, - GROUP = 8, + GROUP = 64, BRACKET_OPEN, BRACKET_CLOSE, - SORT = 16, - FILTER_PATH = 32, + SORT = 128, + FILTER_PATH = 256, FILTER_PATH_MTIME, FILTER_PATH_CONTAINS, FILTER_PATH_SIZE, FILTER_PATH_ENDS, FILTER_PATH_STARTS, - FILTER_CONTENT = 64, + FILTER_CONTENT = 512, FILTER_CONTENT_CONTAINS, FILTER_CONTENT_PAGE, + LIMIT = 1024 }; class Token