These should not be treated as phrase searches. Due to the problem outlined in [1] it is not possible to use a query string subject:(foo bar) but at least with this fix subject:"(foo bar)" expands to subject:foo OP subject:bar, which is more useful than another way to type a phrase search. [1]: https://trac.xapian.org/ticket/795 --- lib/regexp-fields.cc | 19 +++++++++++++++++++ test/T650-regexp-query.sh | 4 ---- test/T760-implicit-operators.sh | 7 +++---- 3 files changed, 22 insertions(+), 8 deletions(-) diff --git a/lib/regexp-fields.cc b/lib/regexp-fields.cc index 198eb32f..3f92b2ab 100644 --- a/lib/regexp-fields.cc +++ b/lib/regexp-fields.cc @@ -189,6 +189,25 @@ RegexpFieldProcessor::operator() (const std::string & str) } else { throw Xapian::QueryParserError ("unmatched regex delimiter in '" + str + "'"); } + } else if (str.at (0) == '(') { + if (str.length () > 1 && str.at (str.size () - 1) == ')') { + std::string subexp_str = str.substr (1, str.size () - 2); + Xapian::Query query = parser.parse_query (subexp_str, + NOTMUCH_QUERY_PARSER_FLAGS, + term_prefix); + + if (_notmuch_query_debug ()) { + fprintf (stderr, "subquery string [prefix=%s]:\n%s\n", + term_prefix.c_str (), + subexp_str.c_str ()); + fprintf (stderr, "parsed subquery:\n%s\n", + query.get_description ().c_str ()); + } + + return query; + } else { + throw Xapian::QueryParserError ("unmatched '(' in '" + str + "'"); + } } else { if (options & NOTMUCH_FIELD_PROBABILISTIC) { /* TODO replace this with a nicer API level triggering of diff --git a/test/T650-regexp-query.sh b/test/T650-regexp-query.sh index 05a04791..d9ffd2e7 100755 --- a/test/T650-regexp-query.sh +++ b/test/T650-regexp-query.sh @@ -183,25 +183,21 @@ notmuch search tag:/^si/ > OUTPUT test_expect_equal_file EXPECTED OUTPUT test_begin_subtest "parenthesized subqueries are not phrases" -test_subtest_known_broken notmuch search subject:notmuch AND subject:outputs > EXPECTED notmuch search 'subject:"(notmuch outputs)"' > OUTPUT test_expect_equal_file EXPECTED OUTPUT test_begin_subtest "parenthesized subqueries work with OR" -test_subtest_known_broken notmuch search subject:notmuch OR subject:outputs > EXPECTED notmuch search 'subject:"(notmuch OR outputs)"' > OUTPUT test_expect_equal_file EXPECTED OUTPUT test_begin_subtest "parenthesized subqueries work with AND" -test_subtest_known_broken notmuch search subject:notmuch AND subject:outputs > EXPECTED notmuch search 'subject:"(notmuch AND outputs)"' > OUTPUT test_expect_equal_file EXPECTED OUTPUT test_begin_subtest "parenthesized subqueries work with overidden prefix" -test_subtest_known_broken notmuch search subject:help AND subject:outputs AND to:notmuch > EXPECTED notmuch search 'subject:"(outputs help to:notmuch)"' > OUTPUT test_expect_equal_file EXPECTED OUTPUT diff --git a/test/T760-implicit-operators.sh b/test/T760-implicit-operators.sh index 118a9de2..1eab4ec9 100755 --- a/test/T760-implicit-operators.sh +++ b/test/T760-implicit-operators.sh @@ -27,7 +27,7 @@ test_prob() { # regex search test_prob_regex() { - test_prob $1 $2 + test_prob $1 test_begin_subtest "regex for '$1': matches" notmuch search --output=messages id:$1@one > EXPECTED @@ -44,7 +44,6 @@ test_prob_regex() { test_expect_equal_file EXPECTED OUTPUT test_begin_subtest "subquery for '$1' implicit AND" - $2 notmuch search --output=messages id:$1@one > EXPECTED notmuch search --output=messages "$1:\"(agent alice)\"" > OUTPUT test_expect_equal_file EXPECTED OUTPUT @@ -84,8 +83,8 @@ add_email_corpus test_prob_not_regex to test_prob_not_regex body -test_prob_regex from test_subtest_known_broken -test_prob_regex subject test_subtest_known_broken +test_prob_regex from +test_prob_regex subject test_bool_exclusive id id test_bool_exclusive_regex mid id -- 2.23.0.rc1 _______________________________________________ notmuch mailing list notmuch@notmuchmail.org https://notmuchmail.org/mailman/listinfo/notmuch