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

Reply via email to