use crate::catalog::Catalog;
use crate::optimizer::plan_tree::PlanTree;
use std::collections::HashMap;
#[derive(Debug, Default)]
pub struct Optimizer {
relation_cardinality: HashMap<u64, u64>, }
impl Optimizer {
pub fn new() -> Self {
Self {
relation_cardinality: HashMap::new(),
}
}
pub fn get_cardinality(&self, rel_fp: u64) -> Option<u64> {
self.relation_cardinality.get(&rel_fp).copied()
}
pub fn set_cardinality(&mut self, rel_fp: u64, card: u64) {
self.relation_cardinality.insert(rel_fp, card);
}
pub fn plan_stratum(&self, catalogs: &[Catalog]) -> Vec<Option<(usize, usize)>> {
catalogs
.iter()
.map(|catalog| {
if catalog.is_planned() {
None
} else {
let plan_tree = PlanTree::from_catalog(catalog);
Some(plan_tree.get_first_join_tuple_index())
}
})
.collect()
}
}