Skip to content

Commit 2ee98c3

Browse files
ice1000kwannoel
authored andcommitted
refactor(plan_node_fmt): initial rewrite of fmt_with_name based on pretty_xmlish (#10132)
1 parent 0a88f41 commit 2ee98c3

File tree

11 files changed

+130
-20
lines changed

11 files changed

+130
-20
lines changed

src/frontend/src/optimizer/plan_node/generic/dedup.rs

Lines changed: 18 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,9 +15,10 @@
1515
use std::fmt;
1616

1717
use itertools::Itertools;
18+
use pretty_xmlish::Pretty;
1819
use risingwave_common::catalog::{FieldDisplay, Schema};
1920

20-
use super::{GenericPlanNode, GenericPlanRef};
21+
use super::{DistillUnit, GenericPlanNode, GenericPlanRef};
2122
use crate::optimizer::property::FunctionalDependencySet;
2223
use crate::OptimizerContextRef;
2324

@@ -41,6 +42,22 @@ impl<PlanRef: GenericPlanRef> Dedup<PlanRef> {
4142
.map(|i| FieldDisplay(self.input.schema().fields.get(*i).unwrap()))
4243
.collect_vec()
4344
}
45+
46+
fn dedup_cols_pretty<'a>(&self) -> Pretty<'a> {
47+
Pretty::Array(
48+
self.dedup_cols
49+
.iter()
50+
.map(|i| FieldDisplay(self.input.schema().fields.get(*i).unwrap()))
51+
.map(|fd| Pretty::display(&fd))
52+
.collect(),
53+
)
54+
}
55+
}
56+
57+
impl<PlanRef: GenericPlanRef> DistillUnit for Dedup<PlanRef> {
58+
fn distill_with_name<'a>(&self, name: &'a str) -> Pretty<'a> {
59+
Pretty::childless_record(name, vec![("dedup_cols", self.dedup_cols_pretty())])
60+
}
4461
}
4562

4663
impl<PlanRef: GenericPlanRef> GenericPlanNode for Dedup<PlanRef> {

src/frontend/src/optimizer/plan_node/generic/delete.rs

Lines changed: 13 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,9 +13,10 @@
1313
// limitations under the License.
1414
use std::fmt;
1515

16+
use pretty_xmlish::Pretty;
1617
use risingwave_common::catalog::{Schema, TableVersionId};
1718

18-
use super::GenericPlanRef;
19+
use super::{DistillUnit, GenericPlanRef};
1920
use crate::catalog::TableId;
2021
use crate::OptimizerContextRef;
2122

@@ -69,3 +70,14 @@ impl<PlanRef> Delete<PlanRef> {
6970
)
7071
}
7172
}
73+
74+
impl<PlanRef> DistillUnit for Delete<PlanRef> {
75+
fn distill_with_name<'a>(&self, name: &'a str) -> Pretty<'a> {
76+
let mut vec = Vec::with_capacity(if self.returning { 2 } else { 1 });
77+
vec.push(("table", Pretty::Text(self.table_name.clone().into())));
78+
if self.returning {
79+
vec.push(("returning", Pretty::display(&true)));
80+
}
81+
Pretty::childless_record(name, vec)
82+
}
83+
}

src/frontend/src/optimizer/plan_node/generic/except.rs

Lines changed: 7 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -14,9 +14,10 @@
1414

1515
use std::fmt;
1616

17+
use pretty_xmlish::Pretty;
1718
use risingwave_common::catalog::Schema;
1819

19-
use super::{GenericPlanNode, GenericPlanRef};
20+
use super::{DistillUnit, GenericPlanNode, GenericPlanRef};
2021
use crate::optimizer::optimizer_context::OptimizerContextRef;
2122
use crate::optimizer::property::FunctionalDependencySet;
2223

@@ -49,11 +50,13 @@ impl<PlanRef: GenericPlanRef> GenericPlanNode for Except<PlanRef> {
4950
impl<PlanRef: GenericPlanRef> Except<PlanRef> {
5051
pub fn fmt_with_name(&self, f: &mut fmt::Formatter<'_>, name: &str) -> fmt::Result {
5152
let mut builder = f.debug_struct(name);
52-
self.fmt_fields_with_builder(&mut builder);
53+
builder.field("all", &self.all);
5354
builder.finish()
5455
}
56+
}
5557

56-
pub fn fmt_fields_with_builder(&self, builder: &mut fmt::DebugStruct<'_, '_>) {
57-
builder.field("all", &self.all);
58+
impl<PlanRef> DistillUnit for Except<PlanRef> {
59+
fn distill_with_name<'a>(&self, name: &'a str) -> Pretty<'a> {
60+
Pretty::childless_record(name, vec![("all", Pretty::debug(&self.all))])
5861
}
5962
}

src/frontend/src/optimizer/plan_node/generic/expand.rs

Lines changed: 25 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -15,11 +15,12 @@
1515
use std::fmt;
1616

1717
use itertools::Itertools;
18+
use pretty_xmlish::Pretty;
1819
use risingwave_common::catalog::{Field, FieldDisplay, Schema};
1920
use risingwave_common::types::DataType;
2021
use risingwave_common::util::column_index_mapping::ColIndexMapping;
2122

