This is equivalent to adding the same field name "" for multiple prefixes in the Xapian query parser, but we have to explicitely construct the resulting query. --- lib/parse-sexp.cc | 15 ++++++++++++--- test/T081-sexpr-search.sh | 27 +++++++++++++++++++++++++++ 2 files changed, 39 insertions(+), 3 deletions(-)
diff --git a/lib/parse-sexp.cc b/lib/parse-sexp.cc index 5865dc88..c8bc3432 100644 --- a/lib/parse-sexp.cc +++ b/lib/parse-sexp.cc @@ -144,9 +144,18 @@ _sexp_to_xapian_query (notmuch_database_t *notmuch, const sexp_t *sx, Xapian::Qu const _sexp_op_t *op; - /* Currently we don't understand atoms */ - assert (sx->ty == SEXP_LIST); - + if (sx->ty == SEXP_VALUE) { + Xapian::Query accumulator; + for (const _sexp_field_t *field = fields; field && field->name; field++) { + std::vector<std::string> terms; + _sexp_find_words (sx->val, _find_prefix (field->name), terms); + accumulator = Xapian::Query (Xapian::Query::OP_OR, accumulator, + Xapian::Query (Xapian::Query::OP_PHRASE, + terms.begin (), terms.end ())); + } + output = accumulator; + return NOTMUCH_STATUS_SUCCESS; + } /* Empty list */ if (! sx->list) { output = Xapian::Query::MatchAll; diff --git a/test/T081-sexpr-search.sh b/test/T081-sexpr-search.sh index 95837448..80e3daf3 100755 --- a/test/T081-sexpr-search.sh +++ b/test/T081-sexpr-search.sh @@ -29,6 +29,10 @@ add_message '[subject]="body search"' '[date]="Sat, 01 Jan 2000 12:00:00 -0000"' output=$(notmuch search --query-syntax=sexp '(body bodysearchtest)' | notmuch_search_sanitize) test_expect_equal "$output" "thread:XXX 2000-01-01 [1/1] Notmuch Test Suite; body search (inbox unread)" +test_begin_subtest "Search by body (unprefixed)" +output=$(notmuch search --query-syntax=sexp '(and bodysearchtest)' | notmuch_search_sanitize) +test_expect_equal "$output" "thread:XXX 2000-01-01 [1/1] Notmuch Test Suite; body search (inbox unread)" + test_begin_subtest "Search by 'body' (phrase)" add_message '[subject]="body search (phrase)"' '[date]="Sat, 01 Jan 2000 12:00:00 -0000"' '[body]="body search (phrase)"' add_message '[subject]="negative result"' '[date]="Sat, 01 Jan 2000 12:00:00 -0000"' '[body]="This phrase should not match the body search"' @@ -40,6 +44,29 @@ add_message '[subject]="utf8-message-body-subject"' '[date]="Sat, 01 Jan 2000 12 output=$(notmuch search --query-syntax=sexp '(body bödý)' | notmuch_search_sanitize) test_expect_equal "$output" "thread:XXX 2000-01-01 [1/1] Notmuch Test Suite; utf8-message-body-subject (inbox unread)" +add_message "[body]=thebody-1" "[subject]=kryptonite-1" +add_message "[body]=nothing-to-see-here-1" "[subject]=thebody-1" + +test_begin_subtest 'search without body: prefix' +notmuch search thebody > EXPECTED +notmuch search --query-syntax=sexp '(and thebody)' > OUTPUT +test_expect_equal_file EXPECTED OUTPUT + +test_begin_subtest 'negated body: prefix' +notmuch search thebody and not body:thebody > EXPECTED +notmuch search --query-syntax=sexp '(and (not (body thebody)) thebody)' > OUTPUT +test_expect_equal_file EXPECTED OUTPUT + +test_begin_subtest 'search unprefixed for prefixed term' +notmuch search kryptonite > EXPECTED +notmuch search --query-syntax=sexp '(and kryptonite)' > OUTPUT +test_expect_equal_file EXPECTED OUTPUT + +test_begin_subtest 'search with body: prefix for term only in subject' +notmuch search body:kryptonite > EXPECTED +notmuch search --query-syntax=sexp '(body kryptonite)' > OUTPUT +test_expect_equal_file EXPECTED OUTPUT + test_begin_subtest "Search by 'from'" add_message '[subject]="search by from"' '[date]="Sat, 01 Jan 2000 12:00:00 -0000"' [from]=searchbyfrom output=$(notmuch search --query-syntax=sexp '(from searchbyfrom)' | notmuch_search_sanitize) -- 2.30.2 _______________________________________________ notmuch mailing list -- notmuch@notmuchmail.org To unsubscribe send an email to notmuch-le...@notmuchmail.org