Gmail-compatible date search operators, where the date must be specified as yyyy/mm/dd. This is just a start; it would be great to support fancier date syntax and, in particular, relative date specifications. --- lib/database.cc | 50 ++++++++++++++++++++++++++++++++++++++++++++++++++ 1 files changed, 50 insertions(+), 0 deletions(-)
diff --git a/lib/database.cc b/lib/database.cc index 20fd412..cb02220 100644 --- a/lib/database.cc +++ b/lib/database.cc @@ -633,6 +633,49 @@ transform_folder (_notmuch_token_t *root, void *opaque) return root; } +static _notmuch_token_t * +transform_date (_notmuch_token_t *root, void *opaque) +{ + if (!root) + return NULL; + if (root->type == TOK_PREFIX) { + int after = (strcmp (root->text, "after") == 0); + int before = (strcmp (root->text, "before") == 0); + if (after || before) { + _notmuch_token_t *tok = root->left; + struct tm t; + time_t time_value; + char *end, *serialzed; + + /* Parse the date */ + assert (tok && tok->type == TOK_LIT); + memset(&t, 0, sizeof(t)); + end = strptime (tok->text, "%Y/%m/%d", &t); + time_value = mktime(&t); + if (!end || *end || time_value == -1) { + char *msg = talloc_asprintf (root, "Invalid date \"%s\"", + tok->text); + return _notmuch_token_create_term (root, TOK_ERROR, msg); + } + + /* Construct the date query */ + tok = _notmuch_token_create_term (root, TOK_RANGE, NULL); + tok->valueno = NOTMUCH_VALUE_TIMESTAMP; + serialzed = talloc_strdup + (tok, Xapian::sortable_serialise (time_value).c_str ()); + if (after) + tok->rangeBegin = serialzed; + else + tok->rangeEnd = serialzed; + return tok; + } + } + + root->left = transform_date (root->left, opaque); + root->right = transform_date (root->right, opaque); + return root; +} + notmuch_database_t * notmuch_database_open (const char *path, notmuch_database_mode_t mode) @@ -746,6 +789,13 @@ notmuch_database_open (const char *path, TRUE, TRUE); _notmuch_qparser_add_transform (notmuch->query_parser, transform_folder, notmuch); + + _notmuch_qparser_add_prefix (notmuch->query_parser, "after", + TRUE, TRUE); + _notmuch_qparser_add_prefix (notmuch->query_parser, "before", + TRUE, TRUE); + _notmuch_qparser_add_transform (notmuch->query_parser, + transform_date, NULL); } catch (const Xapian::Error &error) { fprintf (stderr, "A Xapian exception occurred opening database: %s\n", error.get_msg().c_str()); -- 1.7.2.3 _______________________________________________ notmuch mailing list notmuch@notmuchmail.org http://notmuchmail.org/mailman/listinfo/notmuch