fn build_halfjoin<G, Tr, CF>(
    updates: Collection<G, (Row, G::Timestamp), Diff>,
    trace: Arranged<G, Tr>,
    trace_key_types: Option<Vec<ColumnType>>,
    trace_val_types: Option<Vec<ColumnType>>,
    prev_key: Vec<MirScalarExpr>,
    prev_thinning: Vec<usize>,
    comparison: CF,
    closure: JoinClosure,
    shutdown_token: ShutdownToken
) -> (Collection<G, (Row, G::Timestamp), Diff>, Collection<G, DataflowError, Diff>)where
    G: Scope,
    G::Timestamp: RenderTimestamp,
    Tr: TraceReader<Time = G::Timestamp, Diff = Diff> + Clone + 'static,
    Tr::KeyOwned: ExchangeData + Hashable + Default + FromRowByTypes + IntoRowByTypes,
    for<'a> Tr::Val<'a>: IntoRowByTypes,
    CF: Fn(&G::Timestamp, &G::Timestamp) -> bool + 'static,
Expand description

Constructs a half_join from supplied arguments.

This method exists to factor common logic from four code paths that are generic over the type of trace. The comparison function should either be le or lt depending on which relation comes first in the total order on relations (in order to break ties consistently).

The input and output streams are of pairs (data, time) where the time component can be greater than the time of the update. This operator may manipulate time as part of this pair, but will not manipulate the time of the update. This is crucial for correctness, as the total order on times of updates is used to ensure that any two updates are matched at most once.