gitql_engine/
engine_filter.rs1use gitql_ast::expression::Expr;
2use gitql_core::environment::Environment;
3use gitql_core::object::Row;
4use gitql_core::values::boolean::BoolValue;
5
6use crate::engine_evaluator::evaluate_expression;
7
8#[inline(always)]
9#[allow(clippy::borrowed_box)]
10pub(crate) fn apply_filter_operation(
11 env: &mut Environment,
12 condition: &Box<dyn Expr>,
13 titles: &[String],
14 rows: &mut Vec<Row>,
15) -> Result<(), String> {
16 let mut positions_to_delete = vec![];
17 for (index, row) in rows.iter().enumerate() {
18 let expression = evaluate_expression(env, condition, titles, &row.values)?;
19 if let Some(bool_value) = expression.as_any().downcast_ref::<BoolValue>() {
20 if !bool_value.value {
21 positions_to_delete.push(index);
22 }
23 }
24 }
25
26 for position in positions_to_delete.iter().rev() {
27 rows.remove(*position);
28 }
29
30 Ok(())
31}