Split BOOLEAN_PREFIX into INTERNAL and EXTERNAL subsets.
authorCarl Worth <cworth@cworth.org>
Sun, 25 Oct 2009 05:38:43 +0000 (22:38 -0700)
committerCarl Worth <cworth@cworth.org>
Sun, 25 Oct 2009 05:38:43 +0000 (22:38 -0700)
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

index d513b8552bf12bc1fa7752e3275002977f73acec..5b594c024f3e19b8ee0adad3419dfb4e790514e6 100644 (file)
@@ -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());