6 个版本
0.1.6 | 2023年9月7日 |
---|---|
0.1.5 | 2023年9月1日 |
0.1.4 | 2023年8月31日 |
0.1.2 | 2023年7月29日 |
6 在 #union
每月 44 次下载
35KB
818 行
dataseries
data-series 和时间序列的函数支持
函数
union
两个序列之间的连续时间序列联合。左右数据可以不存在(只有左右的情况)。
1 3 10 20
Left: |-----|-----|------------------|-
130 120 95 160
12 15
Right: |------|--------
105 110
1 3 10 12 15 20
Expected: |-----|-----|----|------|------|-
130,∅ 120,∅ 95,∅ 95,105 95,110 160,110
示例
简单
两个时序之间 union
的简单示例
交集
使用 union
函数实现的交集实现。
最终一致性和冲突解决
crdt
示例提供了一个基于数据序列 union
的无冲突复杂数据类型解决示例。
VersionedValue
定义了版本(这里是一个时间戳),通过取最大版本来解决冲突。最大值通过 Ord
特性定义,并在 union
使用的给定函数中使用。
以下示例使用 TimestampMicros 对数据进行版本控制,并通过取值的最高版本来解决冲突。
fn datapoint<T>(timestamp_micros: TimestampMicros, date: Date, data: T) -> DataPoint<Date, Option<VersionedValue<TimestampMicros, T>>>
where
T: std::marker::Copy,
{
DataPoint::new(date, Some(VersionedValue::new(timestamp_micros, data)))
}
/// Interval can be encoded by using 2 Datapoints with a [`None`] last datapoint value to mark the end of each interval
fn end<T>(date: Date) -> DataPoint<Date, Option<VersionedValue<TimestampMicros, T>>> {
DataPoint::new(date, None)
}
let s1 = dataseries::of_iter(vec![
datapoint(TimestampMicros::new(1), date(2023, 1, 3), 50),
end(date(2023, 1, 10)),
]);
let s2 = dataseries::of_iter(vec![
datapoint(TimestampMicros::new(2), date(2023, 1, 4), 100),
end(date(2023, 1, 5)),
datapoint(TimestampMicros::new(2), date(2023, 1, 7), 110),
end(date(2023, 1, 9)),
]);
// Solves conflict by taking always the maximum version
let actual = s1
.union(s2, |x| match x {
dataseries::UnionResult::LeftOnly(x) | dataseries::UnionResult::RightOnly(x) => x,
dataseries::UnionResult::Union { left, right } => std::cmp::max(left, right),
})
.collect::<Vec<_>>();
let expected = vec![
datapoint(TimestampMicros::new(1), date(2023, 1, 3), 50),
datapoint(TimestampMicros::new(2), date(2023, 1, 4), 100),
datapoint(TimestampMicros::new(1), date(2023, 1, 5), 50),
datapoint(TimestampMicros::new(2), date(2023, 1, 7), 110),
datapoint(TimestampMicros::new(1), date(2023, 1, 9), 50),
end(date(2023, 1, 10)),
];