Skip to content

Commit 338ace9

Browse files
authored
chore(batch): reuse common logical for index selection (risingwavelabs#8531)
1 parent eb56b9f commit 338ace9

File tree

3 files changed

+6
-26
lines changed

3 files changed

+6
-26
lines changed

src/frontend/src/optimizer/plan_node/logical_join.rs

Lines changed: 2 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -407,20 +407,10 @@ impl LogicalJoin {
407407
result_plan = Some(lookup_join);
408408
}
409409

410-
let required_col_idx = logical_scan.required_col_idx();
411410
let indexes = logical_scan.indexes();
412411
for index in indexes {
413-
let p2s_mapping = index.primary_to_secondary_mapping();
414-
if required_col_idx.iter().all(|x| p2s_mapping.contains_key(x)) {
415-
// Covering index selection
416-
let index_scan: PlanRef = logical_scan
417-
.to_index_scan(
418-
&index.name,
419-
index.index_table.table_desc().into(),
420-
p2s_mapping,
421-
)
422-
.into();
423-
412+
if let Some(index_scan) = logical_scan.to_index_scan_if_index_covered(index) {
413+
let index_scan: PlanRef = index_scan.into();
424414
let that = self.clone_with_left_right(self.left(), index_scan.clone());
425415
let new_logical_join = logical_join.clone_with_left_right(
426416
logical_join.left(),

src/frontend/src/optimizer/plan_node/logical_scan.rs

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -664,12 +664,11 @@ impl ToBatch for LogicalScan {
664664
if let Some(applied) = index_selection_rule.apply(new.clone().into()) {
665665
if let Some(scan) = applied.as_logical_scan() {
666666
// covering index
667-
return required_order.enforce_if_not_satisfies(scan.to_batch().unwrap());
667+
return required_order.enforce_if_not_satisfies(scan.to_batch()?);
668668
} else if let Some(join) = applied.as_logical_join() {
669669
// index lookup join
670-
return required_order.enforce_if_not_satisfies(
671-
join.index_lookup_join_to_batch_lookup_join().unwrap(),
672-
);
670+
return required_order
671+
.enforce_if_not_satisfies(join.index_lookup_join_to_batch_lookup_join()?);
673672
} else {
674673
unreachable!();
675674
}

src/frontend/src/optimizer/rule/index_selection_rule.rs

Lines changed: 1 addition & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -106,17 +106,8 @@ impl Rule for IndexSelectionRule {
106106
let mut final_plan: PlanRef = logical_scan.clone().into();
107107
let mut min_cost = primary_cost.clone();
108108

109-
let required_col_idx = logical_scan.required_col_idx();
110109
for index in indexes {
111-
let p2s_mapping = index.primary_to_secondary_mapping();
112-
if required_col_idx.iter().all(|x| p2s_mapping.contains_key(x)) {
113-
// covering index selection
114-
let index_scan = logical_scan.to_index_scan(
115-
&index.name,
116-
index.index_table.table_desc().into(),
117-
p2s_mapping,
118-
);
119-
110+
if let Some(index_scan) = logical_scan.to_index_scan_if_index_covered(index) {
120111
let index_cost = self.estimate_table_scan_cost(
121112
&index_scan,
122113
TableScanIoEstimator::estimate_row_size(&index_scan),

0 commit comments

Comments
 (0)