vegafusion_runtime/transform/
filter.rs

1use crate::expression::compiler::compile;
2use crate::expression::compiler::config::CompilationConfig;
3use crate::transform::TransformTrait;
4use async_trait::async_trait;
5use datafusion::prelude::DataFrame;
6use vegafusion_common::datatypes::to_boolean;
7
8use vegafusion_core::error::Result;
9use vegafusion_core::proto::gen::transforms::Filter;
10use vegafusion_core::task_graph::task_value::TaskValue;
11
12#[async_trait]
13impl TransformTrait for Filter {
14    async fn eval(
15        &self,
16        dataframe: DataFrame,
17        config: &CompilationConfig,
18    ) -> Result<(DataFrame, Vec<TaskValue>)> {
19        let filter_expr = compile(
20            self.expr.as_ref().unwrap(),
21            config,
22            Some(dataframe.schema()),
23        )?;
24
25        // Cast filter expr to boolean
26        let filter_expr = to_boolean(filter_expr, dataframe.schema())?;
27        let result = dataframe.filter(filter_expr)?;
28        Ok((result, Default::default()))
29    }
30}