38 if (items.size() < collapse_max) {
44 if (collapse_count == 0 && collapse_max != 1) {
48 [&](pair<Xapian::doccount, Xapian::docid> a,
49 pair<Xapian::doccount, Xapian::docid> b) {
50 return mcmp(results[a.first], results[b.first]);
56 const Result& old_result = results[old_item_candidate];
57 if (items.front().second != old_result.
get_docid()) {
77 if (mcmp(old_result, result)) {
84 old_item = old_item_candidate;
87 items.front() = { old_item, result.
get_docid() };
89 [&](pair<Xapian::doccount, Xapian::docid> a,
90 pair<Xapian::doccount, Xapian::docid> b) {
91 return mcmp(results[a.first], results[b.first]);
102 items[0].first = item;
111 const Result& result = results[item];
112 if (items.size() < collapse_max) {
113 items.emplace_back(item, result.
get_docid());
117 items.front() = { item, result.
get_docid() };
119 [&](pair<Xapian::doccount, Xapian::docid> a,
120 pair<Xapian::doccount, Xapian::docid> b) {
121 return mcmp(results[a.first], results[b.first]);
144 ptr = &r.first->second;
153 res = collapse_data.
check_item(results, result, collapse_max, mcmp,
175 ptr->add_item(results, item, collapse_max, mcmp);
186 int percent_threshold,
187 double min_weight)
const
189 auto key = table.find(collapse_key);
191 Assert(key != table.end());
193 if (!percent_threshold) {
195 return key->second.get_collapse_count();
198 if (key->second.get_next_best_weight() < min_weight) {
217 return matches_lower_bound;
224 for (
auto i = table.begin(); i != table.end(); ++i) {
225 if (i->second.get_collapse_count() > max_kept) {
226 max_kept = i->second.get_collapse_count();
227 if (max_kept == collapse_max) {
228 return matches_lower_bound;
232 return matches_lower_bound + (collapse_max - max_kept);
239 if (table.empty() || results.empty())
245 for (
Result& result : results) {
246 const string& key = result.get_collapse_key();
251 result.set_collapse_count(get_collapse_count(key, percent_threshold,
Class tracking information for a given value of the collapse key.
void set_item(Xapian::doccount item)
Set item after constructing with a placeholder.
void add_item(const std::vector< Result > &results, Xapian::doccount item, Xapian::doccount collapse_max, MSetCmp mcmp)
Complete update of new result with this collapse key value.
collapse_result check_item(const std::vector< Result > &results, const Result &result, Xapian::doccount collapse_max, MSetCmp mcmp, Xapian::doccount &old_item)
Check a new result with this collapse key value.
collapse_result check(Result &result, Xapian::Document::Internal &vsdoc)
Check a new result.
void finalise(double min_weight, int percent_threshold)
void process(collapse_result action, Xapian::doccount item)
Handle a new Result.
Xapian::doccount get_matches_lower_bound() const
Xapian::doccount get_collapse_count(const std::string &collapse_key, int percent_threshold, double min_weight) const
double get_weight() const
void set_collapse_key(const std::string &k)
const std::string & get_collapse_key() const
Xapian::docid get_docid() const
Abstract base class for a document.
std::string get_value(Xapian::valueno slot) const
Read a value slot in this document.
Collapse documents with the same collapse key during the match.
collapse_result
Enumeration reporting how a result will be handled by the Collapser.
C++ STL heap implementation with extensions.
bool(* MSetCmp)(const Result &, const Result &)
void replace(_RandomAccessIterator first, _RandomAccessIterator last, _Compare comp)
void make(_RandomAccessIterator first, _RandomAccessIterator last, _Compare comp)
unsigned XAPIAN_DOCID_BASE_TYPE doccount
A count of documents.
Various assertion macros.