Skip to content

Commit c275ada

Browse files
authored
Merge pull request #7747 from Xuanwo/move-planner-out
refactor: Planner Code Cleanup
2 parents 7ef94fd + 91bf815 commit c275ada

File tree

4 files changed

+30
-54
lines changed

4 files changed

+30
-54
lines changed

src/query/planner/src/metadata.rs

+25-26
Original file line numberDiff line numberDiff line change
@@ -163,12 +163,32 @@ impl Metadata {
163163
table_index
164164
}
165165

166-
pub fn find_smallest_column_within(&self, indices: &[usize]) -> usize {
167-
let entries = indices
166+
/// find_smallest_column in given indices.
167+
pub fn find_smallest_column(&self, indices: &[usize]) -> usize {
168+
let mut smallest_index = indices.iter().min().expect("indices must be valid");
169+
let mut smallest_size = usize::MAX;
170+
for idx in indices.iter() {
171+
let entry = self.column(*idx);
172+
if let Ok(bytes) = entry.data_type.data_type_id().numeric_byte_size() {
173+
if smallest_size > bytes {
174+
smallest_size = bytes;
175+
smallest_index = &entry.column_index;
176+
}
177+
}
178+
}
179+
*smallest_index
180+
}
181+
182+
/// find_smallest_column_by_table_index by given table_index
183+
pub fn find_smallest_column_by_table_index(&self, table_index: IndexType) -> usize {
184+
let indices: Vec<usize> = self
185+
.columns
168186
.iter()
169-
.map(|i| self.column(*i).clone())
170-
.collect::<Vec<_>>();
171-
find_smallest_column(entries.as_slice())
187+
.filter(|v| v.table_index == Some(table_index))
188+
.map(|v| v.column_index)
189+
.collect();
190+
191+
self.find_smallest_column(&indices)
172192
}
173193
}
174194

@@ -295,24 +315,3 @@ impl ColumnEntry {
295315
self.path_indices.is_some()
296316
}
297317
}
298-
299-
/// TODO(xuanwo): migrate this as a function of metadata.
300-
pub fn find_smallest_column(entries: &[ColumnEntry]) -> usize {
301-
debug_assert!(!entries.is_empty());
302-
let mut column_indexes = entries
303-
.iter()
304-
.map(|entry| entry.column_index)
305-
.collect::<Vec<IndexType>>();
306-
column_indexes.sort();
307-
let mut smallest_index = column_indexes[0];
308-
let mut smallest_size = usize::MAX;
309-
for (idx, column_entry) in entries.iter().enumerate() {
310-
if let Ok(bytes) = column_entry.data_type.data_type_id().numeric_byte_size() {
311-
if smallest_size > bytes {
312-
smallest_size = bytes;
313-
smallest_index = entries[idx].column_index;
314-
}
315-
}
316-
}
317-
smallest_index
318-
}

src/query/service/src/sql/planner/metadata.rs

-23
Original file line numberDiff line numberDiff line change
@@ -14,9 +14,6 @@
1414

1515
use common_ast::ast::Expr;
1616
use common_ast::ast::Literal;
17-
use common_datavalues::prelude::*;
18-
use common_planner::ColumnEntry;
19-
use common_planner::IndexType;
2017

2118
pub fn optimize_remove_count_args(name: &str, distinct: bool, args: &[&Expr]) -> bool {
2219
name.eq_ignore_ascii_case("count")
@@ -25,23 +22,3 @@ pub fn optimize_remove_count_args(name: &str, distinct: bool, args: &[&Expr]) ->
2522
.iter()
2623
.all(|expr| matches!(expr, Expr::Literal{lit,..} if *lit!=Literal::Null))
2724
}
28-
29-
pub fn find_smallest_column(entries: &[ColumnEntry]) -> usize {
30-
debug_assert!(!entries.is_empty());
31-
let mut column_indexes = entries
32-
.iter()
33-
.map(|entry| entry.index())
34-
.collect::<Vec<IndexType>>();
35-
column_indexes.sort();
36-
let mut smallest_index = column_indexes[0];
37-
let mut smallest_size = usize::MAX;
38-
for (idx, column_entry) in entries.iter().enumerate() {
39-
if let Ok(bytes) = column_entry.data_type().data_type_id().numeric_byte_size() {
40-
if smallest_size > bytes {
41-
smallest_size = bytes;
42-
smallest_index = entries[idx].index();
43-
}
44-
}
45-
}
46-
smallest_index
47-
}

src/query/service/src/sql/planner/mod.rs

-1
Original file line numberDiff line numberDiff line change
@@ -39,7 +39,6 @@ pub use binder::Visibility;
3939
use common_catalog::catalog::CatalogManager;
4040
use common_planner::Metadata;
4141
use common_planner::MetadataRef;
42-
pub use metadata::find_smallest_column;
4342
pub use semantic::normalize_identifier;
4443
pub use semantic::IdentifierNormalizer;
4544
pub use semantic::NameResolutionContext;

src/query/service/src/sql/planner/optimizer/heuristic/prune_columns.rs

+5-4
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,6 @@ use common_exception::Result;
1717
use common_planner::MetadataRef;
1818
use itertools::Itertools;
1919

20-
use crate::sql::find_smallest_column;
2120
use crate::sql::optimizer::ColumnSet;
2221
use crate::sql::optimizer::RelExpr;
2322
use crate::sql::optimizer::SExpr;
@@ -90,7 +89,7 @@ impl ColumnPruner {
9089
let smallest_index = self
9190
.metadata
9291
.read()
93-
.find_smallest_column_within(prewhere_columns.as_slice());
92+
.find_smallest_column(prewhere_columns.as_slice());
9493
used.insert(smallest_index);
9594
}
9695
pw.output_columns = used.clone();
@@ -100,8 +99,10 @@ impl ColumnPruner {
10099
}
101100

102101
if used.is_empty() {
103-
let columns = self.metadata.read().columns_by_table_index(p.table_index);
104-
let smallest_index = find_smallest_column(&columns);
102+
let smallest_index = self
103+
.metadata
104+
.read()
105+
.find_smallest_column_by_table_index(p.table_index);
105106
used.insert(smallest_index);
106107
}
107108

0 commit comments

Comments
 (0)