use crate::{
context::{Env, EvalError},
value::Val,
};
use super::columnar;
use super::composed_exec;
use super::indexed_exec;
use super::legacy_exec;
use super::{PhysicalExecPath, Pipeline, PipelineData};
impl Pipeline {
pub fn run(&self, root: &Val) -> Result<Val, EvalError> {
self.run_with(root, None)
}
pub fn run_with(&self, root: &Val, cache: Option<&dyn PipelineData>) -> Result<Val, EvalError> {
let env = Env::new(root.clone());
self.run_with_env(root, &env, cache)
}
pub fn run_with_env(
&self,
root: &Val,
base_env: &Env,
cache: Option<&dyn PipelineData>,
) -> Result<Val, EvalError> {
match self.exec_path {
PhysicalExecPath::Indexed => {
if let Some(out) = indexed_exec::run(self, root, base_env) {
return out;
}
self.run_columnar_or_below(root, base_env, cache)
}
PhysicalExecPath::Columnar => self.run_columnar_or_below(root, base_env, cache),
PhysicalExecPath::Composed => composed_exec::run(self, root, base_env)
.unwrap_or_else(|| legacy_exec::run(self, root, base_env)),
PhysicalExecPath::Legacy => legacy_exec::run(self, root, base_env),
}
}
fn run_columnar_or_below(
&self,
root: &Val,
base_env: &Env,
cache: Option<&dyn PipelineData>,
) -> Result<Val, EvalError> {
if let Some(out) = columnar::run_cached(self, root, cache) {
return out;
}
if cache.is_none() {
if let Some(out) = columnar::run_uncached(self, root) {
return out;
}
}
composed_exec::run(self, root, base_env)
.unwrap_or_else(|| legacy_exec::run(self, root, base_env))
}
}