elif_orm/loading/
query_optimizer.rs1pub 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
22pub struct OptimizedQueryExecutor {
24 executor: NewPlanExecutor,
25 optimizer: NewQueryOptimizer,
26}
27
28impl OptimizedQueryExecutor {
29 pub fn new(batch_loader: BatchLoader) -> Self {
31 Self {
32 executor: NewPlanExecutor::new(batch_loader),
33 optimizer: NewQueryOptimizer::new(),
34 }
35 }
36
37 pub async fn execute_optimized(
39 &self,
40 plan: &mut QueryPlan,
41 connection: &sqlx::PgPool,
42 ) -> OrmResult<HashMap<String, Vec<JsonValue>>> {
43 let _strategies = self.optimizer.optimize_plan(plan)?;
45
46 let result = self.executor.execute_plan(plan, connection).await?;
48
49 Ok(result.results)
50 }
51
52 pub async fn execute_with_analysis(
54 &self,
55 plan: &mut QueryPlan,
56 connection: &sqlx::PgPool,
57 ) -> OrmResult<(HashMap<String, Vec<JsonValue>>, ExecutionStats)> {
58 let _strategies = self.optimizer.optimize_plan(plan)?;
60
61 let result = self.executor.execute_plan(plan, connection).await?;
63
64 Ok((result.results, result.stats))
65 }
66
67 pub fn analyze_plan(&self, plan: &QueryPlan) -> OrmResult<PlanAnalysis> {
69 self.optimizer.analyze_plan(plan)
70 }
71}