40 estimates.
first = max(estimates.first, db_first);
41 estimates.last = min(estimates.last, db_last);
59 result.
min = max_range;
60 result.
max = max_range;
61 double est = max_range;
62 auto n_subqueries = sub_estimates.size();
63 for (
unsigned n = 0; n < n_subqueries; ++n) {
64 Estimates r = sub_estimates[n]->resolve(db_size, db_first, db_last);
75 result.
min <= max_range) {
82 result.
min -= max_range;
94 if (
usual(range_i > 0)) {
95 est = est * r.
est / range_i;
100 result.
est = std::clamp(result.
est, result.
min, result.
max);
105 result = sub_estimates[0]->resolve(db_size, db_first, db_last);
106 Estimates r = sub_estimates[1]->resolve(db_size, db_first, db_last);
114 auto max_actual_overlap = min(overlap, r.
max);
129 result.
max = std::min(result.
max, range_l - overlap + range_r - r.
min);
149 double est = result.
est * (1.0 - double(overlap) * r.
est /
150 (double(range_l) * range_r));
181 result = sub_estimates[0]->resolve(db_size, db_first, db_last);
182 double scale = max_range == 0.0 ? 1.0 : 1.0 / max_range;
183 double P_est = result.
est * scale;
184 auto n_subqueries = sub_estimates.size();
185 for (
unsigned i = 1; i != n_subqueries; ++i) {
186 Estimates r = sub_estimates[i]->resolve(db_size, db_first, db_last);
188 result.
min = std::max(result.
min, r.
min);
191 if (max_range - result.
max <= r.
max) {
192 result.
max = max_range;
201 double P_i = r.
est * scale;
202 P_est += P_i - P_est * P_i;
211 double scale = max_range == 0.0 ? 1.0 : 1.0 / max_range;
213 bool all_exact =
true;
216 unsigned max_overflow = 0;
229 auto n_subqueries = sub_estimates.size();
230 unique_ptr<Estimates[]> min_and_max{
new Estimates[n_subqueries]};
231 for (
unsigned i = 0; i < n_subqueries; ++i) {
233 sub_estimates[i]->resolve(db_size, db_first, db_last);
236 if (r.
min == db_size) {
248 all_exact = all_exact && (max_i == r.
min);
250 double P_i = r.
est * scale;
251 P_est += P_i - 2.0 * P_est * P_i;
257 if (max_overflow || max_sum > db_size) {
262 result.
max = db_size - ((max_sum & 1) != (db_size & 1));
264 result.
max = db_size;
267 result.
max = max_sum;
274 if (max_overflow <= 1) {
279 for (
unsigned i = 0; i < j; ++i) {
283 if (max_overflow == 0 || all_the_rest > max_sum) {
284 if (r.
min > all_the_rest) {
285 min = std::max(min, r.
min - all_the_rest);
290 if (all_exact && min == 0) {
295 result.
min = max_sum & 1;
301 auto old_min = result.
min;
302 result.
min = db_size - result.
max;
303 result.
est = db_size - result.
est;
304 result.
max = db_size - old_min;
312 result = sub_estimates[0]->resolve(db_size, db_first, db_last);
313 if (estimates.min == 0 && estimates.max == 0) {
317 result.
est /= unsigned(type);
320 result.
min = estimates.min;
321 result.
max -= estimates.max;
322 double scale = double(estimates.min) / (estimates.min + estimates.max);
324 result.
est = std::clamp(result.
est, result.
min, result.
max);
327 #if defined __GNUC__ && !defined __clang__
341 __builtin_unreachable();
347 result.
first = estimates.first;
348 result.
last = estimates.last;
353 if (max_range < result.
max) {
354 result.
max = max_range;
355 if (max_range < result.
est) {
356 result.
est = max_range;
Estimates resolve(Xapian::doccount db_size, Xapian::docid db_first, Xapian::docid db_last)
Calculated bounds on and estimate of number of matches.
unsigned XAPIAN_DOCID_BASE_TYPE doccount
A count of documents.
unsigned XAPIAN_DOCID_BASE_TYPE docid
A unique identifier for a document.
Various assertion macros.
#define AssertRel(A, REL, B)
Arithmetic operations with overflow checks.
std::enable_if_t< std::is_unsigned_v< T1 > &&std::is_unsigned_v< T2 > &&std::is_unsigned_v< R >, bool > sub_overflows(T1 a, T2 b, R &res)
Subtraction with overflow checking.
std::enable_if_t< std::is_unsigned_v< T1 > &&std::is_unsigned_v< T2 > &&std::is_unsigned_v< R >, bool > add_overflows(T1 a, T2 b, R &res)
Addition with overflow checking.
Xapian::docid last
Upper bound on docids matched.
Xapian::docid first
Lower bound on docids matched.