From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from localhost (localhost [127.0.0.1]) by arlo.cworth.org (Postfix) with ESMTP id 555A96DE165F for ; Fri, 24 Mar 2017 05:14:51 -0700 (PDT) X-Virus-Scanned: Debian amavisd-new at cworth.org X-Spam-Flag: NO X-Spam-Score: -0.005 X-Spam-Level: X-Spam-Status: No, score=-0.005 tagged_above=-999 required=5 tests=[AWL=0.006, SPF_PASS=-0.001, T_RP_MATCHES_RCVD=-0.01] autolearn=disabled Received: from arlo.cworth.org ([127.0.0.1]) by localhost (arlo.cworth.org [127.0.0.1]) (amavisd-new, port 10024) with ESMTP id FO2ygv2rrFPF for ; Fri, 24 Mar 2017 05:14:50 -0700 (PDT) Received: from fethera.tethera.net (fethera.tethera.net [198.245.60.197]) by arlo.cworth.org (Postfix) with ESMTPS id 5ABAD6DE166E for ; Fri, 24 Mar 2017 05:14:48 -0700 (PDT) Received: from remotemail by fethera.tethera.net with local (Exim 4.84_2) (envelope-from ) id 1crO6W-0003rc-EY; Fri, 24 Mar 2017 08:14:04 -0400 Received: (nullmailer pid 29043 invoked by uid 1000); Fri, 24 Mar 2017 12:14:43 -0000 From: David Bremner To: notmuch@notmuchmail.org Subject: [PATCH 1/2] lib: Add regexp searching for mid: prefix Date: Fri, 24 Mar 2017 09:14:35 -0300 Message-Id: <20170324121436.28978-2-david@tethera.net> X-Mailer: git-send-email 2.11.0 In-Reply-To: <20170324121436.28978-1-david@tethera.net> References: <20170324121436.28978-1-david@tethera.net> X-BeenThere: notmuch@notmuchmail.org X-Mailman-Version: 2.1.22 Precedence: list List-Id: "Use and development of the notmuch mail system." List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Fri, 24 Mar 2017 12:14:51 -0000 The bulk of the change is passing in the field options to the regexp field processor, so that we can properly handle the fallback (non-regexp case). --- doc/man7/notmuch-search-terms.rst | 26 +++++++++++++++----------- lib/database.cc | 6 ++++-- lib/regexp-fields.cc | 22 +++++++++++++++++----- lib/regexp-fields.h | 4 +++- test/T650-regexp-query.sh | 16 ++++++++++++++++ 5 files changed, 55 insertions(+), 19 deletions(-) diff --git a/doc/man7/notmuch-search-terms.rst b/doc/man7/notmuch-search-terms.rst index 47cab48d..a8ba5e02 100644 --- a/doc/man7/notmuch-search-terms.rst +++ b/doc/man7/notmuch-search-terms.rst @@ -50,6 +50,10 @@ indicate user-supplied values): - id: +- mid: + +- mid:// + - thread: - folder: @@ -75,15 +79,6 @@ subject of an email. Searching for a phrase in the subject is supported by including quotation marks around the phrase, immediately following **subject:**. -If notmuch is built with **Xapian Field Processors** (see below) the -**from:** and **subject** prefix can be also used to restrict the -results to those whose from/subject value matches a regular expression -(see **regex(7)**) delimited with //. - -:: - - notmuch search 'from:/bob@.*[.]example[.]com/' - The **attachment:** prefix can be used to search for specific filenames (or extensions) of attachments to email messages. @@ -95,8 +90,8 @@ For **tag:** and **is:** valid tag values include **inbox** and **unread** by default for new messages added by **notmuch new** as well as any other tag values added manually with **notmuch tag**. -For **id:**, message ID values are the literal contents of the -Message-ID: header of email messages, but without the '<', '>' +For **id:** and **mid**, message ID values are the literal contents of +the Message-ID: header of email messages, but without the '<', '>' delimiters. The **thread:** prefix can be used with the thread ID values that are @@ -159,6 +154,15 @@ The **property:** prefix searches for messages with a particular (and extensions) to add metadata to messages. A given key can be present on a given message with several different values. +If notmuch is built with **Xapian Field Processors** (see below) the +**from:**, **mid:** (but not **id:**), and **subject** prefix can be +also used to restrict the results to those whose from/subject value +matches a regular expression (see **regex(7)**) delimited with //. + +:: + + notmuch search 'from:/bob@.*[.]example[.]com/' + Operators --------- diff --git a/lib/database.cc b/lib/database.cc index 5bc131a3..49b3849c 100644 --- a/lib/database.cc +++ b/lib/database.cc @@ -262,7 +262,8 @@ prefix_t prefix_table[] = { { "tag", "K", NOTMUCH_FIELD_EXTERNAL }, { "is", "K", NOTMUCH_FIELD_EXTERNAL }, { "id", "Q", NOTMUCH_FIELD_EXTERNAL }, - { "mid", "Q", NOTMUCH_FIELD_EXTERNAL }, + { "mid", "Q", NOTMUCH_FIELD_EXTERNAL | + NOTMUCH_FIELD_PROCESSOR }, { "path", "P", NOTMUCH_FIELD_EXTERNAL }, { "property", "XPROPERTY", NOTMUCH_FIELD_EXTERNAL }, /* @@ -313,7 +314,8 @@ _setup_query_field (const prefix_t *prefix, notmuch_database_t *notmuch) else if (STRNCMP_LITERAL(prefix->name, "query") == 0) fp = (new QueryFieldProcessor (*notmuch->query_parser, notmuch))->release (); else - fp = (new RegexpFieldProcessor (prefix->name, *notmuch->query_parser, notmuch))->release (); + fp = (new RegexpFieldProcessor (prefix->name, prefix->flags, + *notmuch->query_parser, notmuch))->release (); /* we treat all field-processor fields as boolean in order to get the raw input */ notmuch->query_parser->add_boolean_prefix (prefix->name, fp); diff --git a/lib/regexp-fields.cc b/lib/regexp-fields.cc index 08c6ccb5..fb1e951f 100644 --- a/lib/regexp-fields.cc +++ b/lib/regexp-fields.cc @@ -135,21 +135,33 @@ static inline Xapian::valueno _find_slot (std::string prefix) return NOTMUCH_VALUE_FROM; else if (prefix == "subject") return NOTMUCH_VALUE_SUBJECT; + else if (prefix == "mid") + return NOTMUCH_VALUE_MESSAGE_ID; else throw Xapian::QueryParserError ("unsupported regexp field '" + prefix + "'"); } -RegexpFieldProcessor::RegexpFieldProcessor (std::string prefix, Xapian::QueryParser &parser_, notmuch_database_t *notmuch_) - : slot (_find_slot (prefix)), term_prefix (_find_prefix (prefix.c_str ())), - parser (parser_), notmuch (notmuch_) +RegexpFieldProcessor::RegexpFieldProcessor (std::string prefix, + notmuch_field_flag_t options_, + Xapian::QueryParser &parser_, + notmuch_database_t *notmuch_) + : slot (_find_slot (prefix)), + term_prefix (_find_prefix (prefix.c_str ())), + options (options_), + parser (parser_), + notmuch (notmuch_) { }; Xapian::Query RegexpFieldProcessor::operator() (const std::string & str) { - if (str.size () == 0) - return Xapian::Query::MatchAll; + if (str.size () == 0) { + if (options & NOTMUCH_FIELD_PROBABILISTIC) + return Xapian::Query::MatchAll; + else + return Xapian::Query(term_prefix); + } if (str.at (0) == '/') { if (str.at (str.size () - 1) == '/'){ diff --git a/lib/regexp-fields.h b/lib/regexp-fields.h index a4ba7ad8..d5f93445 100644 --- a/lib/regexp-fields.h +++ b/lib/regexp-fields.h @@ -65,11 +65,13 @@ class RegexpFieldProcessor : public Xapian::FieldProcessor { protected: Xapian::valueno slot; std::string term_prefix; + notmuch_field_flag_t options; Xapian::QueryParser &parser; notmuch_database_t *notmuch; public: - RegexpFieldProcessor (std::string prefix, Xapian::QueryParser &parser_, notmuch_database_t *notmuch_); + RegexpFieldProcessor (std::string prefix, notmuch_field_flag_t options, + Xapian::QueryParser &parser_, notmuch_database_t *notmuch_); ~RegexpFieldProcessor () { }; diff --git a/test/T650-regexp-query.sh b/test/T650-regexp-query.sh index 05c244c9..5bd24086 100755 --- a/test/T650-regexp-query.sh +++ b/test/T650-regexp-query.sh @@ -94,4 +94,20 @@ Query string was: from:/unbalanced[/ EOF test_expect_equal_file EXPECTED OUTPUT +test_begin_subtest "empty mid search" +notmuch search --output=messages mid:yoom > OUTPUT +cp /dev/null EXPECTED +test_expect_equal_file EXPECTED OUTPUT + +test_begin_subtest "non-empty mid regex search" +notmuch search --output=messages mid:/yoom/ > OUTPUT +test_expect_equal_file cworth.msg-ids OUTPUT + +test_begin_subtest "combine regexp mid and subject" +notmuch search subject:/-C/ and mid:/y..m/ | notmuch_search_sanitize > OUTPUT +cat < EXPECTED +thread:XXX 2009-11-18 [1/2] Carl Worth| Jan Janak; [notmuch] [PATCH] Older versions of install do not support -C. (inbox unread) +EOF +test_expect_equal_file EXPECTED OUTPUT + test_done -- 2.11.0