pub struct RegistryProvider { /* private fields */ }Expand description
StatsProvider backed by an IndexRegistry.
Closes the loop between the index trait layer and the planner stats
surface: storage components publish their indexes into an
IndexRegistry, and this adapter surfaces those statistics to the cost
estimator through the trait it already consumes.
Table-level statistics (row counts, page counts) still need an external
source — the registry only knows about indexes, not base-table
cardinality. Callers can chain a StaticProvider via
RegistryProvider::with_table_fallback when they want both.
Implementations§
Source§impl RegistryProvider
impl RegistryProvider
Sourcepub fn new(registry: Arc<IndexRegistry>) -> RegistryProvider
pub fn new(registry: Arc<IndexRegistry>) -> RegistryProvider
Wrap an existing registry. Without a fallback, table_stats always
returns None — only index-level stats are served.
Sourcepub fn with_table_fallback(
self,
fallback: Arc<dyn StatsProvider>,
) -> RegistryProvider
pub fn with_table_fallback( self, fallback: Arc<dyn StatsProvider>, ) -> RegistryProvider
Attach a secondary provider consulted for table-level stats the registry cannot answer.
Trait Implementations§
Source§impl StatsProvider for RegistryProvider
impl StatsProvider for RegistryProvider
Source§fn table_stats(&self, table: &str) -> Option<TableStats>
fn table_stats(&self, table: &str) -> Option<TableStats>
Return row-count / page-count / column metadata for
table, or
None when stats are not available.Source§fn index_stats(&self, table: &str, column: &str) -> Option<IndexStats>
fn index_stats(&self, table: &str, column: &str) -> Option<IndexStats>
Return the
IndexStats backing a secondary index on
(table, column), if one exists. The planner uses
IndexStats::point_selectivity to derive equality selectivity
instead of the 0.01 constant.Source§fn column_stats(&self, table: &str, column: &str) -> Option<ColumnStats>
fn column_stats(&self, table: &str, column: &str) -> Option<ColumnStats>
Return per-column statistics (distinct count, null count, min/max)
when available. Default implementation derives from
StatsProvider::table_stats when present.Source§fn has_index(&self, table: &str, column: &str) -> bool
fn has_index(&self, table: &str, column: &str) -> bool
Convenience: does a usable index exist on
(table, column)?Source§fn distinct_values(&self, table: &str, column: &str) -> Option<u64>
fn distinct_values(&self, table: &str, column: &str) -> Option<u64>
Convenience: distinct-value count for a column, via column stats or
an index on that column, whichever is available.
Source§fn column_histogram(&self, _table: &str, _column: &str) -> Option<Histogram>
fn column_histogram(&self, _table: &str, _column: &str) -> Option<Histogram>
Optional equi-depth histogram for the column. Defaults to
None, in which case the planner falls back to its uniform
0.3 range heuristic. Read moreSource§fn column_mcv(&self, _table: &str, _column: &str) -> Option<MostCommonValues>
fn column_mcv(&self, _table: &str, _column: &str) -> Option<MostCommonValues>
Optional most-common-values list for the column. Defaults to
None, in which case the planner falls back to its uniform
0.01 equality heuristic. Use for skewed columns where one or
two values dominate the table.Auto Trait Implementations§
impl Freeze for RegistryProvider
impl !RefUnwindSafe for RegistryProvider
impl Send for RegistryProvider
impl Sync for RegistryProvider
impl Unpin for RegistryProvider
impl UnsafeUnpin for RegistryProvider
impl !UnwindSafe for RegistryProvider
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
Mutably borrows from an owned value. Read more
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> IntoEither for T
impl<T> IntoEither for T
Source§fn into_either(self, into_left: bool) -> Either<Self, Self>
fn into_either(self, into_left: bool) -> Either<Self, Self>
Converts
self into a Left variant of Either<Self, Self>
if into_left is true.
Converts self into a Right variant of Either<Self, Self>
otherwise. Read moreSource§fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>
fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>
Converts
self into a Left variant of Either<Self, Self>
if into_left(&self) returns true.
Converts self into a Right variant of Either<Self, Self>
otherwise. Read moreSource§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>
Wrap the input message
T in a tonic::Request