From 0aa355cc8fb46ae049052a913c2f2ab89ccba23c Mon Sep 17 00:00:00 2001 From: Carl Worth Date: Sat, 24 Oct 2009 22:38:43 -0700 Subject: [PATCH] Split BOOLEAN_PREFIX into INTERNAL and EXTERNAL subsets. The idea here is that only some of the prefix names (such as "id" and "tag") actually make sense in external user-supplied query strings. Other things like "type" are internal implementation details of how we store things in the database. So internal machinery will add those terms to the database and we don't need to support them in the string itself. With this, we can now simply loop over the external prefix values to let the quiery parser know about them. So as we add prefixes in the future, we'll only need to add them to this list. --- database.cc | 29 ++++++++++++++++++++--------- 1 file changed, 20 insertions(+), 9 deletions(-) diff --git a/database.cc b/database.cc index d513b855..5b594c02 100644 --- a/database.cc +++ b/database.cc @@ -41,23 +41,30 @@ typedef struct { const char *prefix; } prefix_t; -prefix_t BOOLEAN_PREFIX[] = { +prefix_t BOOLEAN_PREFIX_INTERNAL[] = { { "type", "K" }, - { "tag", "L" }, - { "id", "Q" }, { "thread", "H" }, { "ref", "R" }, { "timestamp", "KTS" }, }; +prefix_t BOOLEAN_PREFIX_EXTERNAL[] = { + { "tag", "L" }, + { "id", "Q" } +}; + const char * _find_prefix (const char *name) { unsigned int i; - for (i = 0; i < ARRAY_SIZE (BOOLEAN_PREFIX); i++) - if (strcmp (name, BOOLEAN_PREFIX[i].name) == 0) - return BOOLEAN_PREFIX[i].prefix; + 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; fprintf (stderr, "Internal error: No prefix exists for '%s'\n", name); exit (1); @@ -469,6 +476,7 @@ notmuch_database_open (const char *path) struct stat st; int err; char *local_path = NULL; + unsigned int i; if (path == NULL) path = local_path = notmuch_database_default_path (); @@ -493,9 +501,12 @@ notmuch_database_open (const char *path) notmuch->query_parser = new Xapian::QueryParser; notmuch->query_parser->set_default_op (Xapian::Query::OP_AND); notmuch->query_parser->set_database (*notmuch->xapian_db); - notmuch->query_parser->add_boolean_prefix ("id", _find_prefix ("id")); - notmuch->query_parser->add_boolean_prefix ("tag", _find_prefix ("tag")); - notmuch->query_parser->add_boolean_prefix ("type", _find_prefix ("type")); + + 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); + } } catch (const Xapian::Error &error) { fprintf (stderr, "A Xapian exception occurred: %s\n", error.get_msg().c_str()); -- 2.26.2