Skip to main content

linkrs_query/
optimizer.rs

1//! Query Optimization Module
2//!
3//! Provide query optimization capabilities, including the management of statistical information, cost calculation, and optimization strategies.
4//!
5//! ## Module Structure
6//!
7//! The optimizer is organized into two main optimization phases:
8//!
9//! ### Heuristic Optimization (`heuristic/`)
10//! Rule-based optimizations that always produce better or equivalent plans:
11//! - Predicate Pushdown
12//! - Projection Pushdown
13//! - Elimination Rules
14//! - Merge Operations
15//! - Limit Pushdown
16//!
17//! ### Cost-Based Optimization (`cost_based/`)
18//! Statistics-driven optimizations that use cost models:
19//! - Join Order Optimization
20//! - Index Selection
21//! - Traversal Start/Direction Selection
22//! - Aggregate Strategy Selection
23//! - Materialization Decision
24//!
25//! ### Supporting Modules
26//! - `engine` – The globally unique optimizer engine instance with unified optimization interface
27//! - `stats` – Statistical information management
28//! - `cost` – Cost calculation and estimation
29//! - `analysis` – Plan analysis utilities
30//! - `decision` – Optimization decision types
31//!
32//! ## Usage Examples
33//!
34//! ```rust
35//! use linkrs_query::optimizer::OptimizerEngine;
36//!
37//! // Create the optimizer engine (global instance)
38//! let optimizer = OptimizerEngine::default();
39//!
40//! // Optimize an execution plan through all enabled phases:
41//! // let optimized_plan = optimizer.optimize(plan, None)?;
42//! ```
43
44// Core modules
45pub mod analysis;
46pub mod builder;
47pub mod context;
48pub mod cost;
49pub mod decision;
50pub mod engine;
51pub mod error;
52pub mod factorization;
53pub mod partitioning;
54pub mod stats;
55
56// Optimization phases
57pub mod cost_based; // Cost-based optimization strategies
58pub mod heuristic; // Heuristic rewrite rules
59
60// Re-export the main types
61pub use builder::OptimizerEngineBuilder;
62pub use engine::OptimizerEngine;
63pub use error::{CostError, CostResult, OptimizeError, OptimizeResult};
64pub use partitioning::{PartitioningConfig, PartitioningDecision, PartitioningPlanner};
65
66pub use stats::{
67    CardinalityFeedbackManager, DecisionFeedbackStore, DecorrelationAdvice, EdgeTypeStatistics,
68    FeedbackDrivenSelectivity, OperatorFeedback, PropertyStatistics, QueryExecutionFeedback,
69    QueryFeedbackHistory, SelectivityFeedbackManager, StatisticsManager, TagStatistics,
70};
71
72pub use cost::{CostAssigner, CostCalculator, CostModelConfig, SelectivityEstimator};
73
74// Reexport the analysis module type.
75pub use analysis::{
76    AggregatedExpressionAnalysis, AnalysisOptions, BatchPlanAnalysis, BatchPlanAnalyzer,
77    ExpressionAnalysis, ReferenceCountAnalysis,
78};
79
80pub use context::OptimizationContext;
81
82// Re-export cost_based types (formerly strategy)
83pub use cost_based::{
84    AggregateContext, AggregateSelectionReason, AggregateStrategy, AggregateStrategyDecision,
85    AggregateStrategySelector, CandidateStart, DegreeInfo, DirectionContext,
86    DirectionSelectionReason, IndexSelection, IndexSelector, JoinCondition, JoinOrderOptimizer,
87    JoinOrderResult, KeepReason, OptimizationMethod, PredicateOperator, PropertyPredicate,
88    SortContext, SortEliminationDecision, SortEliminationOptimizer, SortKeepReason,
89    SubqueryUnnestingOptimizer, TableInfo, TopNConversionReason, TraversalDirection,
90    TraversalDirectionDecision, TraversalDirectionOptimizer, TraversalSelectionReason,
91    TraversalStartSelector, UnnestDecision, UnnestReason,
92};
93
94// Re-export the CTE cache types from the cache module.
95pub use crate::cache::{
96    CteCacheConfig, CteCacheDecision, CteCacheDecisionMaker, CteCacheEntry, CteCacheManager,
97    CteCacheStats,
98};
99
100// Re-export heuristic types
101pub use heuristic::{
102    BaseRewriteRule, EliminationRule, HeuristicRule, HeuristicRuleAdapter, IntoOptRule,
103    MatchedResult, MergeRule, NodeRewriter, PushDownRule, RewriteContext, RewriteError,
104    RewriteRule, RuleWrapper, TransformResult,
105};
106
107pub use decision::{
108    AccessPath, EntityIndexChoice, EntityType, IndexChoice, IndexSelectionDecision, JoinAlgorithm,
109    JoinOrderDecision, OptimizationDecision, RewriteRuleId, TraversalStartDecision,
110};