Module mz_transform::fusion::filter
source · 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::{ColumnType, Datum, RelationType, ScalarType};
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![], 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()]);
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);
// Filter.transform() will deduplicate any predicates
Filter.transform(&mut expr, &mut transform_ctx);
let correct = input.filter(vec![predicate0]);
assert_eq!(expr, correct);
Structs§
- Fuses multiple
Filter
operators into one and deduplicates predicates.