lib: setup user headers in query parser

These tests will need to be updated if the Xapian
query print/debug format changes.
This commit is contained in:
David Bremner 2018-11-17 10:08:59 -04:00
parent 4b9c03efc6
commit 575493e785
3 changed files with 60 additions and 0 deletions

View file

@ -322,6 +322,42 @@ _setup_query_field_default (const prefix_t *prefix, notmuch_database_t *notmuch)
notmuch->query_parser->add_boolean_prefix (prefix->name, prefix->prefix); notmuch->query_parser->add_boolean_prefix (prefix->name, prefix->prefix);
} }
const char *
_user_prefix (void *ctx, const char* name)
{
return talloc_asprintf(ctx, "XU%s:", name);
}
static notmuch_status_t
_setup_user_query_fields (notmuch_database_t *notmuch)
{
notmuch_config_list_t *list;
notmuch_status_t status;
status = notmuch_database_get_config_list (notmuch, CONFIG_HEADER_PREFIX, &list);
if (status)
return status;
for (; notmuch_config_list_valid (list); notmuch_config_list_move_to_next (list)) {
prefix_t query_field;
const char *key = notmuch_config_list_key (list)
+ sizeof (CONFIG_HEADER_PREFIX) - 1;
query_field.name = talloc_strdup (notmuch, key);
query_field.prefix = _user_prefix (notmuch, key);
query_field.flags = NOTMUCH_FIELD_PROBABILISTIC
| NOTMUCH_FIELD_EXTERNAL;
_setup_query_field_default (&query_field, notmuch);
}
notmuch_config_list_destroy (list);
return NOTMUCH_STATUS_SUCCESS;
}
#if HAVE_XAPIAN_FIELD_PROCESSOR #if HAVE_XAPIAN_FIELD_PROCESSOR
static void static void
_setup_query_field (const prefix_t *prefix, notmuch_database_t *notmuch) _setup_query_field (const prefix_t *prefix, notmuch_database_t *notmuch)
@ -986,6 +1022,7 @@ notmuch_database_open_verbose (const char *path,
_setup_query_field (prefix, notmuch); _setup_query_field (prefix, notmuch);
} }
} }
status = _setup_user_query_fields (notmuch);
} catch (const Xapian::Error &error) { } catch (const Xapian::Error &error) {
IGNORE_RESULT (asprintf (&message, "A Xapian exception occurred opening database: %s\n", IGNORE_RESULT (asprintf (&message, "A Xapian exception occurred opening database: %s\n",
error.get_msg().c_str())); error.get_msg().c_str()));

View file

@ -676,6 +676,8 @@ struct _notmuch_indexopts {
_notmuch_crypto_t crypto; _notmuch_crypto_t crypto;
}; };
#define CONFIG_HEADER_PREFIX "index.header."
NOTMUCH_END_DECLS NOTMUCH_END_DECLS
#ifdef __cplusplus #ifdef __cplusplus

View file

@ -70,4 +70,25 @@ index.header.Spam=X-Spam
EOF EOF
test_expect_equal_file EXPECTED OUTPUT test_expect_equal_file EXPECTED OUTPUT
test_begin_subtest "parse user prefix"
NOTMUCH_DEBUG_QUERY=t notmuch count 'List:"notmuch"' 2>&1 | grep Tmail >OUTPUT
cat <<EOF > EXPECTED
Query((Tmail AND XUList:notmuch@1))
EOF
test_expect_equal_file EXPECTED OUTPUT
test_begin_subtest "parse user prefix, stemmed"
NOTMUCH_DEBUG_QUERY=t notmuch count 'List:notmuch' 2>&1 | grep Tmail >OUTPUT
cat <<EOF > EXPECTED
Query((Tmail AND ZXUList:notmuch@1))
EOF
test_expect_equal_file EXPECTED OUTPUT
test_begin_subtest "parse user prefix, phrase"
NOTMUCH_DEBUG_QUERY=t notmuch count 'List:notmuchmail.org' 2>&1 | grep Tmail >OUTPUT
cat <<EOF > EXPECTED
Query((Tmail AND (XUList:notmuchmail@1 PHRASE 2 XUList:org@2)))
EOF
test_expect_equal_file EXPECTED OUTPUT
test_done test_done