use serde::{Deserialize, Serialize};
#[derive(
Debug,
Clone,
PartialEq,
Serialize,
Deserialize,
zerompk::ToMessagePack,
zerompk::FromMessagePack,
)]
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,
PartialEq,
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,
)]
#[serde(rename_all = "snake_case")]
#[non_exhaustive]
pub enum AggFunction {
#[serde(rename = "sum")]
Sum,
#[serde(rename = "count")]
Count,
#[serde(rename = "min")]
Min,
#[serde(rename = "max")]
Max,
#[serde(rename = "avg")]
Avg,
#[serde(rename = "first")]
First,
#[serde(rename = "last")]
Last,
#[serde(rename = "count_distinct")]
CountDistinct,
#[serde(rename = "percentile")]
Percentile(f64),
#[serde(rename = "topk")]
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,
PartialEq,
Eq,
Serialize,
Deserialize,
zerompk::ToMessagePack,
zerompk::FromMessagePack,
)]
#[serde(rename_all = "snake_case")]
#[non_exhaustive]
pub enum RefreshPolicy {
#[default]
#[serde(rename = "on_flush")]
OnFlush,
#[serde(rename = "on_seal")]
OnSeal,
#[serde(rename = "periodic")]
Periodic(u64),
#[serde(rename = "manual")]
Manual,
}