use super::backward_pass::{compute_input_range_backward, InputRange};
use super::*;
pub fn compute_input_lower_bound_for_query(
statement: &TypedStatement,
output_lower_bound: Timestamp,
field: &SimpleIdentifier,
) -> Result<Timestamp, IncrementalAnalysisError> {
check_no_template_parameters(statement)?;
if !statement.side_effect.is_none() {
return Err(IncrementalAnalysisError::DmlNotSupported);
}
let mut requirements = HashMap::new();
let mut earliest = compute_input_range_backward(
&statement.pipeline,
&mut requirements,
InputRange {
start: output_lower_bound,
end: None,
},
field,
false,
)?;
for definition in statement.pipeline_defs.iter().rev() {
let name = definition
.name
.valid_ref()
.map_err(|e| IncrementalAnalysisError::TreeHadError(e.as_ref().clone()))?;
if let Some(start) = requirements.remove(name) {
earliest = earliest.union(compute_input_range_backward(
&definition.pipeline,
&mut requirements,
start,
field,
false,
)?);
}
}
Ok(earliest.start.min(output_lower_bound))
}