nodedb_types/timeseries/
continuous_agg.rs1use serde::{Deserialize, Serialize};
10
11#[derive(
13 Debug,
14 Clone,
15 PartialEq,
16 Serialize,
17 Deserialize,
18 zerompk::ToMessagePack,
19 zerompk::FromMessagePack,
20)]
21pub struct ContinuousAggregateDef {
22 pub name: String,
24 pub source: String,
26 pub bucket_interval: String,
28 pub bucket_interval_ms: i64,
30 pub group_by: Vec<String>,
32 pub aggregates: Vec<AggregateExpr>,
34 pub refresh_policy: RefreshPolicy,
36 pub retention_period_ms: u64,
38 pub stale: bool,
40}
41
42#[derive(
44 Debug,
45 Clone,
46 PartialEq,
47 Serialize,
48 Deserialize,
49 zerompk::ToMessagePack,
50 zerompk::FromMessagePack,
51)]
52pub struct AggregateExpr {
53 pub function: AggFunction,
55 pub source_column: String,
57 pub output_column: String,
59}
60
61#[derive(
63 Debug,
64 Clone,
65 PartialEq,
66 Serialize,
67 Deserialize,
68 zerompk::ToMessagePack,
69 zerompk::FromMessagePack,
70)]
71#[serde(rename_all = "snake_case")]
72#[non_exhaustive]
73pub enum AggFunction {
74 #[serde(rename = "sum")]
75 Sum,
76 #[serde(rename = "count")]
77 Count,
78 #[serde(rename = "min")]
79 Min,
80 #[serde(rename = "max")]
81 Max,
82 #[serde(rename = "avg")]
83 Avg,
84 #[serde(rename = "first")]
85 First,
86 #[serde(rename = "last")]
87 Last,
88 #[serde(rename = "count_distinct")]
90 CountDistinct,
91 #[serde(rename = "percentile")]
93 Percentile(f64),
94 #[serde(rename = "topk")]
96 TopK(usize),
97}
98
99impl AggFunction {
100 pub fn as_str(&self) -> &'static str {
101 match self {
102 Self::Sum => "sum",
103 Self::Count => "count",
104 Self::Min => "min",
105 Self::Max => "max",
106 Self::Avg => "avg",
107 Self::First => "first",
108 Self::Last => "last",
109 Self::CountDistinct => "count_distinct",
110 Self::Percentile(_) => "percentile",
111 Self::TopK(_) => "topk",
112 }
113 }
114
115 pub fn uses_sketch(&self) -> bool {
117 matches!(
118 self,
119 Self::CountDistinct | Self::Percentile(_) | Self::TopK(_)
120 )
121 }
122}
123
124#[derive(
126 Debug,
127 Clone,
128 Default,
129 PartialEq,
130 Eq,
131 Serialize,
132 Deserialize,
133 zerompk::ToMessagePack,
134 zerompk::FromMessagePack,
135)]
136#[serde(rename_all = "snake_case")]
137#[non_exhaustive]
138pub enum RefreshPolicy {
139 #[default]
141 #[serde(rename = "on_flush")]
142 OnFlush,
143 #[serde(rename = "on_seal")]
145 OnSeal,
146 #[serde(rename = "periodic")]
148 Periodic(u64),
149 #[serde(rename = "manual")]
151 Manual,
152}