elif_orm/loading/
query_optimizer.rs

1// Legacy compatibility layer - use the new optimizer module for new code
2// This file maintains backward compatibility while redirecting to the new modular structure
3
4pub use crate::loading::optimizer::{
5    ExecutionResult, ExecutionStats, OptimizationStrategy, PlanAnalysis, PlanExecutor, QueryNode,
6    QueryOptimizer, QueryPlan, RiskLevel,
7};
8
9use crate::{
10    error::OrmResult,
11    loading::{
12        batch_loader::BatchLoader,
13        optimizer::{
14            analyzer::QueryOptimizer as NewQueryOptimizer,
15            executor::PlanExecutor as NewPlanExecutor,
16        },
17    },
18};
19use serde_json::Value as JsonValue;
20use std::collections::HashMap;
21
22/// Legacy OptimizedQueryExecutor - now wraps the new modular implementation
23pub struct OptimizedQueryExecutor {
24    executor: NewPlanExecutor,
25    optimizer: NewQueryOptimizer,
26}
27
28impl OptimizedQueryExecutor {
29    /// Create a new optimized query executor
30    pub fn new(batch_loader: BatchLoader) -> Self {
31        Self {
32            executor: NewPlanExecutor::new(batch_loader),
33            optimizer: NewQueryOptimizer::new(),
34        }
35    }
36
37    /// Execute a query plan with optimization
38    pub async fn execute_optimized(
39        &self,
40        plan: &mut QueryPlan,
41        connection: &sqlx::PgPool,
42    ) -> OrmResult<HashMap<String, Vec<JsonValue>>> {
43        // Optimize the plan first
44        let _strategies = self.optimizer.optimize_plan(plan)?;
45
46        // Execute the optimized plan
47        let result = self.executor.execute_plan(plan, connection).await?;
48
49        Ok(result.results)
50    }
51
52    /// Execute plan with detailed analysis
53    pub async fn execute_with_analysis(
54        &self,
55        plan: &mut QueryPlan,
56        connection: &sqlx::PgPool,
57    ) -> OrmResult<(HashMap<String, Vec<JsonValue>>, ExecutionStats)> {
58        // Optimize the plan first
59        let _strategies = self.optimizer.optimize_plan(plan)?;
60
61        // Execute the optimized plan
62        let result = self.executor.execute_plan(plan, connection).await?;
63
64        Ok((result.results, result.stats))
65    }
66
67    /// Analyze a query plan without executing it
68    pub fn analyze_plan(&self, plan: &QueryPlan) -> OrmResult<PlanAnalysis> {
69        self.optimizer.analyze_plan(plan)
70    }
71}