fn branch<F>(
id_gen: &mut IdGen,
outer: MirRelationExpr,
col_map: &ColumnMap,
cte_map: &mut BTreeMap<LocalId, CteDesc>,
inner: HirRelationExpr,
apply_requires_distinct_outer: bool,
context: &Context<'_>,
apply: F,
) -> Result<MirRelationExpr, PlanError>where
F: FnOnce(&mut IdGen, HirRelationExpr, MirRelationExpr, &ColumnMap, &mut BTreeMap<LocalId, CteDesc>, &Context<'_>) -> Result<MirRelationExpr, PlanError>,
Expand description
Prepare to apply inner
to outer
. Note that inner
is a correlated (SQL)
expression, while outer
is a non-correlated (dataflow) expression. inner
will, in effect, be executed once for every distinct row in outer
, and the
results will be joined with outer
. Note that columns in outer
that are
not depended upon by inner
are thrown away before the distinct, so that we
don’t perform needless computation of inner
.
branch
will inspect the contents of inner
to determine whether inner
is not multiplicity sensitive (roughly, contains only maps, filters,
projections, and calls to table functions). If it is not multiplicity
sensitive, branch
will not distinctify outer. If this is problematic,
e.g. because the apply
callback itself introduces multiplicity-sensitive
operations that were not present in inner
, then set
apply_requires_distinct_outer
to ensure that branch
chooses the plan
that distinctifies outer
.
The caller must supply the apply
function that applies the rewritten
inner
to outer
.