mirror of
https://git.notmuchmail.org/git/notmuch
synced 2024-11-24 20:08:10 +01:00
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:
parent
c62f3f77a7
commit
b3bbaf1bc2
2 changed files with 47 additions and 23 deletions
|
@ -302,11 +302,18 @@ notmuch_status_t
|
||||||
_notmuch_database_setup_user_query_fields (notmuch_database_t *notmuch);
|
_notmuch_database_setup_user_query_fields (notmuch_database_t *notmuch);
|
||||||
|
|
||||||
#if __cplusplus
|
#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 */
|
/* parse-sexp.cc */
|
||||||
notmuch_status_t
|
notmuch_status_t
|
||||||
_notmuch_sexp_string_to_xapian_query (notmuch_database_t *notmuch, const char *querystr,
|
_notmuch_sexp_string_to_xapian_query (notmuch_database_t *notmuch, const char *querystr,
|
||||||
Xapian::Query &output);
|
Xapian::Query &output);
|
||||||
|
|
||||||
|
/* regexp-fields.cc */
|
||||||
notmuch_status_t
|
notmuch_status_t
|
||||||
_notmuch_regexp_to_query (notmuch_database_t *notmuch, Xapian::valueno slot, std::string field,
|
_notmuch_regexp_to_query (notmuch_database_t *notmuch, Xapian::valueno slot, std::string field,
|
||||||
std::string regexp_str,
|
std::string regexp_str,
|
||||||
|
|
63
lib/query.cc
63
lib/query.cc
|
@ -178,35 +178,52 @@ _notmuch_query_cache_terms (notmuch_query_t *query)
|
||||||
query->terms.insert (*t);
|
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
|
static notmuch_status_t
|
||||||
_notmuch_query_ensure_parsed_xapian (notmuch_query_t *query)
|
_notmuch_query_ensure_parsed_xapian (notmuch_query_t *query)
|
||||||
{
|
{
|
||||||
try {
|
notmuch_status_t status;
|
||||||
if (strcmp (query->query_string, "") == 0 ||
|
std::string msg; /* ignored */
|
||||||
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_query_cache_terms (query);
|
status = _notmuch_query_string_to_xapian_query (query->notmuch, query->query_string,
|
||||||
}
|
query->xapian_query, msg);
|
||||||
query->parsed = true;
|
if (status)
|
||||||
|
return status;
|
||||||
|
|
||||||
} catch (const Xapian::Error &error) {
|
query->parsed = true;
|
||||||
if (! query->notmuch->exception_reported) {
|
|
||||||
_notmuch_database_log (query->notmuch,
|
_notmuch_query_cache_terms (query);
|
||||||
"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;
|
|
||||||
}
|
|
||||||
|
|
||||||
return NOTMUCH_STATUS_XAPIAN_EXCEPTION;
|
|
||||||
}
|
|
||||||
return NOTMUCH_STATUS_SUCCESS;
|
return NOTMUCH_STATUS_SUCCESS;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue