Module transform::fusion::filter[][src]

Expand description

Fuses multiple Filter operators into one; deduplicates predicates.

If the Filter operator is empty, removes it.

use expr::{MirRelationExpr, MirScalarExpr};
use repr::{ColumnType, Datum, RelationType, ScalarType};

use transform::fusion::filter::Filter;

let input = MirRelationExpr::constant(vec![], RelationType::new(vec![
    ScalarType::Bool.nullable(false),
]));

let predicate0 = MirScalarExpr::Column(0);
let predicate1 = MirScalarExpr::Column(0);
let predicate2 = MirScalarExpr::Column(0);

let mut expr =
input
    .clone()
    .filter(vec![predicate0.clone()])
    .filter(vec![predicate1.clone()])
    .filter(vec![predicate2.clone()]);

// .transform() will deduplicate any predicates
use transform::{Transform, TransformArgs};
Filter.transform(&mut expr, TransformArgs {
  id_gen: &mut Default::default(),
  indexes: &std::collections::HashMap::new(),
});

let correct = input.filter(vec![predicate0]);

assert_eq!(expr, correct);

Structs

Fuses multiple Filter operators into one and deduplicates predicates.