On Thu, 16 Feb 2017, David Bremner <david@tethera.net> wrote: > This is a bit more code than hardcoding the two existing field > processors, but it should make it easy to add more. > --- > lib/database-private.h | 3 ++- > lib/database.cc | 45 +++++++++++++++++++++++++++++++-------------- > 2 files changed, 33 insertions(+), 15 deletions(-) > > diff --git a/lib/database-private.h b/lib/database-private.h > index 2fb60f5e..60d1fead 100644 > --- a/lib/database-private.h > +++ b/lib/database-private.h > @@ -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 Nitpick, if you add a comma at the end, subsequent changes will have smaller diff. > } notmuch_field_flag_t; > > /* > diff --git a/lib/database.cc b/lib/database.cc > index 8016c4df..450ee295 100644 > --- a/lib/database.cc > +++ b/lib/database.cc > @@ -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,20 @@ prefix_t prefix_table[] = { > NOTMUCH_FIELD_PROBABILISTIC }, > }; > > +#if HAVE_XAPIAN_FIELD_PROCESSOR > +static Xapian::FieldProcessor * > +_make_field_processor (const char *name, notmuch_database_t *notmuch) { > + if (STRNCMP_LITERAL (name, "date") == 0) > + return (new DateFieldProcessor())->release (); > + else if (STRNCMP_LITERAL(name, "query") == 0) > + return (new QueryFieldProcessor (*notmuch->query_parser, notmuch))->release (); > + > + INTERNAL_ERROR ("no field processor for prefix '%s'\n", name); > +} > +#else > +#define _make_field_processor(name, db) NULL Nitpick, if you make this a proper static inline function that just returns NULL, you'll get type checking but the end result will be the same. > +#endif > + > const char * > _find_prefix (const char *name) > { > @@ -1027,18 +1047,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); > @@ -1052,8 +1060,17 @@ 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); > + /* we treat all field-processor fields as boolean in order > + to get the raw input */ > + if (HAVE_XAPIAN_FIELD_PROCESSOR && > + (prefix->flags & NOTMUCH_FIELD_PROCESSOR)) { > + Xapian::FieldProcessor *fp = _make_field_processor (prefix->name, > + notmuch); > + > + notmuch->query_parser->add_boolean_prefix (prefix->name, fp); Are you sure this builds for HAVE_XAPIAN_FIELD_PROCESSOR=0? I think this assumes the compiler eliminates the dead code before actually compiling it. Xapian::FieldProcessor is not there for older Xapian, is it? I strongly prefer having conditionally compilation at the function level (like _make_field_processor) but I think you'll need to move everything from this if block in that function. I admit it's not the prettiest thing when the other ->add_prefix calls are at this level. > + } else 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); > -- > 2.11.0 > > _______________________________________________ > notmuch mailing list > notmuch@notmuchmail.org > https://notmuchmail.org/mailman/listinfo/notmuch