diff options
| author | David Bremner <david@tethera.net> | 2016-03-22 07:54:44 -0300 |
|---|---|---|
| committer | David Bremner <david@tethera.net> | 2016-05-08 08:17:07 -0300 |
| commit | bbf6069252d31e6693ee99cce8bf4f9fab47e360 (patch) | |
| tree | f70aab9b342674e675ac3c5a3794f33b1b05cfae /lib/parse-time-vrp.cc | |
| parent | 1871be319a28d8bba8b368f6b056d2c8448afcf6 (diff) | |
lib: optionally support single argument date: queries
This relies on the FieldProcessor API, which is only present in xapian
>= 1.3.
Diffstat (limited to 'lib/parse-time-vrp.cc')
| -rw-r--r-- | lib/parse-time-vrp.cc | 21 |
1 files changed, 21 insertions, 0 deletions
diff --git a/lib/parse-time-vrp.cc b/lib/parse-time-vrp.cc index 03804cf5..b15b77c6 100644 --- a/lib/parse-time-vrp.cc +++ b/lib/parse-time-vrp.cc @@ -64,3 +64,24 @@ ParseTimeValueRangeProcessor::operator() (std::string &begin, std::string &end) return valno; } + +#if HAVE_XAPIAN_FIELD_PROCESSOR +/* XXX TODO: is throwing an exception the right thing to do here? */ +Xapian::Query DateFieldProcessor::operator()(const std::string & str) { + time_t from, to, now; + + /* Use the same 'now' for begin and end. */ + if (time (&now) == (time_t) -1) + throw Xapian::QueryParserError("Unable to get current time"); + + if (parse_time_string (str.c_str (), &from, &now, PARSE_TIME_ROUND_DOWN)) + throw Xapian::QueryParserError ("Didn't understand date specification '" + str + "'"); + + if (parse_time_string (str.c_str (), &to, &now, PARSE_TIME_ROUND_UP_INCLUSIVE)) + throw Xapian::QueryParserError ("Didn't understand date specification '" + str + "'"); + + return Xapian::Query(Xapian::Query::OP_AND, + Xapian::Query(Xapian::Query::OP_VALUE_GE, 0, Xapian::sortable_serialise ((double) from)), + Xapian::Query(Xapian::Query::OP_VALUE_LE, 0, Xapian::sortable_serialise ((double) to))); +} +#endif |