22-
use super::{GenericPlanNode, GenericPlanRef};
23+
use super::{DistillUnit, GenericPlanNode, GenericPlanRef};
2324
use crate::optimizer::optimizer_context::OptimizerContextRef;
2425
use crate::optimizer::property::FunctionalDependencySet;
2526

@@ -100,8 +101,30 @@ impl<PlanRef: GenericPlanRef> GenericPlanNode for Expand<PlanRef> {
100101
}
101102
}
102103

104+
impl<PlanRef: GenericPlanRef> DistillUnit for Expand<PlanRef> {
105+
fn distill_with_name<'a>(&self, name: &'a str) -> Pretty<'a> {
106+
Pretty::childless_record(name, vec![("column_subsets", self.column_subsets_pretty())])
107+
}
108+
}
109+
103110
impl<PlanRef: GenericPlanRef> Expand<PlanRef> {
104-
pub fn column_subsets_display(&self) -> Vec<Vec<FieldDisplay<'_>>> {
111+
fn column_subsets_pretty<'a>(&self) -> Pretty<'a> {
112+
Pretty::Array(
113+
self.column_subsets
114+
.iter()
115+
.map(|subset| {
116+
subset
117+
.iter()
118+
.map(|&i| FieldDisplay(self.input.schema().fields.get(i).unwrap()))
119+
.map(|d| Pretty::display(&d))
120+
.collect()
121+
})
122+
.map(Pretty::Array)
123+
.collect(),
124+
)
125+
}
126+
127+
fn column_subsets_display(&self) -> Vec<Vec<FieldDisplay<'_>>> {
105128
self.column_subsets
106129
.iter()
107130
.map(|subset| {

src/frontend/src/optimizer/plan_node/generic/mod.rs

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@
1212
// See the License for the specific language governing permissions and
1313
// limitations under the License.
1414

15+
use pretty_xmlish::Pretty;
1516
use risingwave_common::catalog::Schema;
1617

1718
use super::{stream, EqJoinPredicate};
@@ -57,6 +58,10 @@ pub use update::*;
5758
mod delete;
5859
pub use delete::*;
5960

61+
pub trait DistillUnit {
62+
fn distill_with_name<'a>(&self, name: &'a str) -> Pretty<'a>;
63+
}
64+
6065
pub trait GenericPlanRef {
6166
fn schema(&self) -> &Schema;
6267
fn logical_pk(&self) -> &[usize];

src/frontend/src/optimizer/plan_node/generic/over_window.rs

Lines changed: 16 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,14 +15,15 @@
1515
use std::fmt;
1616

1717
use itertools::Itertools;
18+
use pretty_xmlish::Pretty;
1819
use risingwave_common::catalog::{Field, Schema};
1920
use risingwave_common::types::DataType;
2021
use risingwave_common::util::column_index_mapping::ColIndexMapping;
2122
use risingwave_common::util::sort_util::{ColumnOrder, ColumnOrderDisplay};
2223
use risingwave_expr::function::window::{Frame, WindowFuncKind};
2324
use risingwave_pb::expr::PbWindowFunction;
2425

25-
use super::{GenericPlanNode, GenericPlanRef};
26+
use super::{DistillUnit, GenericPlanNode, GenericPlanRef};
2627
use crate::expr::{InputRef, InputRefDisplay};
2728
use crate::optimizer::property::FunctionalDependencySet;
2829
use crate::utils::ColIndexMappingRewriteExt;
@@ -178,6 +179,20 @@ impl<PlanRef: GenericPlanRef> OverWindow<PlanRef> {
178179
}
179180
}
180181

182+
impl<PlanRef: GenericPlanRef> DistillUnit for OverWindow<PlanRef> {
183+
fn distill_with_name<'a>(&self, name: &'a str) -> Pretty<'a> {
184+
let f = |func| {
185+
Pretty::debug(&PlanWindowFunctionDisplay {
186+
window_function: func,
187+
input_schema: self.input.schema(),
188+
})
189+
};
190+
let wf = Pretty::Array(self.window_functions.iter().map(f).collect());
191+
let vec = vec![("window_functions", wf)];
192+
Pretty::childless_record(name, vec)
193+
}
194+
}
195+
181196
impl<PlanRef: GenericPlanRef> GenericPlanNode for OverWindow<PlanRef> {
182197
fn functional_dependency(&self) -> FunctionalDependencySet {
183198
let mapping =

src/frontend/src/optimizer/plan_node/generic/project_set.rs

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,10 +14,11 @@
1414

1515
use std::fmt;
1616

17+
use pretty_xmlish::Pretty;
1718
use risingwave_common::catalog::{Field, Schema};
1819
use risingwave_common::types::DataType;
1920

20-
use super::{GenericPlanNode, GenericPlanRef};
21+
use super::{DistillUnit, GenericPlanNode, GenericPlanRef};
2122
use crate::expr::{Expr, ExprDisplay, ExprImpl, ExprRewriter};
2223
use crate::optimizer::optimizer_context::OptimizerContextRef;
2324
use crate::optimizer::plan_node::batch::BatchPlanRef;
@@ -58,6 +59,13 @@ impl<PlanRef> ProjectSet<PlanRef> {
5859
}
5960
}
6061

62+
impl<PlanRef> DistillUnit for ProjectSet<PlanRef> {
63+
fn distill_with_name<'a>(&self, name: &'a str) -> Pretty<'a> {
64+
let fields = vec![("select_list", Pretty::debug(&self.select_list))];
65+
Pretty::childless_record(name, fields)
66+
}
67+
}
68+
6169
impl<PlanRef: GenericPlanRef> GenericPlanNode for ProjectSet<PlanRef> {
6270
fn schema(&self) -> Schema {
6371
let input_schema = self.input.schema();

src/frontend/src/optimizer/plan_node/generic/top_n.rs

Lines changed: 23 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,11 +15,12 @@
1515
use std::collections::HashSet;
1616
use std::fmt;
1717

18+
use pretty_xmlish::Pretty;
1819
use risingwave_common::catalog::Schema;
1920
use risingwave_common::util::sort_util::OrderType;
2021

2122
use super::super::utils::TableCatalogBuilder;
22-
use super::{stream, GenericPlanNode, GenericPlanRef};
23+
use super::{stream, DistillUnit, GenericPlanNode, GenericPlanRef};
2324
use crate::optimizer::optimizer_context::OptimizerContextRef;
2425
use crate::optimizer::property::{FunctionalDependencySet, Order, OrderDisplay};
2526
use crate::TableCatalog;
@@ -146,6 +147,27 @@ impl<PlanRef: GenericPlanRef> TopN<PlanRef> {
146147
}
147148
}
148149

150+
impl<PlanRef: GenericPlanRef> DistillUnit for TopN<PlanRef> {
151+
fn distill_with_name<'a>(&self, name: &'a str) -> Pretty<'a> {
152+
let mut vec = Vec::with_capacity(5);
153+
let input_schema = self.input.schema();
154+
let order_d = Pretty::display(&OrderDisplay {
155+
order: &self.order,
156+
input_schema,
157+
});
158+
vec.push(("order", order_d));
159+
vec.push(("limit", Pretty::debug(&self.limit_attr.limit())));
160+
vec.push(("offset", Pretty::debug(&self.offset)));
161+
if self.limit_attr.with_ties() {
162+
vec.push(("with_ties", Pretty::debug(&true)));
163+
}
164+
if !self.group_key.is_empty() {
165+
vec.push(("group_key", Pretty::debug(&self.group_key)));
166+
}
167+
Pretty::childless_record(name, vec)
168+
}
169+
}
170+
149171
impl<PlanRef: GenericPlanRef> GenericPlanNode for TopN<PlanRef> {
150172
fn schema(&self) -> Schema {
151173
self.input.schema().clone()

src/frontend/src/optimizer/plan_node/generic/update.rs

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,8 +16,10 @@ use std::fmt;
1616
use std::hash::Hash;
1717

1818
use educe::Educe;
19+
use pretty_xmlish::Pretty;
1920
use risingwave_common::catalog::TableVersionId;
2021

22+
use super::DistillUnit;
2123
use crate::catalog::TableId;
2224
use crate::expr::{ExprImpl, ExprRewriter};
2325

@@ -76,3 +78,15 @@ impl<PlanRef: Eq + Hash> Update<PlanRef> {
7678
.collect();
7779
}
7880
}
81+
82+
impl<PlanRef: Eq + Hash> DistillUnit for Update<PlanRef> {
83+
fn distill_with_name<'a>(&self, name: &'a str) -> Pretty<'a> {
84+
let mut vec = Vec::with_capacity(if self.returning { 3 } else { 2 });
85+
vec.push(("table", Pretty::Text(self.table_name.clone().into())));
86+
vec.push(("exprs", Pretty::debug(&self.exprs)));
87+
if self.returning {
88+
vec.push(("returning", Pretty::display(&true)));
89+
}
90+
Pretty::childless_record(name, vec)
91+
}
92+
}

src/frontend/src/optimizer/plan_node/logical_except.rs

Lines changed: 0 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -50,10 +50,6 @@ impl LogicalExcept {
5050
self.core.fmt_with_name(f, name)
5151
}
5252

53-
pub fn fmt_fields_with_builder(&self, builder: &mut fmt::DebugStruct<'_, '_>) {
54-
self.core.fmt_fields_with_builder(builder)
55-
}
56-
5753
pub fn all(&self) -> bool {
5854
self.core.all
5955
}

src/frontend/src/optimizer/plan_node/logical_project.rs

Lines changed: 0 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -88,11 +88,6 @@ impl LogicalProject {
8888
self.core.fmt_with_name(f, name, self.base.schema())
8989
}
9090

91-
pub fn fmt_fields_with_builder(&self, builder: &mut fmt::DebugStruct<'_, '_>) {
92-
self.core
93-
.fmt_fields_with_builder(builder, self.base.schema())
94-
}
95-
9691
pub fn is_identity(&self) -> bool {
9792
self.core.is_identity()
9893
}

0 commit comments

Comments
 (0)