lognplot/tsdb/
db.rs

1//! Time series database which uses B+ trees to store tha data.
2
3use super::handle::{make_handle, TsDbHandle};
4use super::query::{Query, QueryResult};
5use super::sample::{Sample, SampleMetrics};
6use super::trace::Trace;
7use super::{Aggregation, Observation};
8use std::collections::HashMap;
9
10/// A time series database which can be used as a library.
11/// Note that this struct is not usable in multiple threads.
12/// To make it accessible from multiple threads, use the TsDbHandle wrapper.
13#[derive(Debug)]
14pub struct TsDb {
15    path: String,
16    pub data: HashMap<String, Trace>,
17}
18
19impl std::fmt::Display for TsDb {
20    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
21        write!(f, "TsDb {} with {} traces", self.path, self.data.len())
22    }
23}
24
25/// Database for time series.
26impl TsDb {
27    pub fn new() -> Self {
28        let path = "x".to_string();
29        let data = HashMap::new();
30        Self { path, data }
31    }
32
33    pub fn into_handle(self) -> TsDbHandle {
34        make_handle(self)
35    }
36
37    /// Add a batch of values
38    pub fn add_values(&mut self, name: &str, samples: Vec<Observation<Sample>>) {
39        let trace = self.data.get_mut(name).unwrap();
40        trace.add_values(samples);
41    }
42
43    pub fn new_trace(&mut self, name: &str) {
44        let trace = Trace::default();
45        self.data.insert(name.to_string(), trace);
46        // self.get_trace(name)
47    }
48
49    pub fn add_value(&mut self, name: &str, observation: Observation<Sample>) {
50        self.data.get_mut(name).unwrap().add_sample(observation);
51    }
52
53    /// Query the given trace for data.
54    pub fn query(&self, name: &str, query: Query) -> QueryResult {
55        self.data.get(name).unwrap().query(query)
56    }
57
58    /// Get a summary for the given trace.
59    pub fn summary(&self, name: &str) -> Option<Aggregation<Sample, SampleMetrics>> {
60        self.data.get(name).unwrap().summary()
61    }
62}