risingwave_frontend/optimizer/plan_visitor/
share_parent_counter.rs1use std::collections::HashMap;
16
17use super::{DefaultBehavior, DefaultValue, LogicalPlanVisitor};
18use crate::optimizer::ShareId;
19use crate::optimizer::plan_node::{LogicalShare, PlanTreeNodeUnary, ShareNode};
20use crate::optimizer::plan_visitor::PlanVisitor;
21
22#[derive(Debug, Clone, Default)]
23pub struct ShareParentCounter {
24 parent_counter: HashMap<ShareId, usize>,
26}
27
28impl ShareParentCounter {
29 pub fn get_parent_num(&self, share: &LogicalShare) -> usize {
30 self.get_parent_num_by_id(share.share_id())
31 }
32
33 pub fn get_parent_num_by_id(&self, share_id: ShareId) -> usize {
34 *self
35 .parent_counter
36 .get(&share_id)
37 .expect("share must exist")
38 }
39}
40
41impl LogicalPlanVisitor for ShareParentCounter {
42 type Result = ();
43
44 type DefaultBehavior = impl DefaultBehavior<Self::Result>;
45
46 fn default_behavior() -> Self::DefaultBehavior {
47 DefaultValue
48 }
49
50 fn visit_logical_share(&mut self, share: &LogicalShare) {
51 let v = self
52 .parent_counter
53 .entry(share.share_id())
54 .and_modify(|counter| *counter += 1)
55 .or_insert(1);
56 if *v == 1 {
57 self.visit(share.input())
58 }
59 }
60}