Expand description
Fuses multiple Filter
operators into one and canonicalizes predicates.
If the Filter
operator is empty, removes it.
use mz_expr::{MirRelationExpr, MirScalarExpr};
use mz_repr::{SqlColumnType, Datum, SqlRelationType, SqlScalarType};
use mz_repr::optimize::OptimizerFeatures;
use mz_transform::{typecheck, Transform, TransformCtx};
use mz_transform::dataflow::DataflowMetainfo;
use mz_transform::fusion::filter::Filter;
let input = MirRelationExpr::constant(vec![], SqlRelationType::new(vec![
SqlScalarType::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()]);
let features = OptimizerFeatures::default();
let typecheck_ctx = typecheck::empty_context();
let mut df_meta = DataflowMetainfo::default();
let mut transform_ctx = TransformCtx::local(&features, &typecheck_ctx, &mut df_meta, None, None);
// Filter.transform() will deduplicate any predicates
Filter.transform(&mut expr, &mut transform_ctx);
let correct = input.filter(vec![predicate0]);
assert_eq!(expr, correct);
Structsยง
- Filter
- Fuses multiple
Filter
operators into one and deduplicates predicates.