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
}
}
+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")
Xapian::Query
RegexpFieldProcessor::operator() (const std::string & str)
{
+ if (str.size () == 0)
+ return Xapian::Query(Xapian::Query::OP_AND_NOT,
+ Xapian::Query::MatchAll,
+ Xapian::Query (Xapian::Query::OP_WILDCARD, term_prefix));
+
if (str.at (0) == '/') {
if (str.at (str.size () - 1) == '/'){
RegexpPostingSource *postings = new RegexpPostingSource (slot, str.substr(1,str.size () - 2));
} 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