sochdb_query/executor/
explain.rs1use crate::soch_ql::SochValue;
6use super::node::PlanNode;
7use super::types::{Row, Schema, ColumnMeta};
8use sochdb_core::Result;
9
10pub struct ExplainNode {
12 schema: Schema,
13 lines: Vec<String>,
14 pos: usize,
15}
16
17impl ExplainNode {
18 pub fn new(plan_text: String) -> Self {
19 let lines: Vec<String> = plan_text.lines().map(|l| l.to_string()).collect();
20 Self {
21 schema: Schema::new(vec![ColumnMeta::new("QUERY PLAN".to_string())]),
22 lines,
23 pos: 0,
24 }
25 }
26}
27
28impl PlanNode for ExplainNode {
29 fn schema(&self) -> &Schema {
30 &self.schema
31 }
32
33 fn next(&mut self) -> Result<Option<Row>> {
34 if self.pos < self.lines.len() {
35 let line = self.lines[self.pos].clone();
36 self.pos += 1;
37 Ok(Some(vec![SochValue::Text(line)]))
38 } else {
39 Ok(None)
40 }
41 }
42
43 fn reset(&mut self) -> Result<()> {
44 self.pos = 0;
45 Ok(())
46 }
47}
48
49pub fn describe_plan(node: &dyn PlanNode, _depth: usize) -> String {
51 let schema = node.schema();
53 let cols = schema.column_names().join(", ");
54 format!("Operator [columns={}]", cols)
55}
56
57pub fn format_plan_tree(description: &str) -> String {
64 description.to_string()
65}