use serde::{Deserialize, Serialize};
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct ContinuousAggregateDef {
pub name: String,
pub source: String,
pub bucket_interval: String,
pub bucket_interval_ms: i64,
pub group_by: Vec<String>,
pub aggregates: Vec<AggregateExpr>,
pub refresh_policy: RefreshPolicy,
pub retention_period_ms: u64,
pub stale: bool,
}
#[derive(
Debug, Clone, Serialize, Deserialize, zerompk::ToMessagePack, zerompk::FromMessagePack,
)]
pub struct AggregateExpr {
pub function: AggFunction,
pub source_column: String,
pub output_column: String,
}
#[derive(
Debug,
Clone,
PartialEq,
Serialize,
Deserialize,
zerompk::ToMessagePack,
zerompk::FromMessagePack,
)]
pub enum AggFunction {
Sum,
Count,
Min,
Max,
Avg,
First,
Last,
CountDistinct,
Percentile(f64),
TopK(usize),
}
impl AggFunction {
pub fn as_str(&self) -> &'static str {
match self {
Self::Sum => "sum",
Self::Count => "count",
Self::Min => "min",
Self::Max => "max",
Self::Avg => "avg",
Self::First => "first",
Self::Last => "last",
Self::CountDistinct => "count_distinct",
Self::Percentile(_) => "percentile",
Self::TopK(_) => "topk",
}
}
pub fn uses_sketch(&self) -> bool {
matches!(
self,
Self::CountDistinct | Self::Percentile(_) | Self::TopK(_)
)
}
}
#[derive(Debug, Clone, Default, Serialize, Deserialize, PartialEq, Eq)]
pub enum RefreshPolicy {
#[default]
OnFlush,
OnSeal,
Periodic(u64),
Manual,
}