pub use crate::loading::optimizer::{
ExecutionResult, ExecutionStats, OptimizationStrategy, PlanAnalysis, PlanExecutor, QueryNode,
QueryOptimizer, QueryPlan, RiskLevel,
};
use crate::{
error::OrmResult,
loading::{
batch_loader::BatchLoader,
optimizer::{
analyzer::QueryOptimizer as NewQueryOptimizer,
executor::PlanExecutor as NewPlanExecutor,
},
},
};
use serde_json::Value as JsonValue;
use std::collections::HashMap;
pub struct OptimizedQueryExecutor {
executor: NewPlanExecutor,
optimizer: NewQueryOptimizer,
}
impl OptimizedQueryExecutor {
pub fn new(batch_loader: BatchLoader) -> Self {
Self {
executor: NewPlanExecutor::new(batch_loader),
optimizer: NewQueryOptimizer::new(),
}
}
pub async fn execute_optimized(
&self,
plan: &mut QueryPlan,
connection: &sqlx::PgPool,
) -> OrmResult<HashMap<String, Vec<JsonValue>>> {
let _strategies = self.optimizer.optimize_plan(plan)?;
let result = self.executor.execute_plan(plan, connection).await?;
Ok(result.results)
}
pub async fn execute_with_analysis(
&self,
plan: &mut QueryPlan,
connection: &sqlx::PgPool,
) -> OrmResult<(HashMap<String, Vec<JsonValue>>, ExecutionStats)> {
let _strategies = self.optimizer.optimize_plan(plan)?;
let result = self.executor.execute_plan(plan, connection).await?;
Ok((result.results, result.stats))
}
pub fn analyze_plan(&self, plan: &QueryPlan) -> OrmResult<PlanAnalysis> {
self.optimizer.analyze_plan(plan)
}
}