pub struct UnionFanOut {
pub input: NodeId,
/* private fields */
}Expand description
UnionFanOut (union-fan-out.ts): one input, N branches, built over the
source. fetch delegates to the input; push broadcasts the change to every
branch (each a filter pipeline and/or a FlippedJoin)
then drives the paired UnionFanIn’s collapse. Unlike the filter
FanOut it operates on full nodes via side-effecting
Graph::push, not the return-based filter chain_push.
Fields§
§input: NodeIdImplementations§
Source§impl UnionFanOut
impl UnionFanOut
pub fn new(input: NodeId) -> UnionFanOut
Sourcepub fn fetch<'g>(
&'g self,
g: &'g Graph,
req: &FetchRequest,
) -> Box<dyn Iterator<Item = Node<'g>> + 'g>
pub fn fetch<'g>( &'g self, g: &'g Graph, req: &FetchRequest, ) -> Box<dyn Iterator<Item = Node<'g>> + 'g>
fetch delegates straight to the single input (union-fan-out.ts:43).
Sourcepub fn push<'g>(&'g self, g: &'g Graph, change: Change<'g>)
pub fn push<'g>(&'g self, g: &'g Graph, change: Change<'g>)
push (union-fan-out.ts:27): signal the fan-in, broadcast the same change
(relationships intact, any type including Child) to each branch, then drain the
fan-in’s accumulation. The branches side-effect-push their outputs to the fan-in.
The broadcast preserves relationships for every change type (the
materialize_change_preserving_node contract, mirroring graph.rs::fan_out_push):
a non-flipped EXISTS Join sits on the spine BELOW the fan-out, so the branches’
Exists gates count their gated relationship off the broadcast change’s node. The
materialize runs now, under the active source overlay (post-change membership —
see source_common::gen_push), then a fresh Change<'g> is rebuilt per branch (a
Change<'g> is neither Clone nor 'static).