use super::QueryPlan;
use crate::Error;
mod loads;
mod normalize;
#[cfg(test)]
mod tests;
const MAX_FIX_RUNS: usize = 1000;
pub(crate) trait Optimization {
fn apply(plan: &mut QueryPlan) -> Result<bool, Error>;
fn fix(plan: &mut QueryPlan) -> Result<bool, Error> {
for _ in 0..MAX_FIX_RUNS {
if !Self::apply(plan)? {
return Ok(false);
}
}
Ok(true)
}
}
impl<'src> QueryPlan<'src> {
pub fn optimize(mut self) -> Result<Self, Error> {
normalize::SplitTopLevelAnd::fix(&mut self)?;
normalize::CanonicalizeCheckNodeLabel::apply(&mut self)?;
normalize::MergeDuplicateUpdates::apply(&mut self)?;
loads::ReorderIdConstrainedFirst::fix(&mut self)?;
loads::LoadAnyToLoadExact::apply(&mut self)?;
loads::LoadAnyToLoadLabeled::apply(&mut self)?;
Ok(self)
}
}