store::for_each_term: use field-id

We were trying to convert a field (string) to a xapian prefix back to a
field (enum). That's unnecessarily complicated and worse, step 2 won't work.
This commit is contained in:
Dirk-Jan C. Binnema
2022-03-14 09:38:59 +02:00
parent 0368a48149
commit 056fecd6aa
3 changed files with 5 additions and 17 deletions

View File

@ -200,7 +200,7 @@ Parser::Private::process_regex(const std::string& field_str,
const auto field{message_field(*id_opt)}; const auto field{message_field(*id_opt)};
const auto prefix{field.xapian_term()}; const auto prefix{field.xapian_term()};
std::vector<std::string> terms; std::vector<std::string> terms;
store_.for_each_term(prefix, [&](auto&& str) { store_.for_each_term(field.id, [&](auto&& str) {
if (std::regex_search(str.c_str() + 1, rx)) // avoid copy if (std::regex_search(str.c_str() + 1, rx)) // avoid copy
terms.emplace_back(str); terms.emplace_back(str);
return true; return true;

View File

@ -604,7 +604,7 @@ Store::commit()
} }
std::size_t std::size_t
Store::for_each_term(const std::string& field_name, Store::ForEachTermFunc func) const Store::for_each_term(Message::Field::Id field_id, Store::ForEachTermFunc func) const
{ {
size_t n{}; size_t n{};
@ -613,20 +613,8 @@ Store::for_each_term(const std::string& field_name, Store::ForEachTermFunc func)
* Do _not_ take a lock; this is only called from * Do _not_ take a lock; this is only called from
* the message parser which already has the lock * the message parser which already has the lock
*/ */
/* get id from name or shortcut */
const auto id_opt = std::invoke([&]()->std::optional<MessageField::Id> {
if (field_name.length() == 1)
return message_field_id(field_name[0]);
else
return message_field_id(field_name);
});
if (!id_opt)
return;
const auto prefix{std::string{1, message_field(*id_opt).xapian_prefix()}};
std::vector<std::string> terms; std::vector<std::string> terms;
const auto prefix{message_field(field_id).xapian_term()};
for (auto it = priv_->db().allterms_begin(prefix); for (auto it = priv_->db().allterms_begin(prefix);
it != priv_->db().allterms_end(prefix); ++it) { it != priv_->db().allterms_end(prefix); ++it) {
if (!func(*it)) if (!func(*it))

View File

@ -282,12 +282,12 @@ public:
* takes a lock on the store, so the func should _not_ call any other * takes a lock on the store, so the func should _not_ call any other
* Store:: methods. * Store:: methods.
* *
* @param a prefix * @param id the field id
* @param func a Callable invoked for each message. * @param func a Callable invoked for each message.
* *
* @return the number of times func was invoked * @return the number of times func was invoked
*/ */
size_t for_each_term(const std::string& prefix, ForEachTermFunc func) const; size_t for_each_term(Message::Field::Id id, ForEachTermFunc func) const;
/** /**