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.
const char *prefix;
} prefix_t;
const char *prefix;
} prefix_t;
-prefix_t BOOLEAN_PREFIX[] = {
+prefix_t BOOLEAN_PREFIX_INTERNAL[] = {
- { "tag", "L" },
- { "id", "Q" },
{ "thread", "H" },
{ "ref", "R" },
{ "timestamp", "KTS" },
};
{ "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;
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);
fprintf (stderr, "Internal error: No prefix exists for '%s'\n", name);
exit (1);
struct stat st;
int err;
char *local_path = NULL;
struct stat st;
int err;
char *local_path = NULL;
if (path == NULL)
path = local_path = notmuch_database_default_path ();
if (path == NULL)
path = local_path = notmuch_database_default_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 = 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());
} catch (const Xapian::Error &error) {
fprintf (stderr, "A Xapian exception occurred: %s\n",
error.get_msg().c_str());