use std::sync::Arc;
use std::sync::Mutex;
use std::collections::HashMap;
use std::sync::atomic::AtomicU64;
use crate::optimizer::heuristic::batch::{BatchStatistics, OptimizationBatch};
use crate::optimizer::heuristic::{LogicalBatchOptimizer, PhysicalHeuristicOptimizer};
use crate::optimizer::partitioning::PartitioningPlanner;
use crate::optimizer::stats::feedback::cardinality::CardinalityFeedbackManager;
use crate::optimizer::stats::feedback::decision::DecisionFeedbackStore;
use crate::optimizer::stats::feedback::history::QueryFeedbackHistory;
use crate::optimizer::stats::feedback::selectivity::SelectivityFeedbackManager;
use crate::optimizer::stats::feedback::trigger::AutoFeedbackTrigger;
use crate::optimizer::{
BatchPlanAnalyzer, CostCalculator, CostModelConfig, CteCacheManager, SelectivityEstimator,
StatisticsManager, SubqueryUnnestingOptimizer,
};
use linkrs_core::types::expr::expression_context::ExpressionAnalysisContext;
mod config;
mod factorization;
mod feedback;
mod optimizer;
#[cfg(test)]
#[allow(unused_imports)]
pub use config::*;
#[allow(unused_imports)]
pub use factorization::*;
#[allow(unused_imports)]
pub use optimizer::*;
#[derive(Debug)]
pub struct OptimizerEngine {
expression_context: Arc<ExpressionAnalysisContext>,
stats_manager: Arc<StatisticsManager>,
cte_cache_manager: Arc<CteCacheManager>,
cost_calculator: Arc<CostCalculator>,
selectivity_estimator: Arc<SelectivityEstimator>,
batch_plan_analyzer: BatchPlanAnalyzer,
subquery_unnesting_optimizer: SubqueryUnnestingOptimizer,
cost_config: CostModelConfig,
space_cost_configs: parking_lot::RwLock<HashMap<String, CostModelConfig>>,
space_calculators: parking_lot::RwLock<HashMap<String, Arc<CostCalculator>>>,
cost_epoch: AtomicU64,
logical_heuristic: LogicalBatchOptimizer,
physical_heuristic: PhysicalHeuristicOptimizer,
last_batch_statistics: Mutex<Vec<(OptimizationBatch, BatchStatistics)>>,
partitioning_planner: PartitioningPlanner,
enable_heuristic: bool,
max_heuristic_iterations: usize,
feedback_history: Arc<QueryFeedbackHistory>,
selectivity_feedback: Arc<SelectivityFeedbackManager>,
cardinality_feedback: Arc<CardinalityFeedbackManager>,
decision_feedback: Arc<DecisionFeedbackStore>,
feedback_trigger: AutoFeedbackTrigger,
enable_feedback: bool,
feedback_applied_seq: parking_lot::Mutex<HashMap<String, u64>>,
columnar_policy: Arc<crate::executor::streaming::chunk::ColumnarPolicy>,
metrics_stats: Option<Arc<linkrs_metrics::StatsManager>>,
}
impl Default for OptimizerEngine {
fn default() -> Self {
Self::new(CostModelConfig::default())
}
}
#[cfg(test)]
mod tests;