store: improve label handling
In particular, clear_labels And some cosmetics
This commit is contained in:
@ -89,7 +89,6 @@ Mu::Labels::parse_delta_label(const std::string &expr)
|
|||||||
return Ok(DeltaLabel{std::move(delta), std::move(label)});
|
return Ok(DeltaLabel{std::move(delta), std::move(label)});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
Result<DeltaLabelVec>
|
Result<DeltaLabelVec>
|
||||||
Mu::Labels::parse_delta_labels(const std::string& exprs,
|
Mu::Labels::parse_delta_labels(const std::string& exprs,
|
||||||
const std::string sepa)
|
const std::string sepa)
|
||||||
@ -106,10 +105,6 @@ Mu::Labels::parse_delta_labels(const std::string& exprs,
|
|||||||
return Ok(std::move(deltas));
|
return Ok(std::move(deltas));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
struct cmp_delta_label { // can not yet be a λ in C++17
|
struct cmp_delta_label { // can not yet be a λ in C++17
|
||||||
bool operator()(const DeltaLabel& dl1, const DeltaLabel& dl2) const {
|
bool operator()(const DeltaLabel& dl1, const DeltaLabel& dl2) const {
|
||||||
return dl1.second < dl2.second;
|
return dl1.second < dl2.second;
|
||||||
|
|||||||
@ -52,20 +52,22 @@ public:
|
|||||||
/**
|
/**
|
||||||
* Add a label occurrence to the cache
|
* Add a label occurrence to the cache
|
||||||
*
|
*
|
||||||
* @param label
|
* @param label some label
|
||||||
*/
|
*/
|
||||||
void add(const std::string& label) {
|
void increase(const std::string& label) {
|
||||||
if (auto it = label_map_.find(label); it == label_map_.end())
|
if (auto it = label_map_.find(label); it == label_map_.end())
|
||||||
label_map_.insert({label, 1});
|
label_map_.insert({label, 1});
|
||||||
else
|
else
|
||||||
++it->second;
|
++it->second;
|
||||||
}
|
}
|
||||||
/**
|
/**
|
||||||
* Remove label occurrence from the cache
|
* Remove a label occurrence from the cache
|
||||||
*
|
*
|
||||||
* @param label
|
* Removes the label completely if this was the _last_ occurence.
|
||||||
|
*
|
||||||
|
* @param label some label
|
||||||
*/
|
*/
|
||||||
void remove(const std::string& label) {
|
void decrease(const std::string& label) {
|
||||||
if (auto it = label_map_.find(label); it != label_map_.end()) {
|
if (auto it = label_map_.find(label); it != label_map_.end()) {
|
||||||
if (it->second == 1)
|
if (it->second == 1)
|
||||||
label_map_.erase(it);
|
label_map_.erase(it);
|
||||||
@ -83,10 +85,10 @@ public:
|
|||||||
for(const auto& [delta, label]: updates) {
|
for(const auto& [delta, label]: updates) {
|
||||||
switch(delta) {
|
switch(delta) {
|
||||||
case Labels::Delta::Add:
|
case Labels::Delta::Add:
|
||||||
add(label);
|
increase(label);
|
||||||
break;
|
break;
|
||||||
case Labels::Delta::Remove:
|
case Labels::Delta::Remove:
|
||||||
remove(label);
|
decrease(label);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -99,7 +101,6 @@ public:
|
|||||||
*/
|
*/
|
||||||
Map label_map() const { return label_map_; }
|
Map label_map() const { return label_map_; }
|
||||||
|
|
||||||
|
|
||||||
// serialization/deserialization could be optimized, but is not super
|
// serialization/deserialization could be optimized, but is not super
|
||||||
// time-critical
|
// time-critical
|
||||||
|
|
||||||
@ -116,7 +117,6 @@ public:
|
|||||||
return s;
|
return s;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Deserialize the cache into a Map
|
* Deserialize the cache into a Map
|
||||||
*
|
*
|
||||||
|
|||||||
@ -632,7 +632,6 @@ Store::update_labels(Message& message, const Labels::DeltaLabelVec& labels_delta
|
|||||||
if (updates.second.empty())
|
if (updates.second.empty())
|
||||||
return Ok(std::move(updates.second)); // nothing to do
|
return Ok(std::move(updates.second)); // nothing to do
|
||||||
|
|
||||||
|
|
||||||
message.set_labels(updates.first);
|
message.set_labels(updates.first);
|
||||||
auto res{priv_->update_message_unlocked(message, message.docid())};
|
auto res{priv_->update_message_unlocked(message, message.docid())};
|
||||||
if (!res)
|
if (!res)
|
||||||
@ -643,24 +642,30 @@ Store::update_labels(Message& message, const Labels::DeltaLabelVec& labels_delta
|
|||||||
return Ok(std::move(updates.second));
|
return Ok(std::move(updates.second));
|
||||||
}
|
}
|
||||||
|
|
||||||
Result<void>
|
Result<Labels::DeltaLabelVec>
|
||||||
Store::clear_labels(Message& message)
|
Store::clear_labels(Message& message)
|
||||||
{
|
{
|
||||||
|
using namespace Labels;
|
||||||
|
|
||||||
std::unique_lock lock{priv_->lock_};
|
std::unique_lock lock{priv_->lock_};
|
||||||
|
|
||||||
|
DeltaLabelVec updates;
|
||||||
|
|
||||||
const auto labels{message.labels()};
|
const auto labels{message.labels()};
|
||||||
if (labels.empty())
|
if (labels.empty())
|
||||||
return Ok(); // nothing to do
|
return Ok(std::move(updates)); // nothing to do
|
||||||
|
|
||||||
message.set_labels({}); // clear all
|
message.set_labels({}); // clear all
|
||||||
auto res{priv_->update_message_unlocked(message, message.docid())};
|
auto res{priv_->update_message_unlocked(message, message.docid())};
|
||||||
if (!res)
|
if (!res)
|
||||||
return Err(res.error());
|
return Err(res.error());
|
||||||
|
|
||||||
for (auto label: labels)
|
for (auto label: labels) {
|
||||||
priv_->labels_cache_.remove(label);
|
updates.emplace_back(DeltaLabel{Delta::Remove, label});
|
||||||
|
priv_->labels_cache_.decrease(label);
|
||||||
|
}
|
||||||
|
|
||||||
return Ok();
|
return Ok(std::move(updates));
|
||||||
}
|
}
|
||||||
|
|
||||||
LabelsCache::Map
|
LabelsCache::Map
|
||||||
|
|||||||
@ -347,18 +347,20 @@ public:
|
|||||||
* @param message some message
|
* @param message some message
|
||||||
* @param labels_delta the set of changes
|
* @param labels_delta the set of changes
|
||||||
*
|
*
|
||||||
* @return the effective changes for this message
|
* @return the effective changes for this message or an error
|
||||||
*/
|
*/
|
||||||
Result<Labels::DeltaLabelVec> update_labels(Message& message, const Labels::DeltaLabelVec& labels_delta);
|
Result<Labels::DeltaLabelVec> update_labels(Message& message,
|
||||||
|
const Labels::DeltaLabelVec& labels_delta);
|
||||||
/**
|
/**
|
||||||
* Clear all labels from message
|
* Clear all labels from a message
|
||||||
|
*
|
||||||
|
* Update the message in the store, and update the labels-cache
|
||||||
*
|
*
|
||||||
* @param message some message
|
* @param message some message
|
||||||
*
|
*
|
||||||
* @return Ok or some error
|
* @return the effective changes for this message or an error
|
||||||
*/
|
*/
|
||||||
Result<void> clear_labels(Message& message);
|
Result<Labels::DeltaLabelVec> clear_labels(Message& message);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Get a copy of the map of labels in use.
|
* Get a copy of the map of labels in use.
|
||||||
|
|||||||
Reference in New Issue
Block a user