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 277B06DE00E8 for ; Sat, 28 Jan 2017 05:15:40 -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 gpybLxtdepTo for ; Sat, 28 Jan 2017 05:15:39 -0800 (PST) Received: from fethera.tethera.net (fethera.tethera.net [198.245.60.197]) by arlo.cworth.org (Postfix) with ESMTPS id 86C906DE00AC for ; Sat, 28 Jan 2017 05:15:39 -0800 (PST) Received: from remotemail by fethera.tethera.net with local (Exim 4.84_2) (envelope-from ) id 1cXSqR-0007u9-Da; Sat, 28 Jan 2017 08:15:07 -0500 Received: (nullmailer pid 26480 invoked by uid 1000); Sat, 28 Jan 2017 13:15:37 -0000 From: David Bremner To: notmuch@notmuchmail.org Subject: [RFC Patch 1/2] lib: merge internal prefix tables Date: Sat, 28 Jan 2017 09:15:20 -0400 Message-Id: <20170128131521.26414-2-david@tethera.net> X-Mailer: git-send-email 2.11.0 In-Reply-To: <20170128131521.26414-1-david@tethera.net> References: <20170128131521.26414-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: Sat, 28 Jan 2017 13:15:40 -0000 Replace multiple tables with some flags in a single table. This makes the code a bit shorter, and it should also make it easier to add other options to fields, e.g. regexp searching. --- lib/database-private.h | 7 ++++ lib/database.cc | 86 +++++++++++++++++++++++--------------------------- 2 files changed, 46 insertions(+), 47 deletions(-) diff --git a/lib/database-private.h b/lib/database-private.h index ccc1e9a1..32357ce0 100644 --- a/lib/database-private.h +++ b/lib/database-private.h @@ -148,6 +148,13 @@ operator&=(_notmuch_features &a, _notmuch_features b) return a; } +/* + * Configuration options for xapian database fields */ +typedef enum notmuch_field_flags { + NOTMUCH_FIELD_EXTERNAL = 1, + NOTMUCH_FIELD_PROBABILISTIC = 2 +} notmuch_field_flag_t; + #define NOTMUCH_QUERY_PARSER_FLAGS (Xapian::QueryParser::FLAG_BOOLEAN | \ Xapian::QueryParser::FLAG_PHRASE | \ Xapian::QueryParser::FLAG_LOVEHATE | \ diff --git a/lib/database.cc b/lib/database.cc index 2d19f20c..b98468a6 100644 --- a/lib/database.cc +++ b/lib/database.cc @@ -42,6 +42,7 @@ using namespace std; typedef struct { const char *name; const char *prefix; + int flags; } prefix_t; #define NOTMUCH_DATABASE_VERSION 3 @@ -247,37 +248,37 @@ typedef struct { * nearly universal to all mail messages). */ -static prefix_t BOOLEAN_PREFIX_INTERNAL[] = { - { "type", "T" }, - { "reference", "XREFERENCE" }, - { "replyto", "XREPLYTO" }, - { "directory", "XDIRECTORY" }, - { "file-direntry", "XFDIRENTRY" }, - { "directory-direntry", "XDDIRENTRY" }, -}; - -static prefix_t BOOLEAN_PREFIX_EXTERNAL[] = { - { "thread", "G" }, - { "tag", "K" }, - { "is", "K" }, - { "id", "Q" }, - { "path", "P" }, - { "property", "XPROPERTY" }, +static prefix_t PREFIX[] = { + /* name term prefix flags */ + { "type", "T", 0 }, + { "reference", "XREFERENCE", 0 }, + { "replyto", "XREPLYTO", 0 }, + { "directory", "XDIRECTORY", 0 }, + { "file-direntry", "XFDIRENTRY", 0 }, + { "directory-direntry", "XDDIRENTRY", 0 }, + { "thread", "G", NOTMUCH_FIELD_EXTERNAL }, + { "tag", "K", NOTMUCH_FIELD_EXTERNAL }, + { "is", "K", NOTMUCH_FIELD_EXTERNAL }, + { "id", "Q", NOTMUCH_FIELD_EXTERNAL }, + { "path", "P", NOTMUCH_FIELD_EXTERNAL }, + { "property", "XPROPERTY", NOTMUCH_FIELD_EXTERNAL }, /* * Unconditionally add ':' to reduce potential ambiguity with * overlapping prefixes and/or terms that start with capital * letters. See Xapian document termprefixes.html for related * discussion. */ - { "folder", "XFOLDER:" }, -}; - -static prefix_t PROBABILISTIC_PREFIX[]= { - { "from", "XFROM" }, - { "to", "XTO" }, - { "attachment", "XATTACHMENT" }, - { "mimetype", "XMIMETYPE"}, - { "subject", "XSUBJECT"}, + { "folder", "XFOLDER:", NOTMUCH_FIELD_EXTERNAL }, + { "from", "XFROM", NOTMUCH_FIELD_EXTERNAL | + NOTMUCH_FIELD_PROBABILISTIC }, + { "to", "XTO", NOTMUCH_FIELD_EXTERNAL | + NOTMUCH_FIELD_PROBABILISTIC }, + { "attachment", "XATTACHMENT", NOTMUCH_FIELD_EXTERNAL | + NOTMUCH_FIELD_PROBABILISTIC }, + { "mimetype", "XMIMETYPE", NOTMUCH_FIELD_EXTERNAL | + NOTMUCH_FIELD_PROBABILISTIC }, + { "subject", "XSUBJECT", NOTMUCH_FIELD_EXTERNAL | + NOTMUCH_FIELD_PROBABILISTIC }, }; const char * @@ -285,19 +286,9 @@ _find_prefix (const char *name) { unsigned int i; - for (i = 0; i < ARRAY_SIZE (BOOLEAN_PREFIX_INTERNAL); i++) { - if (strcmp (name, BOOLEAN_PREFIX_INTERNAL[i].name) == 0) - return BOOLEAN_PREFIX_INTERNAL[i].prefix; - } - - for (i = 0; i < ARRAY_SIZE (BOOLEAN_PREFIX_EXTERNAL); i++) { - if (strcmp (name, BOOLEAN_PREFIX_EXTERNAL[i].name) == 0) - return BOOLEAN_PREFIX_EXTERNAL[i].prefix; - } - - for (i = 0; i < ARRAY_SIZE (PROBABILISTIC_PREFIX); i++) { - if (strcmp (name, PROBABILISTIC_PREFIX[i].name) == 0) - return PROBABILISTIC_PREFIX[i].prefix; + for (i = 0; i < ARRAY_SIZE (PREFIX); i++) { + if (strcmp (name, PREFIX[i].name) == 0) + return PREFIX[i].prefix; } INTERNAL_ERROR ("No prefix exists for '%s'\n", name); @@ -1053,15 +1044,16 @@ notmuch_database_open_verbose (const char *path, notmuch->query_parser->add_valuerangeprocessor (notmuch->date_range_processor); notmuch->query_parser->add_valuerangeprocessor (notmuch->last_mod_range_processor); - for (i = 0; i < ARRAY_SIZE (BOOLEAN_PREFIX_EXTERNAL); i++) { - prefix_t *prefix = &BOOLEAN_PREFIX_EXTERNAL[i]; - notmuch->query_parser->add_boolean_prefix (prefix->name, - prefix->prefix); - } - - for (i = 0; i < ARRAY_SIZE (PROBABILISTIC_PREFIX); i++) { - prefix_t *prefix = &PROBABILISTIC_PREFIX[i]; - notmuch->query_parser->add_prefix (prefix->name, prefix->prefix); + for (i = 0; i < ARRAY_SIZE (PREFIX); i++) { + prefix_t *prefix = &PREFIX[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); + } + } } } catch (const Xapian::Error &error) { IGNORE_RESULT (asprintf (&message, "A Xapian exception occurred opening database: %s\n", -- 2.11.0