use std::collections::BTreeSet;
use super::{config::ParallelSearchConfig, reorder::JoinEdge, state::CascadingFilterState};
use crate::optimizer::aggregate_analysis::AggregateAnalysis;
pub(super) struct JoinOrderContext {
pub all_tables: BTreeSet<String>,
pub edges: Vec<JoinEdge>,
pub table_cardinalities: std::collections::HashMap<String, usize>,
pub table_base_cardinalities: std::collections::HashMap<String, usize>,
pub edge_selectivities: std::collections::HashMap<(String, String), f64>,
pub config: ParallelSearchConfig,
#[allow(dead_code)]
pub aggregate_analysis: Option<AggregateAnalysis>,
}
impl JoinOrderContext {
pub fn create_initial_filter_state(&self) -> CascadingFilterState {
let mut state = CascadingFilterState::new();
for table in &self.all_tables {
let filtered_card = self.table_cardinalities.get(table).copied().unwrap_or(10000);
let base_card =
self.table_base_cardinalities.get(table).copied().unwrap_or(filtered_card);
if filtered_card < base_card && base_card > 0 {
let selectivity = filtered_card as f64 / base_card as f64;
state.add_filtered_table(table.clone(), selectivity);
if self.config.verbose {
eprintln!(
"[CASCADE_FILTER] Table {} marked as filtered: {} -> {} (selectivity: {:.4})",
table, base_card, filtered_card, selectivity
);
}
}
}
state
}
}