mod trait_;
mod count;
mod sum;
mod avg;
mod minmax;
mod percentile;
mod stddev;
mod composite;
pub mod statistics;
pub use trait_::{Aggregator, ToF64};
pub use count::{CountAggregator, CountAccumulator};
pub use sum::{SumAggregator, SumAccumulator};
pub use avg::{AverageAggregator, AverageAccumulator};
pub use minmax::{MinAggregator, MaxAggregator, MinAccumulator, MaxAccumulator};
pub use percentile::{PercentileAggregator, PercentileAccumulator};
pub use stddev::{StandardDeviationAggregator, StdDevAccumulator};
pub use composite::{CompositeAggregator, AggregationResult};
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_multiple_aggregators_together() {
let data = vec![10.0, 20.0, 30.0, 40.0, 50.0];
let mut count = CountAggregator::new();
let mut sum = SumAggregator::new();
let mut avg = AverageAggregator::new();
let mut min = MinAggregator::new();
let mut max = MaxAggregator::new();
for value in &data {
count.update(*value).unwrap();
sum.update(*value).unwrap();
avg.update(*value).unwrap();
min.update(*value).unwrap();
max.update(*value).unwrap();
}
assert_eq!(count.finalize().unwrap(), 5);
assert_eq!(sum.finalize().unwrap(), 150.0);
assert_eq!(avg.finalize().unwrap(), 30.0);
assert_eq!(min.finalize().unwrap(), 10.0);
assert_eq!(max.finalize().unwrap(), 50.0);
}
#[test]
fn test_serialization_roundtrip() {
let mut avg = AverageAggregator::<f64>::new();
avg.update_batch(&[10.0, 20.0, 30.0]).unwrap();
let acc = avg.accumulator();
let serialized = serde_json::to_string(&acc).unwrap();
let deserialized: AverageAccumulator = serde_json::from_str(&serialized).unwrap();
let mut new_avg = AverageAggregator::<f64>::new();
new_avg.merge(deserialized).unwrap();
assert_eq!(new_avg.finalize().unwrap(), 20.0);
}
#[test]
fn test_distributed_processing_scenario() {
let worker1_data = vec![1.0, 2.0, 3.0];
let worker2_data = vec![4.0, 5.0, 6.0];
let worker3_data = vec![7.0, 8.0, 9.0];
let mut agg1 = AverageAggregator::new();
agg1.update_batch(&worker1_data).unwrap();
let mut agg2 = AverageAggregator::new();
agg2.update_batch(&worker2_data).unwrap();
let mut agg3 = AverageAggregator::new();
agg3.update_batch(&worker3_data).unwrap();
let mut combined = AverageAggregator::<f64>::new();
combined.merge(agg1.accumulator()).unwrap();
combined.merge(agg2.accumulator()).unwrap();
combined.merge(agg3.accumulator()).unwrap();
assert_eq!(combined.finalize().unwrap(), 5.0);
assert_eq!(combined.count(), 9);
}
}