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.
This commit is contained in:
Carl Worth 2009-10-24 22:38:43 -07:00
parent 2a9b4fce7c
commit 0aa355cc8f

View 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());