use crate::{
Result,
engine::{
eval,
exec::{Action, Exec, Output, VarId},
},
};
use toasty_core::driver::Rows;
#[derive(Debug)]
pub(crate) struct Filter {
pub(crate) input: VarId,
pub(crate) output: Output,
pub(crate) filter: eval::Func,
}
impl Exec<'_> {
pub(super) async fn action_filter(&mut self, action: &Filter) -> Result<()> {
let mut input_stream = self.vars.load(action.input).await?.into_value_stream();
let mut filtered_rows = vec![];
while let Some(res) = input_stream.next().await {
let value = res?;
if action.filter.eval_bool(std::slice::from_ref(&value))? {
filtered_rows.push(value);
}
}
self.vars.store(
action.output.var,
action.output.num_uses,
Rows::value_stream(filtered_rows),
);
Ok(())
}
}
impl From<Filter> for Action {
fn from(value: Filter) -> Self {
Action::Filter(value)
}
}