#[non_exhaustive]pub enum CandidateCount {
Exact(usize),
AtLeast(usize),
}Expand description
What the counting probe learned about the candidate set.
The distinction is the point: SQLite has no histograms and sqlite_stat1
carries average rows-per-key, which estimates an equality predicate and not
multi-hop reachability. So the count is measured, by running the traversal
under a cap — and a probe that hits its cap has not measured anything except
that the set is too big to care about the exact size.
The cap became a real one at 0.15.10 (D-252). Until then the traversal
ran to completion and the tail was dropped afterwards, so AtLeast recorded
that the answer had been trimmed and never that any work had been saved —
C-8’s finding that probe_cap “bounds memory, not work”. It is now
TraversalBuilder::limit, which
stops the recursion, and the variant means what its name always claimed.
Variants (Non-exhaustive)§
This enum is marked as non-exhaustive
Exact(usize)
The traversal ran to the end of the graph and returned this many ids.
AtLeast(usize)
The walk stopped at the cap. The true count is at least this.
This is the id count, not the cap, and the two can differ now that
the ceiling is on the walk rather than on the list it produced: the walk
dedupes on (node, depth) and the projection drops retired concepts, so
a walk cut at 10 rows can yield 8 ids. Reporting 8 is the true lower
bound; reporting 10 would be a number nothing counted.
Implementations§
Source§impl CandidateCount
impl CandidateCount
Sourcepub fn lower_bound(self) -> usize
pub fn lower_bound(self) -> usize
The number to compute with. For a capped probe this understates the true
count, which is the safe direction: it makes PreFilterCTE look cheaper
than it is, and PreFilterCTE is the exact strategy.
It also now reflects what the traversal was paid for rather than what survived a truncation, which is the half of C-8 the cost model cared about: the estimator was pricing strategies against a candidate count the walk had already exceeded.
pub fn is_capped(self) -> bool
Trait Implementations§
Source§impl Clone for CandidateCount
impl Clone for CandidateCount
Source§fn clone(&self) -> CandidateCount
fn clone(&self) -> CandidateCount
1.0.0 (const: unstable) · Source§fn clone_from(&mut self, source: &Self)
fn clone_from(&mut self, source: &Self)
source. Read moreimpl Copy for CandidateCount
Source§impl Debug for CandidateCount
impl Debug for CandidateCount
impl Eq for CandidateCount
Source§impl PartialEq for CandidateCount
impl PartialEq for CandidateCount
impl StructuralPartialEq for CandidateCount
Auto Trait Implementations§
impl Freeze for CandidateCount
impl RefUnwindSafe for CandidateCount
impl Send for CandidateCount
impl Sync for CandidateCount
impl Unpin for CandidateCount
impl UnsafeUnpin for CandidateCount
impl UnwindSafe for CandidateCount
Blanket Implementations§
Source§impl<T> BorrowMut<T> for Twhere
T: ?Sized,
impl<T> BorrowMut<T> for Twhere
T: ?Sized,
Source§fn borrow_mut(&mut self) -> &mut T
fn borrow_mut(&mut self) -> &mut T
impl<ST, DT> CastableFrom<ST, Initialized, Initialized> for DT
impl<ST, DT> CastableFrom<ST, Uninit, Uninit> for DT
Source§impl<T> CloneToUninit for Twhere
T: Clone,
impl<T> CloneToUninit for Twhere
T: Clone,
Source§impl<Q, K> Equivalent<K> for Q
impl<Q, K> Equivalent<K> for Q
Source§impl<Q, K> Equivalent<K> for Q
impl<Q, K> Equivalent<K> for Q
Source§fn equivalent(&self, key: &K) -> bool
fn equivalent(&self, key: &K) -> bool
key and return true if they are equal.Source§impl<Q, K> Equivalent<K> for Q
impl<Q, K> Equivalent<K> for Q
Source§impl<Q, K> Equivalent<K> for Q
impl<Q, K> Equivalent<K> for Q
Source§fn equivalent(&self, key: &K) -> bool
fn equivalent(&self, key: &K) -> bool
key and return true if they are equal.Source§impl<T> Instrument for T
impl<T> Instrument for T
Source§fn instrument(self, span: Span) -> Instrumented<Self> ⓘ
fn instrument(self, span: Span) -> Instrumented<Self> ⓘ
Source§fn in_current_span(self) -> Instrumented<Self> ⓘ
fn in_current_span(self) -> Instrumented<Self> ⓘ
Source§impl<T> IntoRequest<T> for T
impl<T> IntoRequest<T> for T
Source§fn into_request(self) -> Request<T>
fn into_request(self) -> Request<T>
T in a tonic::Request