rt_graph/
store.rs

1use crate::{Error, Point, Result, Time, Value};
2use std::collections::BTreeMap;
3
4pub struct Store {
5    last_t: Time,
6    val_len: u8,
7    all: BTreeMap<Time, Vec<Value>>,
8}
9
10impl Store {
11    pub fn new(val_len: u8) -> Store {
12        Store {
13            last_t: 0,
14            val_len,
15            all: BTreeMap::new(),
16        }
17    }
18
19    pub fn ingest(&mut self, ps: &[Point]) -> Result<()> {
20        for p in ps {
21            if p.t <= self.last_t {
22                return Err(Error::String("t <= last_t".to_owned()));
23            }
24            self.last_t = p.t;
25
26            assert!(p.vs.len() == self.val_len as usize);
27            self.all.insert(p.t, p.vs.clone());
28        }
29
30        trace!("ingest all.len={} last_t={}", self.all.len(), self.last_t);
31
32        Ok(())
33    }
34
35    pub fn discard(&mut self, t0: Time, t1: Time) -> Result<()> {
36        for t in self.all.range(t0..t1).map(|(t,_vs)| *t).collect::<Vec<u32>>() {
37            self.all.remove(&t);
38        }
39        Ok(())
40    }
41
42    /// Returns a Vec of the points with t >= t0, < t1.
43    pub fn query_range(&self, t0: Time, t1: Time) -> Result<Vec<Point>> {
44        let rv: Vec<Point> =
45            self.all.range(t0..t1)
46                .map(|(t,vs)| Point { t: *t, vs: vs.clone() })
47                .collect();
48        trace!("query t0={} t1={} rv.len={}", t0, t1, rv.len());
49        Ok(rv)
50    }
51
52    /// Returns the first point with t >= given t.
53    pub fn query_point(&self, t: Time) -> Result<Option<Point>> {
54        let rv = self.all.range(t..)
55                     .map(|(t,vs)| Point { t: *t, vs: vs.clone() })
56                     .next();
57        Ok(rv)
58    }
59
60    pub fn last_t(&self) -> Time {
61        self.last_t
62    }
63
64    pub fn first_t(&self) -> Time {
65        self.query_point(0).unwrap()
66                           .map_or(0, |pt| pt.t)
67    }
68
69    pub fn val_len(&self) -> u8 {
70        self.val_len
71    }
72}