The immutable state of the phase that can also be accessed by other phases.
The immutable state of the phase that can also be accessed by other phases.
Run the phase
Run the phase
Recursively push refs from the right-hand side of a Join to the left-hand side out the join.
Recursively push refs from the right-hand side of a Join to the left-hand side out the join.
This is only possible when they occur in a a mapping Bind(_, _, Pure(StructNode))
directly
at the RHS of a Join. Returns the (possibly transformed) Join and replacements for forward
paths into it.
TODO: If the remainder of the mapping Bind is purely aliasing, eliminate it entirely.
Merge nested mapping operations of the form Bind(_, Bind(_, _, Pure(StructNode(p1), _)), Pure(StructNode(p2), _))
into a single Bind, provided that each element of either p1 or p2 contains not more than one path.
Merge nested mapping operations of the form Bind(_, Bind(_, _, Pure(StructNode(p1), _)), Pure(StructNode(p2), _))
into a single Bind, provided that each element of either p1 or p2 contains not more than one path.
This transformation is not required for the correctness of join rewriting but it keeps the
tree smaller to speed up subsequent phases.
Recursively hoist Filter
out of of Bind(_, Filter, Pure(StructNode))
.
Recursively hoist Filter
out of of Bind(_, Filter, Pure(StructNode))
. Returns the possibly
modified tree plus a set of invalidated TypeSymbols (non-empty if additional columns
have to be added to the base projection for the filters).
Hoist Filter
nodes in Join
generators into join predicates.
The unique name of the phase
The unique name of the phase
In a Join(s1, _, _, Join(_, _, _, _, JoinType.Inner, on2), JoinType.Inner, on1)
where parts
of on2
refer to s1
, merge them into on1
.
In a Join(s1, _, _, Join(_, _, _, _, JoinType.Inner, on2), JoinType.Inner, on1)
where parts
of on2
refer to s1
, merge them into on1
. Nested joins are processed recursively. The
same is done in the opposite direction, pushing predicates down into sub-joins if they only
reference one side of the join.
Rewrite monadic joins to applicative joins. After this phase all
Bind
nodes are of the formBind(_, _, Pure(_, _))
(i.e.flatMap
has been reduced tomap
).