lib: create field processors from prefix table
authorDavid Bremner <david@tethera.net>
Mon, 27 Feb 2017 02:34:19 +0000 (22:34 -0400)
committerDavid Bremner <david@tethera.net>
Fri, 3 Mar 2017 11:15:13 +0000 (07:15 -0400)
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
lib/database.cc

index 06882439fc580f88b827b6648b267855b7e5abd4..ab3d9691247fdefdee4ec0f370908f0e11b377af 100644 (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;
 
 /*
index ba440d4db87e4608b043167860cc09e911f4aeda..fa4c31167407576f4f4c431ad0330868033381bc 100644 (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) {