-
Notifications
You must be signed in to change notification settings - Fork 195
Description
The already available arrange_from_upsert function has the following signature:
pub fn arrange_from_upsert<G, K, V, Bu, Tr>(
stream: &Stream<G, (K, Option<V>, G::Timestamp)>,
name: &str,
) -> Arranged<G, TraceAgent<Tr>>
where ...The stream of updates only allows for either deletion (None) of existing entries, or complete replacement of the value associated with a key with Some(new_value). But sometimes we want to update only part of an existing value.
We were thinking of a function with maybe the following signature:
pub fn arrange_from_update<G, K, V, U, F, Bu, Tr>(
stream: &Stream<G, (K, U, G::Timestamp)>,
name: &str,
update_func: F,
) -> Arranged<G, TraceAgent<Tr>>
where
U: ExchangeData, // Added U
F: Fn(&K, Option<&V>, &U) -> Option<V> + Clone + 'static, // Added F
...This adds two more generic types: U (update information) and F for an additional closure argument update_func that combines the key, an optional existing value, and the update information to generate an optional replacement.
Note that the current arrange_from_upsert function could be easily implemented on top of the above new function. U would be the same as V in that case, and update_func would return the optional replacement Some(new_value) if there were Some(old_value), or None otherwise.
There are at least two advantages offered by the new function:
- Updating parts of existing values becomes possible or certainly much easier.
update_funccan detect and act on the case where a key is missing (Nonebeing passed as argument), e.g. for emitting warnings if that indicates a problem.
It seems the suggested new function could be easily implemented reusing the existing code for arrange_from_upsert. Unless the compiler cannot optimize away the abstractions, we could then replace it with a suitable call to arrange_from_update.
Would it be possible to add this feature, or maybe comment on any potential issues with the proposal?