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 5E2FB6DE196A for ; Thu, 16 Feb 2017 19:08:03 -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 3Yr6HNLx0YAX for ; Thu, 16 Feb 2017 19:08:02 -0800 (PST) Received: from fethera.tethera.net (fethera.tethera.net [198.245.60.197]) by arlo.cworth.org (Postfix) with ESMTPS id 1587E6DE1966 for ; Thu, 16 Feb 2017 19:08:02 -0800 (PST) Received: from remotemail by fethera.tethera.net with local (Exim 4.84_2) (envelope-from ) id 1ceYtI-00034n-Or; Thu, 16 Feb 2017 22:07:24 -0500 Received: (nullmailer pid 32135 invoked by uid 1000); Fri, 17 Feb 2017 03:07:58 -0000 From: David Bremner To: notmuch@notmuchmail.org Subject: [patch v5 3/6] lib: create field processors from prefix table Date: Thu, 16 Feb 2017 23:07:51 -0400 Message-Id: <20170217030754.32069-4-david@tethera.net> X-Mailer: git-send-email 2.11.0 In-Reply-To: <20170217030754.32069-1-david@tethera.net> References: <20170217030754.32069-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, 17 Feb 2017 03:08:03 -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 | 45 +++++++++++++++++++++++++++++++-------------- 2 files changed, 33 insertions(+), 15 deletions(-) diff --git a/lib/database-private.h b/lib/database-private.h index 2fb60f5e..60d1fead 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 8016c4df..450ee295 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,20 @@ prefix_t prefix_table[] = { NOTMUCH_FIELD_PROBABILISTIC }, }; +#if HAVE_XAPIAN_FIELD_PROCESSOR +static Xapian::FieldProcessor * +_make_field_processor (const char *name, notmuch_database_t *notmuch) { + if (STRNCMP_LITERAL (name, "date") == 0) + return (new DateFieldProcessor())->release (); + else if (STRNCMP_LITERAL(name, "query") == 0) + return (new QueryFieldProcessor (*notmuch->query_parser, notmuch))->release (); + + INTERNAL_ERROR ("no field processor for prefix '%s'\n", name); +} +#else +#define _make_field_processor(name, db) NULL +#endif + const char * _find_prefix (const char *name) { @@ -1027,18 +1047,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); @@ -1052,8 +1060,17 @@ 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); + /* we treat all field-processor fields as boolean in order + to get the raw input */ + if (HAVE_XAPIAN_FIELD_PROCESSOR && + (prefix->flags & NOTMUCH_FIELD_PROCESSOR)) { + Xapian::FieldProcessor *fp = _make_field_processor (prefix->name, + notmuch); + + notmuch->query_parser->add_boolean_prefix (prefix->name, fp); + } else 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); -- 2.11.0