lib/query: factor out _notmuch_query_string_to_xapian_query

When dealing with recursive queries (i.e. thread:{foo}) it turns out
to be useful just to deal with the underlying Xapian objects, and not
wrap them in notmuch objects.
This commit is contained in:
David Bremner 2021-08-24 08:17:31 -07:00
parent c62f3f77a7
commit b3bbaf1bc2
2 changed files with 47 additions and 23 deletions

View file

@ -302,11 +302,18 @@ notmuch_status_t
_notmuch_database_setup_user_query_fields (notmuch_database_t *notmuch);
#if __cplusplus
/* query.cc */
notmuch_status_t
_notmuch_query_string_to_xapian_query (notmuch_database_t *notmuch,
std::string query_string,
Xapian::Query &output,
std::string &msg);
/* parse-sexp.cc */
notmuch_status_t
_notmuch_sexp_string_to_xapian_query (notmuch_database_t *notmuch, const char *querystr,
Xapian::Query &output);
/* regexp-fields.cc */
notmuch_status_t
_notmuch_regexp_to_query (notmuch_database_t *notmuch, Xapian::valueno slot, std::string field,
std::string regexp_str,

View file

@ -178,35 +178,52 @@ _notmuch_query_cache_terms (notmuch_query_t *query)
query->terms.insert (*t);
}
notmuch_status_t
_notmuch_query_string_to_xapian_query (notmuch_database_t *notmuch,
std::string query_string,
Xapian::Query &output,
std::string &msg)
{
try {
if (query_string == "" || query_string == "*") {
output = Xapian::Query::MatchAll;
} else {
output =
notmuch->query_parser->
parse_query (query_string, NOTMUCH_QUERY_PARSER_FLAGS);
}
} catch (const Xapian::Error &error) {
if (! notmuch->exception_reported) {
_notmuch_database_log (notmuch,
"A Xapian exception occurred parsing query: %s\n",
error.get_msg ().c_str ());
_notmuch_database_log_append (notmuch,
"Query string was: %s\n",
query_string.c_str ());
notmuch->exception_reported = true;
}
msg = error.get_msg ();
return NOTMUCH_STATUS_XAPIAN_EXCEPTION;
}
return NOTMUCH_STATUS_SUCCESS;
}
static notmuch_status_t
_notmuch_query_ensure_parsed_xapian (notmuch_query_t *query)
{
try {
if (strcmp (query->query_string, "") == 0 ||
strcmp (query->query_string, "*") == 0) {
query->xapian_query = Xapian::Query::MatchAll;
} else {
query->xapian_query =
query->notmuch->query_parser->
parse_query (query->query_string, NOTMUCH_QUERY_PARSER_FLAGS);
notmuch_status_t status;
std::string msg; /* ignored */
status = _notmuch_query_string_to_xapian_query (query->notmuch, query->query_string,
query->xapian_query, msg);
if (status)
return status;
_notmuch_query_cache_terms (query);
}
query->parsed = true;
} catch (const Xapian::Error &error) {
if (! query->notmuch->exception_reported) {
_notmuch_database_log (query->notmuch,
"A Xapian exception occurred parsing query: %s\n",
error.get_msg ().c_str ());
_notmuch_database_log_append (query->notmuch,
"Query string was: %s\n",
query->query_string);
query->notmuch->exception_reported = true;
}
_notmuch_query_cache_terms (query);
return NOTMUCH_STATUS_XAPIAN_EXCEPTION;
}
return NOTMUCH_STATUS_SUCCESS;
}