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 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 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}