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 219646DE21A0 for ; Sun, 26 Feb 2017 18:34:38 -0800 (PST) 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 STb7K7vstGvs for ; Sun, 26 Feb 2017 18:34:37 -0800 (PST) Received: from fethera.tethera.net (fethera.tethera.net [198.245.60.197]) by arlo.cworth.org (Postfix) with ESMTPS id C36546DE21AA for ; Sun, 26 Feb 2017 18:34:32 -0800 (PST) Received: from remotemail by fethera.tethera.net with local (Exim 4.84_2) (envelope-from ) id 1ciB8L-00011q-Ql; Sun, 26 Feb 2017 21:33:53 -0500 Received: (nullmailer pid 27734 invoked by uid 1000); Mon, 27 Feb 2017 02:34:26 -0000 From: David Bremner To: notmuch@notmuchmail.org Subject: [PATCH 1/4] lib: create field processors from prefix table Date: Sun, 26 Feb 2017 22:34:19 -0400 Message-Id: <20170227023422.26929-2-david@tethera.net> X-Mailer: git-send-email 2.11.0 In-Reply-To: <20170227023422.26929-1-david@tethera.net> References: <20170227023422.26929-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: Mon, 27 Feb 2017 02:34:38 -0000 This is a bit more code than hardcoding the two existing field processors, but it should make it easy to add more. --- lib/database-private.h | 3 ++- lib/database.cc | 62 +++++++++++++++++++++++++++++++++++--------------- 2 files changed, 46 insertions(+), 19 deletions(-) diff --git a/lib/database-private.h b/lib/database-private.h index 06882439..ab3d9691 100644 --- a/lib/database-private.h +++ b/lib/database-private.h @@ -153,7 +153,8 @@ operator&=(_notmuch_features &a, _notmuch_features b) typedef enum notmuch_field_flags { NOTMUCH_FIELD_NO_FLAGS = 0, NOTMUCH_FIELD_EXTERNAL = 1 << 0, - NOTMUCH_FIELD_PROBABILISTIC = 1 << 1 + NOTMUCH_FIELD_PROBABILISTIC = 1 << 1, + NOTMUCH_FIELD_PROCESSOR = 1 << 2, } notmuch_field_flag_t; /* diff --git a/lib/database.cc b/lib/database.cc index ba440d4d..fa4c3116 100644 --- a/lib/database.cc +++ b/lib/database.cc @@ -270,6 +270,12 @@ prefix_t prefix_table[] = { * discussion. */ { "folder", "XFOLDER:", NOTMUCH_FIELD_EXTERNAL }, +#if HAVE_XAPIAN_FIELD_PROCESSOR + { "date", NULL, NOTMUCH_FIELD_EXTERNAL | + NOTMUCH_FIELD_PROCESSOR }, + { "query", NULL, NOTMUCH_FIELD_EXTERNAL | + NOTMUCH_FIELD_PROCESSOR }, +#endif { "from", "XFROM", NOTMUCH_FIELD_EXTERNAL | NOTMUCH_FIELD_PROBABILISTIC }, { "to", "XTO", NOTMUCH_FIELD_EXTERNAL | @@ -282,6 +288,43 @@ prefix_t prefix_table[] = { NOTMUCH_FIELD_PROBABILISTIC }, }; +static void +_setup_query_field_default (const prefix_t *prefix, notmuch_database_t *notmuch) +{ + if (prefix->flags & NOTMUCH_FIELD_PROBABILISTIC) + notmuch->query_parser->add_prefix (prefix->name, prefix->prefix); + else + notmuch->query_parser->add_boolean_prefix (prefix->name, prefix->prefix); +} + +#if HAVE_XAPIAN_FIELD_PROCESSOR +static void +_setup_query_field (const prefix_t *prefix, notmuch_database_t *notmuch) +{ + if (prefix->flags & NOTMUCH_FIELD_PROCESSOR) { + Xapian::FieldProcessor *fp; + + if (STRNCMP_LITERAL (prefix->name, "date") == 0) + fp = (new DateFieldProcessor())->release (); + else if (STRNCMP_LITERAL(prefix->name, "query") == 0) + fp = (new QueryFieldProcessor (*notmuch->query_parser, notmuch))->release (); + else + INTERNAL_ERROR("unsupported field processor prefix: %s\n", prefix->name); + + /* we treat all field-processor fields as boolean in order to get the raw input */ + notmuch->query_parser->add_boolean_prefix (prefix->name, fp); + } else { + _setup_query_field_default (prefix, notmuch); + } +} +#else +static inline void +_setup_query_field (const prefix_t *prefix, notmuch_database_t *notmuch) +{ + _setup_query_field_default (prefix, notmuch); +} +#endif + const char * _find_prefix (const char *name) { @@ -1028,18 +1071,6 @@ notmuch_database_open_verbose (const char *path, notmuch->term_gen->set_stemmer (Xapian::Stem ("english")); notmuch->value_range_processor = new Xapian::NumberValueRangeProcessor (NOTMUCH_VALUE_TIMESTAMP); notmuch->date_range_processor = new ParseTimeValueRangeProcessor (NOTMUCH_VALUE_TIMESTAMP); -#if HAVE_XAPIAN_FIELD_PROCESSOR - /* This currently relies on the query parser to pass anything - * with a .. to the range processor */ - { - Xapian::FieldProcessor * date_fp = new DateFieldProcessor(); - Xapian::FieldProcessor * query_fp = - new QueryFieldProcessor (*notmuch->query_parser, notmuch); - - notmuch->query_parser->add_boolean_prefix("date", date_fp->release ()); - notmuch->query_parser->add_boolean_prefix("query", query_fp->release ()); - } -#endif notmuch->last_mod_range_processor = new Xapian::NumberValueRangeProcessor (NOTMUCH_VALUE_LAST_MOD, "lastmod:"); notmuch->query_parser->set_default_op (Xapian::Query::OP_AND); @@ -1053,12 +1084,7 @@ notmuch_database_open_verbose (const char *path, for (i = 0; i < ARRAY_SIZE (prefix_table); i++) { const prefix_t *prefix = &prefix_table[i]; if (prefix->flags & NOTMUCH_FIELD_EXTERNAL) { - if (prefix->flags & NOTMUCH_FIELD_PROBABILISTIC) { - notmuch->query_parser->add_prefix (prefix->name, prefix->prefix); - } else { - notmuch->query_parser->add_boolean_prefix (prefix->name, - prefix->prefix); - } + _setup_query_field (prefix, notmuch); } } } catch (const Xapian::Error &error) { -- 2.11.0