diff --git a/violet/lib/component/hitomi/hitomi.dart b/violet/lib/component/hitomi/hitomi.dart index 896bd6d8c..1e12d6107 100644 --- a/violet/lib/component/hitomi/hitomi.dart +++ b/violet/lib/component/hitomi/hitomi.dart @@ -322,6 +322,9 @@ class QueryTranslator { where += parseParentheses(token, negative); where += parseExpression(); where += nextToken(); + if (hasMoreTokens()) { + where += parseLogicalExpression(); + } } else if (token == ')') { return token; } else { @@ -329,8 +332,7 @@ class QueryTranslator { } if (hasMoreTokens() && lookAhead() != ')') { - String logicalOp = parseLogicalOperator(); - where += logicalOp + parseExpression(); + where += parseLogicalExpression(); } return where; @@ -393,18 +395,21 @@ class QueryTranslator { return negative ? "Title NOT LIKE '%$token%'" : "Title LIKE '%$token%'"; } - String parseLogicalOperator() { + String parseLogicalExpression() { String next = lookAhead(); + late String op; if (next.toLowerCase() == 'or') { nextToken(); - return ' OR '; + op = 'OR'; + } else { + op = 'AND'; } - return ' AND '; + return ' $op ${parseExpression()}'; } String nextToken() => tokens[index++]; String lookAhead() => index < tokens.length ? tokens[index] : ''; - bool hasMoreTokens() => index < tokens.length - 1; + bool hasMoreTokens() => index < tokens.length; static String findColumnByTag(String tag) { switch (tag) { diff --git a/violet/test/query_test.dart b/violet/test/query_test.dart index 9bb10826b..11ea53515 100644 --- a/violet/test/query_test.dart +++ b/violet/test/query_test.dart @@ -55,7 +55,7 @@ void main() { expect(result1, 'SELECT * FROM HitomiColumnModel WHERE Tags LIKE \'%|female:sole female|%\' AND NOT (Tags LIKE \'%|female:mother|%\' AND Tags LIKE \'%|female:milf|%\') AND ExistOnHitomi=1'); expect(result2, - 'SELECT * FROM HitomiColumnModel WHERE (Language LIKE \'%korean%\' OR Language LIKE \'%n/a%\') AND ExistOnHitomi=1'); + 'SELECT * FROM HitomiColumnModel WHERE (Language LIKE \'%korean%\' OR Language LIKE \'%n/a%\') AND (Tags LIKE \'%|female:sole female|%\') IS NOT 1 AND ExistOnHitomi=1'); }); }); }