lora_executor/pull/
columns.rs1use lora_compiler::physical::{PhysicalNodeId, PhysicalOp, PhysicalPlan};
2use lora_compiler::CompiledQuery;
3
4pub fn plan_result_columns(plan: &PhysicalPlan) -> Vec<String> {
14 plan_columns_at(plan, plan.root).unwrap_or_default()
15}
16
17fn plan_columns_at(plan: &PhysicalPlan, node: PhysicalNodeId) -> Option<Vec<String>> {
18 match &plan.nodes[node] {
19 PhysicalOp::Projection(p) => Some(p.items.iter().map(|i| i.name.to_string()).collect()),
20 PhysicalOp::HashAggregation(p) => Some(
21 p.group_by
22 .iter()
23 .chain(p.aggregates.iter())
24 .map(|i| i.name.to_string())
25 .collect(),
26 ),
27 PhysicalOp::Limit(p) => plan_columns_at(plan, p.input),
28 PhysicalOp::Sort(p) => plan_columns_at(plan, p.input),
29 PhysicalOp::PathBuild(p) => plan_columns_at(plan, p.input),
30 PhysicalOp::OptionalMatch(p) => plan_columns_at(plan, p.input),
31 PhysicalOp::CallSubquery(p) => plan_columns_at(plan, p.input),
34 PhysicalOp::Filter(p) => plan_columns_at(plan, p.input),
35 PhysicalOp::Unwind(p) => plan_columns_at(plan, p.input),
36 PhysicalOp::Create(p) => plan_columns_at(plan, p.input),
37 PhysicalOp::Merge(p) => plan_columns_at(plan, p.input),
38 PhysicalOp::Delete(p) => plan_columns_at(plan, p.input),
39 PhysicalOp::Set(p) => plan_columns_at(plan, p.input),
40 PhysicalOp::Remove(p) => plan_columns_at(plan, p.input),
41 PhysicalOp::Foreach(p) => plan_columns_at(plan, p.input),
42 PhysicalOp::Argument(_)
43 | PhysicalOp::NodeScan(_)
44 | PhysicalOp::NodeByLabelScan(_)
45 | PhysicalOp::NodeByPropertyScan(_)
46 | PhysicalOp::NodeByPropertyRangeScan(_)
47 | PhysicalOp::NodeByTextScan(_)
48 | PhysicalOp::NodeByPointScan(_)
49 | PhysicalOp::RelByPropertyRangeScan(_)
50 | PhysicalOp::RelByTextScan(_)
51 | PhysicalOp::RelByPointScan(_)
52 | PhysicalOp::Expand(_) => None,
53 }
54}
55
56pub fn compiled_result_columns(compiled: &CompiledQuery) -> Vec<String> {
59 plan_result_columns(&compiled.physical)
60}