X-Git-Url: https://git.notmuchmail.org/git?p=notmuch;a=blobdiff_plain;f=lib%2Fregexp-fields.cc;h=9dcf973263743ea01721bf139569cafa17577943;hp=b41747502e1e6b8bbea31044e583e10b75a155a3;hb=d877240f4e097eb3dd477409a24155c10e0b3c17;hpb=f3edc5dc86a2d819ae92998ccfc5ac507dbbc5b0 diff --git a/lib/regexp-fields.cc b/lib/regexp-fields.cc index b4174750..9dcf9732 100644 --- a/lib/regexp-fields.cc +++ b/lib/regexp-fields.cc @@ -62,11 +62,6 @@ RegexpPostingSource::init (const Xapian::Database &db) it_ = db_.valuestream_begin (slot_); end_ = db.valuestream_end (slot_); started_ = false; - - /* make sure we start on a matching value */ - while (!at_end() && regexec (®exp_, (*it_).c_str (), 0, NULL, 0) != 0) { - ++it_; - } } Xapian::doccount @@ -113,6 +108,27 @@ RegexpPostingSource::next (unused (double min_wt)) } } +void +RegexpPostingSource::skip_to (Xapian::docid did, unused (double min_wt)) +{ + started_ = true; + it_.skip_to (did); + for (; ! at_end (); ++it_) { + std::string value = *it_; + if (regexec (®exp_, value.c_str (), 0, NULL, 0) == 0) + break; + } +} + +bool +RegexpPostingSource::check (Xapian::docid did, unused (double min_wt)) +{ + started_ = true; + if (!it_.check (did) || at_end ()) + return false; + return (regexec (®exp_, (*it_).c_str (), 0, NULL, 0) == 0); +} + static inline Xapian::valueno _find_slot (std::string prefix) { if (prefix == "from") @@ -142,8 +158,14 @@ RegexpFieldProcessor::operator() (const std::string & 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); + std::string query_str; + + if (str.find (' ') != std::string::npos) + query_str = '"' + str + '"'; + else + query_str = str; + + return parser.parse_query (query_str, NOTMUCH_QUERY_PARSER_FLAGS, term_prefix); } } #endif