pub struct QueryPlanner { /* private fields */ }Expand description
Query planner for hybrid MATCH + NEAR queries.
Implementations§
Source§impl QueryPlanner
impl QueryPlanner
Sourcepub fn with_thresholds(graph_first: f64, vector_first: f64) -> Self
pub fn with_thresholds(graph_first: f64, vector_first: f64) -> Self
Creates a planner with custom selectivity thresholds.
Sourcepub fn choose_strategy(
&self,
estimated_selectivity: Option<f64>,
) -> ExecutionStrategy
pub fn choose_strategy( &self, estimated_selectivity: Option<f64>, ) -> ExecutionStrategy
Chooses the optimal execution strategy based on estimated selectivity.
Sourcepub fn choose_strategy_with_cbo(
&self,
stats: &CollectionStats,
filter: Option<&Condition>,
k: usize,
) -> ExecutionStrategy
pub fn choose_strategy_with_cbo( &self, stats: &CollectionStats, filter: Option<&Condition>, k: usize, ) -> ExecutionStrategy
Chooses strategy using CBO with collection statistics and optional filter.
Uses calibrated OperationCostFactors from stats.calibrated_cost_factors
(when available) to derive I/O and CPU weights for the candidate filter cost.
Falls back to OperationCostFactors::default() when no calibrated factors
exist, reproducing the historical 0.2 / 0.8 I/O/CPU split.
Sourcepub fn choose_strategy_with_cbo_and_overfetch(
&self,
stats: &CollectionStats,
filter: Option<&Condition>,
k: usize,
) -> (ExecutionStrategy, usize)
pub fn choose_strategy_with_cbo_and_overfetch( &self, stats: &CollectionStats, filter: Option<&Condition>, k: usize, ) -> (ExecutionStrategy, usize)
Like choose_strategy_with_cbo but also returns the CBO-computed over-fetch factor.
Returns (strategy, over_fetch) where over_fetch is a multiplier for k when
doing vector-first search with a selective metadata filter:
VectorFirstwith filter:(1 / selectivity).clamp(1, 64)VectorFirstwithout filter:1GraphFirst:1(graph pre-filters, no over-fetch needed)Parallel:2(merge overhead)
Sourcepub fn stats(&self) -> &QueryStats
pub fn stats(&self) -> &QueryStats
Returns a reference to the query statistics.
Sourcepub fn record_cbo_feedback(
&self,
dataset_size: usize,
ef_search: usize,
actual_ms: f64,
)
pub fn record_cbo_feedback( &self, dataset_size: usize, ef_search: usize, actual_ms: f64, )
Records a CBO feedback observation (issue #469).
Called after each vector query with the dataset size, ef_search used,
and the actual wall-clock duration. The feedback loop adjusts
ms_per_cost_unit via EMA with α=0.05 after MIN_SAMPLES observations.
Sourcepub fn adjusted_ms_per_cost_unit(&self) -> Option<f64>
pub fn adjusted_ms_per_cost_unit(&self) -> Option<f64>
Returns the feedback-adjusted ms_per_cost_unit, if available.
Returns None until the feedback loop has seen enough observations.
The planner falls back to the static calibration default in that case.
Sourcepub fn cbo_sample_count(&self) -> u64
pub fn cbo_sample_count(&self) -> u64
Returns the total number of CBO feedback samples recorded.
Used by EXPLAIN ANALYZE to surface confidence of the calibration.
Sourcepub fn estimate_selectivity(
&self,
label_count: u64,
total_nodes: u64,
rel_type_count: u64,
total_edges: u64,
) -> f64
pub fn estimate_selectivity( &self, label_count: u64, total_nodes: u64, rel_type_count: u64, total_edges: u64, ) -> f64
Estimates selectivity based on label and relationship type counts.
This is a heuristic based on the principle that:
- Rare labels/types → low selectivity → GraphFirst
- Common labels/types → high selectivity → VectorFirst
Sourcepub fn choose_hybrid_strategy(
&self,
has_order_by_similarity: bool,
has_filter: bool,
limit: Option<u64>,
estimated_selectivity: Option<f64>,
) -> HybridExecutionPlan
pub fn choose_hybrid_strategy( &self, has_order_by_similarity: bool, has_filter: bool, limit: Option<u64>, estimated_selectivity: Option<f64>, ) -> HybridExecutionPlan
Choose optimal strategy for hybrid queries with ORDER BY similarity().
When ORDER BY similarity() is present, we optimize for:
- Always execute vector search first (it naturally orders by similarity)
- Apply filters as post-processing to preserve ordering
- Use early termination when LIMIT is specified
§Arguments
has_order_by_similarity- True if ORDER BY similarity() is in queryhas_filter- True if WHERE clause with non-vector conditionslimit- Optional LIMIT value for early termination optimizationestimated_selectivity- Optional estimated filter selectivity
Sourcepub fn estimate_cost(
&self,
plan: &HybridExecutionPlan,
candidate_count: u64,
) -> u64
pub fn estimate_cost( &self, plan: &HybridExecutionPlan, candidate_count: u64, ) -> u64
Estimate cost in microseconds for a given execution plan.
Uses runtime statistics to estimate total query cost.
Trait Implementations§
Source§impl Debug for QueryPlanner
impl Debug for QueryPlanner
Source§impl Default for QueryPlanner
impl Default for QueryPlanner
Source§fn default() -> QueryPlanner
fn default() -> QueryPlanner
Auto Trait Implementations§
impl !Freeze for QueryPlanner
impl RefUnwindSafe for QueryPlanner
impl Send for QueryPlanner
impl Sync for QueryPlanner
impl Unpin for QueryPlanner
impl UnsafeUnpin for QueryPlanner
impl UnwindSafe for QueryPlanner
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
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>
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>
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> Paint for Twhere
T: ?Sized,
impl<T> Paint for Twhere
T: ?Sized,
Source§fn fg(&self, value: Color) -> Painted<&T>
fn fg(&self, value: Color) -> Painted<&T>
Returns a styled value derived from self with the foreground set to
value.
This method should be used rarely. Instead, prefer to use color-specific
builder methods like red() and
green(), which have the same functionality but are
pithier.
§Example
Set foreground color to white using fg():
use yansi::{Paint, Color};
painted.fg(Color::White);Set foreground color to white using white().
use yansi::Paint;
painted.white();Source§fn bright_black(&self) -> Painted<&T>
fn bright_black(&self) -> Painted<&T>
Source§fn bright_red(&self) -> Painted<&T>
fn bright_red(&self) -> Painted<&T>
Source§fn bright_green(&self) -> Painted<&T>
fn bright_green(&self) -> Painted<&T>
Source§fn bright_yellow(&self) -> Painted<&T>
fn bright_yellow(&self) -> Painted<&T>
Source§fn bright_blue(&self) -> Painted<&T>
fn bright_blue(&self) -> Painted<&T>
Source§fn bright_magenta(&self) -> Painted<&T>
fn bright_magenta(&self) -> Painted<&T>
Source§fn bright_cyan(&self) -> Painted<&T>
fn bright_cyan(&self) -> Painted<&T>
Source§fn bright_white(&self) -> Painted<&T>
fn bright_white(&self) -> Painted<&T>
Source§fn bg(&self, value: Color) -> Painted<&T>
fn bg(&self, value: Color) -> Painted<&T>
Returns a styled value derived from self with the background set to
value.
This method should be used rarely. Instead, prefer to use color-specific
builder methods like on_red() and
on_green(), which have the same functionality but
are pithier.
§Example
Set background color to red using fg():
use yansi::{Paint, Color};
painted.bg(Color::Red);Set background color to red using on_red().
use yansi::Paint;
painted.on_red();Source§fn on_primary(&self) -> Painted<&T>
fn on_primary(&self) -> Painted<&T>
Source§fn on_magenta(&self) -> Painted<&T>
fn on_magenta(&self) -> Painted<&T>
Source§fn on_bright_black(&self) -> Painted<&T>
fn on_bright_black(&self) -> Painted<&T>
Source§fn on_bright_red(&self) -> Painted<&T>
fn on_bright_red(&self) -> Painted<&T>
Source§fn on_bright_green(&self) -> Painted<&T>
fn on_bright_green(&self) -> Painted<&T>
Source§fn on_bright_yellow(&self) -> Painted<&T>
fn on_bright_yellow(&self) -> Painted<&T>
Source§fn on_bright_blue(&self) -> Painted<&T>
fn on_bright_blue(&self) -> Painted<&T>
Source§fn on_bright_magenta(&self) -> Painted<&T>
fn on_bright_magenta(&self) -> Painted<&T>
Source§fn on_bright_cyan(&self) -> Painted<&T>
fn on_bright_cyan(&self) -> Painted<&T>
Source§fn on_bright_white(&self) -> Painted<&T>
fn on_bright_white(&self) -> Painted<&T>
Source§fn attr(&self, value: Attribute) -> Painted<&T>
fn attr(&self, value: Attribute) -> Painted<&T>
Enables the styling Attribute value.
This method should be used rarely. Instead, prefer to use
attribute-specific builder methods like bold() and
underline(), which have the same functionality
but are pithier.
§Example
Make text bold using attr():
use yansi::{Paint, Attribute};
painted.attr(Attribute::Bold);Make text bold using using bold().
use yansi::Paint;
painted.bold();Source§fn rapid_blink(&self) -> Painted<&T>
fn rapid_blink(&self) -> Painted<&T>
Source§fn quirk(&self, value: Quirk) -> Painted<&T>
fn quirk(&self, value: Quirk) -> Painted<&T>
Enables the yansi Quirk value.
This method should be used rarely. Instead, prefer to use quirk-specific
builder methods like mask() and
wrap(), which have the same functionality but are
pithier.
§Example
Enable wrapping using .quirk():
use yansi::{Paint, Quirk};
painted.quirk(Quirk::Wrap);Enable wrapping using wrap().
use yansi::Paint;
painted.wrap();Source§fn clear(&self) -> Painted<&T>
👎Deprecated since 1.0.1: renamed to resetting() due to conflicts with Vec::clear().
The clear() method will be removed in a future release.
fn clear(&self) -> Painted<&T>
renamed to resetting() due to conflicts with Vec::clear().
The clear() method will be removed in a future release.
Source§fn whenever(&self, value: Condition) -> Painted<&T>
fn whenever(&self, value: Condition) -> Painted<&T>
Conditionally enable styling based on whether the Condition value
applies. Replaces any previous condition.
See the crate level docs for more details.
§Example
Enable styling painted only when both stdout and stderr are TTYs:
use yansi::{Paint, Condition};
painted.red().on_yellow().whenever(Condition::STDOUTERR_ARE_TTY);