use crate::{search::*, util::*};
#[derive(Debug, Clone, Deserialize, Serialize, PartialEq)]
pub struct RateAggregation {
rate: RateAggregationInner,
}
#[derive(Debug, Clone, Deserialize, Serialize, PartialEq)]
struct RateAggregationInner {
#[serde(default, skip_serializing_if = "ShouldSkip::should_skip")]
field: Option<String>,
#[serde(default, skip_serializing_if = "ShouldSkip::should_skip")]
unit: Option<CalendarInterval>,
#[serde(default, skip_serializing_if = "ShouldSkip::should_skip")]
mode: Option<RateMode>,
}
impl Aggregation {
pub fn rate() -> RateAggregation {
RateAggregation {
rate: RateAggregationInner {
field: None,
unit: None,
mode: None,
},
}
}
}
impl RateAggregation {
pub fn field<T>(mut self, field: T) -> Self
where
T: ToString,
{
self.rate.field = Some(field.to_string());
self
}
pub fn unit(mut self, unit: CalendarInterval) -> Self {
self.rate.unit = Some(unit);
self
}
pub fn mode(mut self, mode: RateMode) -> Self {
self.rate.mode = Some(mode);
self
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn serialization() {
assert_serialize_aggregation(Aggregation::rate(), json!({ "rate": { } }));
assert_serialize_aggregation(
Aggregation::rate()
.field("price")
.unit(CalendarInterval::Day)
.mode(RateMode::ValueCount),
json!({
"rate": {
"field": "price",
"unit": "day",
"mode": "value_count"
}
}),
);
}
}