From: David Bremner Date: Sun, 8 Mar 2026 00:15:15 +0000 (+0900) Subject: WIP: enable new extended wildcard support in Xapian 2.0 X-Git-Url: https://git.cworth.org/git?a=commitdiff_plain;h=refs%2Fheads%2Ffeature%2Fwildcard;p=notmuch WIP: enable new extended wildcard support in Xapian 2.0 As can be seen from the included tests, this currently only works for fields without other field processors (in particular regex supporting fields seem to break it). --- diff --git a/lib/database-private.h b/lib/database-private.h index 2959b3ac..776ebc48 100644 --- a/lib/database-private.h +++ b/lib/database-private.h @@ -185,11 +185,17 @@ operator& (notmuch_field_flag_t a, notmuch_field_flag_t b) static_cast(a) & static_cast(b)); } +#ifdef HAVE_XAPIAN_WILDCARD_GLOB +#define NOTMUCH_XAPIAN_WILDCARD_FLAG Xapian::QueryParser::FLAG_WILDCARD_GLOB +#else +#define NOTMUCH_XAPIAN_WILDCARD_FLAG Xapian::QueryParser::FLAG_WILDCARD +#endif + #define NOTMUCH_QUERY_PARSER_FLAGS (Xapian::QueryParser::FLAG_BOOLEAN | \ Xapian::QueryParser::FLAG_PHRASE | \ Xapian::QueryParser::FLAG_LOVEHATE | \ Xapian::QueryParser::FLAG_BOOLEAN_ANY_CASE | \ - Xapian::QueryParser::FLAG_WILDCARD | \ + NOTMUCH_XAPIAN_WILDCARD_FLAG | \ Xapian::QueryParser::FLAG_PURE_NOT) /* diff --git a/test/T870-extended-wildcard.sh b/test/T870-extended-wildcard.sh new file mode 100755 index 00000000..16621ecf --- /dev/null +++ b/test/T870-extended-wildcard.sh @@ -0,0 +1,40 @@ +#!/usr/bin/env bash +test_description='extended wildcard support in Xapian query parser' +. $(dirname "$0")/test-lib.sh || exit 1 + +if [ "${NOTMUCH_HAVE_XAPIAN_WILDCARD_GLOB-0}" != "1" ]; then + printf "Skipping due to missing extended wildcard support\n" + test_done +fi + +add_email_corpus + +count=0 +for field in "any" 'body' 'from' 'subject' 'to' ; do + for glob in 'm?tch' '?a?ch' 'm?tc?' '*atch' 'mat*' '*at*'; do + test_begin_subtest "field $field, glob $glob" + case $field in + from|subject) + test_subtest_known_broken + ;; + esac + count=$((count + 1)) + cookie="match$count" + reversecookie="${count}match" + queryglob="$glob$count" + if [ $field == 'any' ]; then + msgfield='body' + queryprefix='' + else + msgfield=$field + queryprefix="$field:" + fi + reversequeryglob="$count$glob" + add_message "[$msgfield]=$cookie" + add_message "[$msgfield]=$reversecookie" + output=$(notmuch count "$queryprefix$queryglob") + output="$output $(notmuch count "$queryprefix$reversequeryglob")" + test_expect_equal "$output" "1 1" + done +done +test_done