pub enum Matching {
Unique,
Group,
Count,
Total,
}Expand description
What one probe of a join’s right side returns.
The two are not a detail of the index: they are what the expression the join replaced evaluated to, so a join that returned the wrong one would render a different page.
Variants§
Unique
An Op::MapValues index, whose keys are unique. Some(row) or None — which is what
map_get returned and what its callers match on.
Group
An Op::ArrangeBy index, whose keys are not. The whole group, in the indexed
collection’s own order, as a list — which is what the filter_list returned.
Count
The same index, asked how many rather than which — list_len over the same
filter_list, whose answer is an Int.
docs/99 §99.9 item 6’s
first aggregate, and the one the language already had a spelling for. The join keeps a count
per key beside its reverse index and moves it by ±1 as the index moves, so the answer costs
nothing and no group is built. That is the whole difference from Matching::Group,
which pays the group’s size on every event that touches it.
Total
The same one-entry-per-group index Matching::Unique probes, read as a value rather
than an option: Op::GroupBy with Agg::Sum, whose answer is an Int.
A key with no entry is a group with no rows, and the sum of no numbers is 0 — where
list_min of the same empty group is None. So the two probes differ in exactly one place
and it is what a missing entry means, which is a property of the aggregate rather than of
the index.
The third answer is the one worth naming: an entry that is not an Int — None, as
Op::GroupBy publishes it — is a group whose total does not fit one, and probing it
raises what list_sum raises. It is published rather
than raised at maintenance time because a group nobody asks about must not fail a render
— the recompute only ever sums the groups the loop reaches, and a maintained plan that
failed on the others would disagree with it about whether the program failed at all.