lib: create field processors from prefix table

This is a bit more code than hardcoding the two existing field
processors, but it should make it easy to add more.
This commit is contained in:
David Bremner 2017-02-26 22:34:19 -04:00
parent 914c4db1f2
commit 31b8ce4558
2 changed files with 46 additions and 19 deletions

View file

@ -153,7 +153,8 @@ operator&=(_notmuch_features &a, _notmuch_features b)
typedef enum notmuch_field_flags {
NOTMUCH_FIELD_NO_FLAGS = 0,
NOTMUCH_FIELD_EXTERNAL = 1 << 0,
NOTMUCH_FIELD_PROBABILISTIC = 1 << 1
NOTMUCH_FIELD_PROBABILISTIC = 1 << 1,
NOTMUCH_FIELD_PROCESSOR = 1 << 2,
} notmuch_field_flag_t;
/*

View file

@ -270,6 +270,12 @@ prefix_t prefix_table[] = {
* discussion.
*/
{ "folder", "XFOLDER:", NOTMUCH_FIELD_EXTERNAL },
#if HAVE_XAPIAN_FIELD_PROCESSOR
{ "date", NULL, NOTMUCH_FIELD_EXTERNAL |
NOTMUCH_FIELD_PROCESSOR },
{ "query", NULL, NOTMUCH_FIELD_EXTERNAL |
NOTMUCH_FIELD_PROCESSOR },
#endif
{ "from", "XFROM", NOTMUCH_FIELD_EXTERNAL |
NOTMUCH_FIELD_PROBABILISTIC },
{ "to", "XTO", NOTMUCH_FIELD_EXTERNAL |
@ -282,6 +288,43 @@ prefix_t prefix_table[] = {
NOTMUCH_FIELD_PROBABILISTIC },
};
static void
_setup_query_field_default (const prefix_t *prefix, notmuch_database_t *notmuch)
{
if (prefix->flags & NOTMUCH_FIELD_PROBABILISTIC)
notmuch->query_parser->add_prefix (prefix->name, prefix->prefix);
else
notmuch->query_parser->add_boolean_prefix (prefix->name, prefix->prefix);
}
#if HAVE_XAPIAN_FIELD_PROCESSOR
static void
_setup_query_field (const prefix_t *prefix, notmuch_database_t *notmuch)
{
if (prefix->flags & NOTMUCH_FIELD_PROCESSOR) {
Xapian::FieldProcessor *fp;
if (STRNCMP_LITERAL (prefix->name, "date") == 0)
fp = (new DateFieldProcessor())->release ();
else if (STRNCMP_LITERAL(prefix->name, "query") == 0)
fp = (new QueryFieldProcessor (*notmuch->query_parser, notmuch))->release ();
else
INTERNAL_ERROR("unsupported field processor prefix: %s\n", prefix->name);
/* we treat all field-processor fields as boolean in order to get the raw input */
notmuch->query_parser->add_boolean_prefix (prefix->name, fp);
} else {
_setup_query_field_default (prefix, notmuch);
}
}
#else
static inline void
_setup_query_field (const prefix_t *prefix, notmuch_database_t *notmuch)
{
_setup_query_field_default (prefix, notmuch);
}
#endif
const char *
_find_prefix (const char *name)
{
@ -1028,18 +1071,6 @@ notmuch_database_open_verbose (const char *path,
notmuch->term_gen->set_stemmer (Xapian::Stem ("english"));
notmuch->value_range_processor = new Xapian::NumberValueRangeProcessor (NOTMUCH_VALUE_TIMESTAMP);
notmuch->date_range_processor = new ParseTimeValueRangeProcessor (NOTMUCH_VALUE_TIMESTAMP);
#if HAVE_XAPIAN_FIELD_PROCESSOR
/* This currently relies on the query parser to pass anything
* with a .. to the range processor */
{
Xapian::FieldProcessor * date_fp = new DateFieldProcessor();
Xapian::FieldProcessor * query_fp =
new QueryFieldProcessor (*notmuch->query_parser, notmuch);
notmuch->query_parser->add_boolean_prefix("date", date_fp->release ());
notmuch->query_parser->add_boolean_prefix("query", query_fp->release ());
}
#endif
notmuch->last_mod_range_processor = new Xapian::NumberValueRangeProcessor (NOTMUCH_VALUE_LAST_MOD, "lastmod:");
notmuch->query_parser->set_default_op (Xapian::Query::OP_AND);
@ -1053,12 +1084,7 @@ notmuch_database_open_verbose (const char *path,
for (i = 0; i < ARRAY_SIZE (prefix_table); i++) {
const prefix_t *prefix = &prefix_table[i];
if (prefix->flags & NOTMUCH_FIELD_EXTERNAL) {
if (prefix->flags & NOTMUCH_FIELD_PROBABILISTIC) {
notmuch->query_parser->add_prefix (prefix->name, prefix->prefix);
} else {
notmuch->query_parser->add_boolean_prefix (prefix->name,
prefix->prefix);
}
_setup_query_field (prefix, notmuch);
}
}
} catch (const Xapian::Error &error) {