lib: add support for date:<expr>..! to mean date:<expr>..<expr>

It doesn't seem likely we can support simple date:<expr> expanding to
date:<expr>..<expr> any time soon. (This can be done with a future
version of Xapian, or with a custom query query parser.) In the mean
time, provide shorthand date:<expr>..! to mean the same. This is
useful, as the expansion takes place before interpetation, and we can
use, for example, date:yesterday..! to match from beginning of
yesterday to end of yesterday.

Idea from Mark Walters <markwalters1009@gmail.com>.
This commit is contained in:
Jani Nikula 2015-08-15 14:25:47 +03:00 committed by David Bremner
parent 3cf7ed26c0
commit 23b8ed610a
3 changed files with 16 additions and 5 deletions

View file

@ -278,6 +278,13 @@ In this case, <since> is taken as the earliest time it could describe
could describe (the end of yesterday). Similarly, date:january..february could describe (the end of yesterday). Similarly, date:january..february
matches from the beginning of January to the end of February. matches from the beginning of January to the end of February.
date:<expr>..! can be used as a shorthand for date:<expr>..<expr>. The
expansion takes place before interpretation, and thus, for example,
date:monday..! matches from the beginning of Monday until the end of
Monday. (Note that entering date:<expr> without "..", for example
date:yesterday, won't work, as it's not interpreted as a range
expression at all. Again, use date:yesterday..!)
Currently, we do not support spaces in range expressions. You can Currently, we do not support spaces in range expressions. You can
replace the spaces with '\_', or (in most cases) '-', or (in some cases) replace the spaces with '\_', or (in most cases) '-', or (in some cases)
leave the spaces out altogether. Examples in this man page use spaces leave the spaces out altogether. Examples in this man page use spaces
@ -288,11 +295,6 @@ to specify date:..<until> or date:<since>.. to not limit the start or
end time, respectively. Pre-1.2.1 Xapian does not report an error on end time, respectively. Pre-1.2.1 Xapian does not report an error on
open ended ranges, but it does not work as expected either. open ended ranges, but it does not work as expected either.
Entering date:expr without ".." (for example date:yesterday) won't work,
as it's not interpreted as a range expression at all. You can achieve
the expected result by duplicating the expr both sides of ".." (for
example date:yesterday..yesterday).
Relative date and time Relative date and time
---------------------- ----------------------

View file

@ -31,6 +31,7 @@ Xapian::valueno
ParseTimeValueRangeProcessor::operator() (std::string &begin, std::string &end) ParseTimeValueRangeProcessor::operator() (std::string &begin, std::string &end)
{ {
time_t t, now; time_t t, now;
std::string b;
/* Require date: prefix in start of the range... */ /* Require date: prefix in start of the range... */
if (STRNCMP_LITERAL (begin.c_str (), PREFIX)) if (STRNCMP_LITERAL (begin.c_str (), PREFIX))
@ -38,6 +39,7 @@ ParseTimeValueRangeProcessor::operator() (std::string &begin, std::string &end)
/* ...and remove it. */ /* ...and remove it. */
begin.erase (0, sizeof (PREFIX) - 1); begin.erase (0, sizeof (PREFIX) - 1);
b = begin;
/* Use the same 'now' for begin and end. */ /* Use the same 'now' for begin and end. */
if (time (&now) == (time_t) -1) if (time (&now) == (time_t) -1)
@ -51,6 +53,9 @@ ParseTimeValueRangeProcessor::operator() (std::string &begin, std::string &end)
} }
if (!end.empty ()) { if (!end.empty ()) {
if (end == "!" && ! b.empty ())
end = b;
if (parse_time_string (end.c_str (), &t, &now, PARSE_TIME_ROUND_UP_INCLUSIVE)) if (parse_time_string (end.c_str (), &t, &now, PARSE_TIME_ROUND_UP_INCLUSIVE))
return Xapian::BAD_VALUENO; return Xapian::BAD_VALUENO;

View file

@ -8,6 +8,10 @@ test_begin_subtest "Absolute date range"
output=$(notmuch search date:2010-12-16..12/16/2010 | notmuch_search_sanitize) output=$(notmuch search date:2010-12-16..12/16/2010 | notmuch_search_sanitize)
test_expect_equal "$output" "thread:XXX 2010-12-16 [1/1] Olivier Berger; Essai accentué (inbox unread)" test_expect_equal "$output" "thread:XXX 2010-12-16 [1/1] Olivier Berger; Essai accentué (inbox unread)"
test_begin_subtest "Absolute date range with 'same' operator"
output=$(notmuch search date:2010-12-16..! | notmuch_search_sanitize)
test_expect_equal "$output" "thread:XXX 2010-12-16 [1/1] Olivier Berger; Essai accentué (inbox unread)"
test_begin_subtest "Absolute time range with TZ" test_begin_subtest "Absolute time range with TZ"
notmuch search date:18-Nov-2009_02:19:26-0800..2009-11-18_04:49:52-06:00 | notmuch_search_sanitize > OUTPUT notmuch search date:18-Nov-2009_02:19:26-0800..2009-11-18_04:49:52-06:00 | notmuch_search_sanitize > OUTPUT
cat <<EOF >EXPECTED cat <<EOF >EXPECTED