[PATCH 10/25] lib/parse-sexp: handle unprefixed terms.

Subject: [PATCH 10/25] lib/parse-sexp: handle unprefixed terms.

Date: Sat, 17 Jul 2021 23:40:06 -0300

To: notmuch@notmuchmail.org

Cc: David Bremner

From: David Bremner


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-leave@notmuchmail.org

Thread: