[patch v5 6/6] lib: Add regexp searching for mid: prefix

2017-02-16 Thread David Bremner
The bulk of the change is passing in the field options to the regexp
field processor, so that we can properly handle the
fallback (non-regexp case).
---
 lib/database.cc  | 11 +++
 lib/regexp-fields.cc | 28 +---
 lib/regexp-fields.h  |  4 +++-
 3 files changed, 31 insertions(+), 12 deletions(-)

diff --git a/lib/database.cc b/lib/database.cc
index 21c8c5f2..5f02d218 100644
--- a/lib/database.cc
+++ b/lib/database.cc
@@ -262,7 +262,8 @@ prefix_t prefix_table[] = {
 { "tag",   "K",NOTMUCH_FIELD_EXTERNAL },
 { "is","K",NOTMUCH_FIELD_EXTERNAL },
 { "id","Q",NOTMUCH_FIELD_EXTERNAL },
-{ "mid",   "Q",NOTMUCH_FIELD_EXTERNAL },
+{ "mid",   "Q",NOTMUCH_FIELD_EXTERNAL |
+   NOTMUCH_FIELD_PROCESSOR },
 { "path",  "P",NOTMUCH_FIELD_EXTERNAL },
 { "property",  "XPROPERTY",NOTMUCH_FIELD_EXTERNAL },
 /*
@@ -294,16 +295,17 @@ prefix_t prefix_table[] = {
 
 #if HAVE_XAPIAN_FIELD_PROCESSOR
 static Xapian::FieldProcessor *
-_make_field_processor (const char *name, notmuch_database_t *notmuch) {
+_make_field_processor (const char *name, notmuch_field_flag_t options,
+  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 ();
 else
-   return (new RegexpFieldProcessor (name, *notmuch->query_parser, 
notmuch))->release ();
+   return (new RegexpFieldProcessor (name, options, 
*notmuch->query_parser, notmuch))->release ();
 }
 #else
-#define _make_field_processor(name, db) NULL
+#define _make_field_processor(name, options, db) NULL
 #endif
 
 const char *
@@ -1069,6 +1071,7 @@ notmuch_database_open_verbose (const char *path,
if (HAVE_XAPIAN_FIELD_PROCESSOR &&
(prefix->flags & NOTMUCH_FIELD_PROCESSOR)) {
Xapian::FieldProcessor *fp = _make_field_processor 
(prefix->name,
+   
prefix->flags,

notmuch);
 
notmuch->query_parser->add_boolean_prefix (prefix->name, 
fp);
diff --git a/lib/regexp-fields.cc b/lib/regexp-fields.cc
index b2b39504..a32b965e 100644
--- a/lib/regexp-fields.cc
+++ b/lib/regexp-fields.cc
@@ -114,13 +114,21 @@ static inline Xapian::valueno _find_slot (std::string 
prefix)
return NOTMUCH_VALUE_FROM;
 else if (prefix == "subject")
return NOTMUCH_VALUE_SUBJECT;
+else if (prefix == "mid")
+   return NOTMUCH_VALUE_MESSAGE_ID;
 else
throw Xapian::QueryParserError ("unsupported regexp field '" + prefix + 
"'");
 }
 
-RegexpFieldProcessor::RegexpFieldProcessor (std::string prefix, 
Xapian::QueryParser _, notmuch_database_t *notmuch_)
-   : slot (_find_slot (prefix)), term_prefix (_find_prefix (prefix.c_str 
())),
- parser (parser_), notmuch (notmuch_)
+RegexpFieldProcessor::RegexpFieldProcessor (std::string prefix,
+   notmuch_field_flag_t options_,
+   Xapian::QueryParser _,
+   notmuch_database_t *notmuch_)
+   : slot (_find_slot (prefix)),
+ term_prefix (_find_prefix (prefix.c_str ())),
+ options (options_),
+ parser (parser_),
+ notmuch (notmuch_)
 {
 };
 
@@ -135,10 +143,16 @@ RegexpFieldProcessor::operator() (const std::string & str)
throw Xapian::QueryParserError ("unmatch regex delimiter in '" + 
str + "'");
}
 } else {
-   /* TODO replace this with a nicer API level triggering of
-* phrase parsing, when possible */
-   std::string quoted='"' + str + '"';
-   return parser.parse_query (quoted, NOTMUCH_QUERY_PARSER_FLAGS, 
term_prefix);
+   if (options & NOTMUCH_FIELD_PROBABILISTIC) {
+   /* TODO replace this with a nicer API level triggering of
+* phrase parsing, when possible */
+   std::string quoted='"' + str + '"';
+   return parser.parse_query (quoted, NOTMUCH_QUERY_PARSER_FLAGS, 
term_prefix);
+   } else {
+   /* Boolean prefix */
+   std::string term = term_prefix + str;
+   return Xapian::Query (term);
+   }
 }
 }
 #endif
diff --git a/lib/regexp-fields.h b/lib/regexp-fields.h
index bac11999..8a0e72e1 100644
--- a/lib/regexp-fields.h
+++ b/lib/regexp-fields.h
@@ -63,11 +63,13 @@ class RegexpFieldProcessor : public Xapian::FieldProcessor {
  protected:
 Xapian::valueno slot;
 std::string term_prefix;
+int options;
 

[patch v5 3/6] lib: create field processors from prefix table

2017-02-16 Thread David Bremner
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 , _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;
 
 /*
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
+#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 = _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);
+   } 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


[patch v5 1/6] lib: merge internal prefix tables

2017-02-16 Thread David Bremner
Replace multiple tables with some flags in a single table. This makes
the code a bit shorter, and it should also make it easier to add
other options to fields, e.g. regexp searching.
---
 lib/database-private.h | 24 ++
 lib/database.cc| 87 +++---
 2 files changed, 64 insertions(+), 47 deletions(-)

diff --git a/lib/database-private.h b/lib/database-private.h
index ccc1e9a1..67d98570 100644
--- a/lib/database-private.h
+++ b/lib/database-private.h
@@ -148,6 +148,30 @@ operator&=(_notmuch_features , _notmuch_features b)
 return a;
 }
 
+/*
+ * Configuration options for xapian database fields */
+typedef enum notmuch_field_flags {
+NOTMUCH_FIELD_NO_FLAGS = 0,
+NOTMUCH_FIELD_EXTERNAL = 1 << 0,
+NOTMUCH_FIELD_PROBABILISTIC = 1 << 1
+} notmuch_field_flag_t;
+
+/*
+ * define bitwise operators to hide casts */
+inline notmuch_field_flag_t
+operator|(notmuch_field_flag_t a, notmuch_field_flag_t b)
+{
+return static_cast(
+   static_cast(a) | static_cast(b));
+}
+
+inline notmuch_field_flag_t
+operator&(notmuch_field_flag_t a, notmuch_field_flag_t b)
+{
+return static_cast(
+   static_cast(a) & static_cast(b));
+}
+
 #define NOTMUCH_QUERY_PARSER_FLAGS (Xapian::QueryParser::FLAG_BOOLEAN | \
Xapian::QueryParser::FLAG_PHRASE | \
Xapian::QueryParser::FLAG_LOVEHATE | \
diff --git a/lib/database.cc b/lib/database.cc
index 2d19f20c..b954b34c 100644
--- a/lib/database.cc
+++ b/lib/database.cc
@@ -42,6 +42,7 @@ using namespace std;
 typedef struct {
 const char *name;
 const char *prefix;
+notmuch_field_flag_t flags;
 } prefix_t;
 
 #define NOTMUCH_DATABASE_VERSION 3
@@ -247,37 +248,38 @@ typedef struct {
  * nearly universal to all mail messages).
  */
 
-static prefix_t BOOLEAN_PREFIX_INTERNAL[] = {
-{ "type",  "T" },
-{ "reference", "XREFERENCE" },
-{ "replyto",   "XREPLYTO" },
-{ "directory", "XDIRECTORY" },
-{ "file-direntry", "XFDIRENTRY" },
-{ "directory-direntry","XDDIRENTRY" },
-};
-
-static prefix_t BOOLEAN_PREFIX_EXTERNAL[] = {
-{ "thread","G" },
-{ "tag",   "K" },
-{ "is","K" },
-{ "id","Q" },
-{ "path",  "P" },
-{ "property",  "XPROPERTY" },
+static const
+prefix_t prefix_table[] = {
+/* nameterm prefix flags */
+{ "type",  "T",NOTMUCH_FIELD_NO_FLAGS },
+{ "reference", "XREFERENCE",   NOTMUCH_FIELD_NO_FLAGS },
+{ "replyto",   "XREPLYTO", NOTMUCH_FIELD_NO_FLAGS },
+{ "directory", "XDIRECTORY",   NOTMUCH_FIELD_NO_FLAGS },
+{ "file-direntry", "XFDIRENTRY",   NOTMUCH_FIELD_NO_FLAGS },
+{ "directory-direntry","XDDIRENTRY",   NOTMUCH_FIELD_NO_FLAGS },
+{ "thread","G",NOTMUCH_FIELD_EXTERNAL 
},
+{ "tag",   "K",NOTMUCH_FIELD_EXTERNAL },
+{ "is","K",NOTMUCH_FIELD_EXTERNAL },
+{ "id","Q",NOTMUCH_FIELD_EXTERNAL },
+{ "path",  "P",NOTMUCH_FIELD_EXTERNAL },
+{ "property",  "XPROPERTY",NOTMUCH_FIELD_EXTERNAL },
 /*
  * Unconditionally add ':' to reduce potential ambiguity with
  * overlapping prefixes and/or terms that start with capital
  * letters. See Xapian document termprefixes.html for related
  * discussion.
  */
-{ "folder","XFOLDER:" },
-};
-
-static prefix_t PROBABILISTIC_PREFIX[]= {
-{ "from",  "XFROM" },
-{ "to","XTO" },
-{ "attachment","XATTACHMENT" },
-{ "mimetype",  "XMIMETYPE"},
-{ "subject",   "XSUBJECT"},
+{ "folder","XFOLDER:", NOTMUCH_FIELD_EXTERNAL 
},
+{ "from",  "XFROM",NOTMUCH_FIELD_EXTERNAL |
+   NOTMUCH_FIELD_PROBABILISTIC },
+{ "to","XTO",  NOTMUCH_FIELD_EXTERNAL |
+   NOTMUCH_FIELD_PROBABILISTIC },
+{ "attachment","XATTACHMENT",  NOTMUCH_FIELD_EXTERNAL |
+   NOTMUCH_FIELD_PROBABILISTIC },
+{ "mimetype",  "XMIMETYPE",NOTMUCH_FIELD_EXTERNAL |
+   NOTMUCH_FIELD_PROBABILISTIC },
+{ "subject",   "XSUBJECT", NOTMUCH_FIELD_EXTERNAL |
+   NOTMUCH_FIELD_PROBABILISTIC },
 };
 
 const char *
@@ -285,19 +287,9 @@ _find_prefix (const char *name)
 {
 unsigned int i;
 
-for (i = 0; i < 

[patch v5 4/6] lib: regexp matching in 'subject' and 'from'

2017-02-16 Thread David Bremner
the idea is that you can run

% notmuch search subject://
% notmuch search from://

or

% notmuch search subject:"your usual phrase search"
% notmuch search from:"usual phrase search"

This feature is only available with recent Xapian, specifically
support for field processors is needed.

It should work with bindings, since it extends the query parser.

This is easy to extend for other value slots, but currently the only
value slots are date, message_id, from, subject, and last_mod. Date is
already searchable;  message_id is left for a followup commit.

This was originally written by Austin Clements, and ported to Xapian
field processors (from Austin's custom query parser) by yours truly.
---
 doc/man7/notmuch-search-terms.rst |  25 ++-
 lib/Makefile.local|   1 +
 lib/database.cc   |  11 +--
 lib/regexp-fields.cc  | 144 ++
 lib/regexp-fields.h   |  77 
 test/T630-regexp-query.sh |  81 +
 6 files changed, 332 insertions(+), 7 deletions(-)
 create mode 100644 lib/regexp-fields.cc
 create mode 100644 lib/regexp-fields.h
 create mode 100755 test/T630-regexp-query.sh

diff --git a/doc/man7/notmuch-search-terms.rst 
b/doc/man7/notmuch-search-terms.rst
index de93d733..47cab48d 100644
--- a/doc/man7/notmuch-search-terms.rst
+++ b/doc/man7/notmuch-search-terms.rst
@@ -34,10 +34,14 @@ indicate user-supplied values):
 
 -  from:
 
+-  from://
+
 -  to:
 
 -  subject:
 
+-  subject://
+
 -  attachment:
 
 -  mimetype:
@@ -71,6 +75,15 @@ subject of an email. Searching for a phrase in the subject 
is supported
 by including quotation marks around the phrase, immediately following
 **subject:**.
 
+If notmuch is built with **Xapian Field Processors** (see below) the
+**from:** and **subject** prefix can be also used to restrict the
+results to those whose from/subject value matches a regular expression
+(see **regex(7)**) delimited with //.
+
+::
+
+   notmuch search 'from:/bob@.*[.]example[.]com/'
+
 The **attachment:** prefix can be used to search for specific filenames
 (or extensions) of attachments to email messages.
 
@@ -220,13 +233,18 @@ Boolean and Probabilistic Prefixes
 --
 
 Xapian (and hence notmuch) prefixes are either **boolean**, supporting
-exact matches like "tag:inbox"  or **probabilistic**, supporting a more 
flexible **term** based searching. The prefixes currently supported by notmuch 
are as follows.
-
+exact matches like "tag:inbox" or **probabilistic**, supporting a more
+flexible **term** based searching. Certain **special** prefixes are
+processed by notmuch in a way not stricly fitting either of Xapian's
+built in styles. The prefixes currently supported by notmuch are as
+follows.
 
 Boolean
**tag:**, **id:**, **thread:**, **folder:**, **path:**, **property:**
 Probabilistic
-   **from:**, **to:**, **subject:**, **attachment:**, **mimetype:**
+  **to:**, **attachment:**, **mimetype:**
+Special
+   **from:**, **query:**, **subject:**
 
 Terms and phrases
 -
@@ -396,6 +414,7 @@ Currently the following features require field processor 
support:
 
 - non-range date queries, e.g. "date:today"
 - named queries e.g. "query:my_special_query"
+- regular expression searches, e.g. "subject:/^\\[SPAM\\]/"
 
 SEE ALSO
 
diff --git a/lib/Makefile.local b/lib/Makefile.local
index b77e5780..cd92fc79 100644
--- a/lib/Makefile.local
+++ b/lib/Makefile.local
@@ -52,6 +52,7 @@ libnotmuch_cxx_srcs = \
$(dir)/query.cc \
$(dir)/query-fp.cc  \
$(dir)/config.cc\
+   $(dir)/regexp-fields.cc \
$(dir)/thread.cc
 
 libnotmuch_modules := $(libnotmuch_c_srcs:.c=.o) $(libnotmuch_cxx_srcs:.cc=.o)
diff --git a/lib/database.cc b/lib/database.cc
index 450ee295..ee971f32 100644
--- a/lib/database.cc
+++ b/lib/database.cc
@@ -21,6 +21,7 @@
 #include "database-private.h"
 #include "parse-time-vrp.h"
 #include "query-fp.h"
+#include "regexp-fields.h"
 #include "string-util.h"
 
 #include 
@@ -277,7 +278,8 @@ prefix_t prefix_table[] = {
NOTMUCH_FIELD_PROCESSOR },
 #endif
 { "from",  "XFROM",NOTMUCH_FIELD_EXTERNAL |
-   NOTMUCH_FIELD_PROBABILISTIC },
+   NOTMUCH_FIELD_PROBABILISTIC |
+   NOTMUCH_FIELD_PROCESSOR },
 { "to","XTO",  NOTMUCH_FIELD_EXTERNAL |
NOTMUCH_FIELD_PROBABILISTIC },
 { "attachment","XATTACHMENT",  NOTMUCH_FIELD_EXTERNAL |
@@ -285,7 +287,8 @@ prefix_t prefix_table[] = {
 { "mimetype",  "XMIMETYPE",NOTMUCH_FIELD_EXTERNAL |
NOTMUCH_FIELD_PROBABILISTIC },
 { "subject",   

[patch v5 2/6] lib: Let Xapian manage the memory for FieldProcessors

2017-02-16 Thread David Bremner
It turns out this is exactly what release() is for; Xapian will
deallocate the objects when it's done with them.
---
 lib/database-private.h |  4 
 lib/database.cc| 19 ---
 2 files changed, 8 insertions(+), 15 deletions(-)

diff --git a/lib/database-private.h b/lib/database-private.h
index 67d98570..2fb60f5e 100644
--- a/lib/database-private.h
+++ b/lib/database-private.h
@@ -211,10 +211,6 @@ struct _notmuch_database {
 Xapian::TermGenerator *term_gen;
 Xapian::ValueRangeProcessor *value_range_processor;
 Xapian::ValueRangeProcessor *date_range_processor;
-#if HAVE_XAPIAN_FIELD_PROCESSOR
-Xapian::FieldProcessor *date_field_processor;
-Xapian::FieldProcessor *query_field_processor;
-#endif
 Xapian::ValueRangeProcessor *last_mod_range_processor;
 };
 
diff --git a/lib/database.cc b/lib/database.cc
index b954b34c..8016c4df 100644
--- a/lib/database.cc
+++ b/lib/database.cc
@@ -1030,10 +1030,14 @@ notmuch_database_open_verbose (const char *path,
 #if HAVE_XAPIAN_FIELD_PROCESSOR
/* This currently relies on the query parser to pass anything
 * with a .. to the range processor */
-   notmuch->date_field_processor = new DateFieldProcessor();
-   notmuch->query_parser->add_boolean_prefix("date", 
notmuch->date_field_processor);
-   notmuch->query_field_processor = new QueryFieldProcessor 
(*notmuch->query_parser, notmuch);
-   notmuch->query_parser->add_boolean_prefix("query", 
notmuch->query_field_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:");
 
@@ -1126,13 +1130,6 @@ notmuch_database_close (notmuch_database_t *notmuch)
 delete notmuch->last_mod_range_processor;
 notmuch->last_mod_range_processor = NULL;
 
-#if HAVE_XAPIAN_FIELD_PROCESSOR
-delete notmuch->date_field_processor;
-notmuch->date_field_processor = NULL;
-delete notmuch->query_field_processor;
-notmuch->query_field_processor = NULL;
-#endif
-
 return status;
 }
 
-- 
2.11.0

___
notmuch mailing list
notmuch@notmuchmail.org
https://notmuchmail.org/mailman/listinfo/notmuch


[patch v5 5/6] lib: add mid: as a synonym for id:

2017-02-16 Thread David Bremner
mid: is the url scheme suggested by URL 2392. We also plan to
introduce more flexible searches for mid: than are possible with
id: (in order not to break assumptions about the special behaviour of
id:, e.g. identifying at most one message).
---
 lib/database.cc | 1 +
 test/T080-search.sh | 6 ++
 2 files changed, 7 insertions(+)

diff --git a/lib/database.cc b/lib/database.cc
index ee971f32..21c8c5f2 100644
--- a/lib/database.cc
+++ b/lib/database.cc
@@ -262,6 +262,7 @@ prefix_t prefix_table[] = {
 { "tag",   "K",NOTMUCH_FIELD_EXTERNAL },
 { "is","K",NOTMUCH_FIELD_EXTERNAL },
 { "id","Q",NOTMUCH_FIELD_EXTERNAL },
+{ "mid",   "Q",NOTMUCH_FIELD_EXTERNAL },
 { "path",  "P",NOTMUCH_FIELD_EXTERNAL },
 { "property",  "XPROPERTY",NOTMUCH_FIELD_EXTERNAL },
 /*
diff --git a/test/T080-search.sh b/test/T080-search.sh
index 5e8b20ce..6149da93 100755
--- a/test/T080-search.sh
+++ b/test/T080-search.sh
@@ -34,6 +34,11 @@ add_message '[subject]="search by id"' '[date]="Sat, 01 Jan 
2000 12:00:00 -"
 output=$(notmuch search id:${gen_msg_id} | notmuch_search_sanitize)
 test_expect_equal "$output" "thread:XXX   2000-01-01 [1/1] Notmuch Test Suite; 
search by id (inbox unread)"
 
+test_begin_subtest "Search by mid:"
+add_message '[subject]="search by mid"' '[date]="Sat, 01 Jan 2000 12:00:00 
-"'
+output=$(notmuch search mid:${gen_msg_id} | notmuch_search_sanitize)
+test_expect_equal "$output" "thread:XXX   2000-01-01 [1/1] Notmuch Test Suite; 
search by mid (inbox unread)"
+
 test_begin_subtest "Search by tag:"
 add_message '[subject]="search by tag"' '[date]="Sat, 01 Jan 2000 12:00:00 
-"'
 notmuch tag +searchbytag id:${gen_msg_id}
@@ -127,6 +132,7 @@ thread:XXX   2000-01-01 [1/1] Notmuch Test Suite; search by 
to (inbox unread)
 thread:XXX   2000-01-01 [1/1] Notmuch Test Suite; subjectsearchtest (inbox 
unread)
 thread:XXX   2000-01-01 [1/1] Notmuch Test Suite; utf8-sübjéct (inbox unread)
 thread:XXX   2000-01-01 [1/1] Notmuch Test Suite; search by id (inbox unread)
+thread:XXX   2000-01-01 [1/1] Notmuch Test Suite; search by mid (inbox unread)
 thread:XXX   2000-01-01 [1/1] Notmuch Test Suite; search by tag (inbox 
searchbytag unread)
 thread:XXX   2000-01-01 [1/1] Notmuch Test Suite; search by thread (inbox 
unread)
 thread:XXX   2000-01-01 [1/1] Notmuch Test Suite; body search (phrase) (inbox 
unread)
-- 
2.11.0

___
notmuch mailing list
notmuch@notmuchmail.org
https://notmuchmail.org/mailman/listinfo/notmuch


v5 of regexp searching

2017-02-16 Thread David Bremner

The first 3 patches are general cleanup of the way that the query parser is 
configured.

[patch v5 1/6] lib: merge internal prefix tables
[patch v5 2/6] lib: Let Xapian manage the memory for FieldProcessors
[patch v5 3/6] lib: create field processors from prefix table

This is id:20170121135917.22062-1-da...@tethera.net, revised with
Tomi's comments, and error handling for missing trailing
delimiter. For the moment missing initial delimiter is ignored for
future compatibility with paths.

[patch v5 4/6] lib: regexp matching in 'subject' and 'from'

The next two are RFC. We discussed several options for dealing with
the fact that / is a valid message-id character. Here the idea is to
used a separate prefix mid: for potential regexp searches. Jani had
previously suggested trying both the regexp and non-regexp form of the
query. That might be a more DWIM ui, but it would have the potentially
surprising side effect of having id: match more than one message.

The first four patches can be merge earlier, if we want to continue
thinking about this UI (or just drop the last two patches).  Also, the
id case needs doc and tests.

[patch v5 5/6] lib: add mid: as a synonym for id:
[patch v5 6/6] lib: Add regexp searching for mid: prefix
___
notmuch mailing list
notmuch@notmuchmail.org
https://notmuchmail.org/mailman/listinfo/notmuch


Re: notmuch version/Python bindings

2017-02-16 Thread Sebastian Spaeth
Hi there, I did stop using notmuch, true. Let me know if I should hand over 
administration or if I shouldnsimply delete the package on pypi.

Sebastian
-- 
Sent from my mobile phone. Please excuse brevity.

Am 16. Februar 2017 18:00:33 MEZ schrieb David Bremner :
>Aryeh Leib Taurog  writes:
>
>> Okay, makes sense.  Might I suggest a new release on pypi, then?
>
>I think Sebastian (listed as the pypi maintainer) somewhat lost
>interest
>in notmuch (since that version is 4 years old). I'm afraid I don't know
>anything about pypi, but I assume if someone else wanted to take over
>maintaining it, they should coordinate with Sebastian (in CC).
>
>d
___
notmuch mailing list
notmuch@notmuchmail.org
https://notmuchmail.org/mailman/listinfo/notmuch


Re: notmuch version/Python bindings

2017-02-16 Thread David Bremner
Aryeh Leib Taurog  writes:

> Okay, makes sense.  Might I suggest a new release on pypi, then?

I think Sebastian (listed as the pypi maintainer) somewhat lost interest
in notmuch (since that version is 4 years old). I'm afraid I don't know
anything about pypi, but I assume if someone else wanted to take over
maintaining it, they should coordinate with Sebastian (in CC).

d
___
notmuch mailing list
notmuch@notmuchmail.org
https://notmuchmail.org/mailman/listinfo/notmuch


Re: notmuch version/Python bindings

2017-02-16 Thread Aryeh Leib Taurog
Okay, makes sense.  Might I suggest a new release on pypi, then?


On Thu, Feb 16, 2017 at 10:24:16AM -0400, David Bremner wrote:
> Aryeh Leib Taurog  writes:
> 
> > The latest notmuch includes libnotmuch.so.4.4.0 but the latest python 
> > bindings wrap libnotmuch.so.3 so importing from notmuch results in the 
> > following error:
> >
> >   File 
> > "/home/altaurog/venv/offlineimap/lib/python2.7/site-packages/notmuch/__init__.py",
> >  line 54, in 
> > from .database import Database
> >   File 
> > "/home/altaurog/venv/offlineimap/lib/python2.7/site-packages/notmuch/database.py",
> >  line 24, in 
> > from .globals import (
> >   File 
> > "/home/altaurog/venv/offlineimap/lib/python2.7/site-packages/notmuch/globals.py",
> >  line 27, in 
> > raise ImportError("Could not find shared 'notmuch' library.")
> > ImportError: Could not find shared 'notmuch' library.
> >
> > I changed it to libnotmuch.so.4 in globals.py and it seems to work.  
> > Is that reasonable or should I expect problems?
> 
> I'd say you should get your python bindings from the same place you get
> libnotmuch. In the latest released source (and in git master), the
> SOVERSION in version.py matches, and globals.py uses that.
> 
> d
___
notmuch mailing list
notmuch@notmuchmail.org
https://notmuchmail.org/mailman/listinfo/notmuch


Re: notmuch version/Python bindings

2017-02-16 Thread David Bremner
Aryeh Leib Taurog  writes:

> The latest notmuch includes libnotmuch.so.4.4.0 but the latest python 
> bindings wrap libnotmuch.so.3 so importing from notmuch results in the 
> following error:
>
>   File 
> "/home/altaurog/venv/offlineimap/lib/python2.7/site-packages/notmuch/__init__.py",
>  line 54, in 
> from .database import Database
>   File 
> "/home/altaurog/venv/offlineimap/lib/python2.7/site-packages/notmuch/database.py",
>  line 24, in 
> from .globals import (
>   File 
> "/home/altaurog/venv/offlineimap/lib/python2.7/site-packages/notmuch/globals.py",
>  line 27, in 
> raise ImportError("Could not find shared 'notmuch' library.")
> ImportError: Could not find shared 'notmuch' library.
>
> I changed it to libnotmuch.so.4 in globals.py and it seems to work.  
> Is that reasonable or should I expect problems?

I'd say you should get your python bindings from the same place you get
libnotmuch. In the latest released source (and in git master), the
SOVERSION in version.py matches, and globals.py uses that.

d
___
notmuch mailing list
notmuch@notmuchmail.org
https://notmuchmail.org/mailman/listinfo/notmuch


notmuch version/Python bindings

2017-02-16 Thread Aryeh Leib Taurog
The latest notmuch includes libnotmuch.so.4.4.0 but the latest python 
bindings wrap libnotmuch.so.3 so importing from notmuch results in the 
following error:

  File 
"/home/altaurog/venv/offlineimap/lib/python2.7/site-packages/notmuch/__init__.py",
 line 54, in 
from .database import Database
  File 
"/home/altaurog/venv/offlineimap/lib/python2.7/site-packages/notmuch/database.py",
 line 24, in 
from .globals import (
  File 
"/home/altaurog/venv/offlineimap/lib/python2.7/site-packages/notmuch/globals.py",
 line 27, in 
raise ImportError("Could not find shared 'notmuch' library.")
ImportError: Could not find shared 'notmuch' library.

I changed it to libnotmuch.so.4 in globals.py and it seems to work.  
Is that reasonable or should I expect problems?
___
notmuch mailing list
notmuch@notmuchmail.org
https://notmuchmail.org/mailman/listinfo/notmuch