Plan a query with detailed tracing for EXPLAIN
(
&mut self,
document: &Document,
)
| 197 | |
| 198 | /// Plan a query with detailed tracing for EXPLAIN |
| 199 | pub fn plan_query_with_trace( |
| 200 | &mut self, |
| 201 | document: &Document, |
| 202 | ) -> Result<PlanTrace, PlanningError> { |
| 203 | let mut tracer = PlanTracer::new(); |
| 204 | |
| 205 | // Parse phase (already done, but record it) |
| 206 | tracer.trace_step( |
| 207 | PlanningPhase::Parsing, |
| 208 | "Parse GQL query into AST".to_string(), |
| 209 | TraceMetadata::empty(), |
| 210 | ); |
| 211 | |
| 212 | // Extract query from document |
| 213 | let query = match &document.statement { |
| 214 | crate::ast::Statement::Query(q) => q, |
| 215 | _ => { |
| 216 | return Err(PlanningError::InvalidQuery( |
| 217 | "Document does not contain a query statement".to_string(), |
| 218 | )) |
| 219 | } |
| 220 | }; |
| 221 | |
| 222 | // Generate logical plan |
| 223 | tracer.start_step( |
| 224 | PlanningPhase::LogicalPlanGeneration, |
| 225 | "Create logical plan from AST".to_string(), |
| 226 | ); |
| 227 | let logical_plan = self.create_logical_plan(query)?; |
| 228 | tracer.end_step( |
| 229 | PlanningPhase::LogicalPlanGeneration, |
| 230 | "Logical plan created successfully".to_string(), |
| 231 | None, |
| 232 | None, |
| 233 | None, |
| 234 | TraceMetadata::with_estimates(logical_plan.root.estimate_cardinality(), 0.0), |
| 235 | ); |
| 236 | |
| 237 | // Optimize logical plan |
| 238 | tracer.start_step( |
| 239 | PlanningPhase::LogicalOptimization, |
| 240 | "Apply logical optimizations".to_string(), |
| 241 | ); |
| 242 | let optimized_logical = self.optimize_logical_plan(logical_plan.clone())?; |
| 243 | tracer.end_step( |
| 244 | PlanningPhase::LogicalOptimization, |
| 245 | format!( |
| 246 | "Applied {} optimization level", |
| 247 | self.optimization_level_name() |
| 248 | ), |
| 249 | None, |
| 250 | None, |
| 251 | None, |
| 252 | TraceMetadata::with_optimization(self.optimization_level_name()), |
| 253 | ); |
| 254 | |
| 255 | // Convert to physical plan |
| 256 | tracer.start_step( |
no test coverage detected