1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99
use std::f64; use super::{Aggregate, AggregateError}; use crate::{Headers, Row}; #[derive(Debug)] pub struct DefaultMax { source: String, current: f64, colname: String, } impl DefaultMax { pub fn new(colname: &str, source: &str) -> DefaultMax { DefaultMax { source: source.to_string(), colname: colname.to_string(), ..Default::default() } } } impl Default for DefaultMax { fn default() -> DefaultMax { DefaultMax { colname: String::new(), source: String::new(), current: f64::NEG_INFINITY, } } } impl Aggregate for DefaultMax { fn update(&mut self, headers: &Headers, row: &Row) -> Result<(), AggregateError> { match headers.get_field(row, &self.source) { Some(data) => match data.parse::<f64>() { Ok(num) => { if num > self.current { self.current = num; } Ok(()) } Err(_) => Ok(()), }, None => Ok(()), } } fn value(&self) -> String { self.current.to_string() } fn colname(&self) -> &str { &self.colname } } #[cfg(test)] mod tests { use super::{Aggregate, DefaultMax}; use crate::{Headers, Row}; #[test] fn test_max() { let mut max = DefaultMax::new("new", "a"); let h = Headers::from_row(Row::from(vec!["a"])); let r = Row::from(vec!["3.0"]); max.update(&h, &r).unwrap(); let r = Row::from(vec!["2"]); max.update(&h, &r).unwrap(); let r = Row::from(vec![".5"]); max.update(&h, &r).unwrap(); assert_eq!(max.value(), "3"); } #[test] fn test_missing_column() { let mut max = DefaultMax::new("new", "a"); let h = Headers::from_row(Row::from(vec!["b"])); let r = Row::from(vec!["3.0"]); max.update(&h, &r).unwrap(); assert_eq!(max.value(), "-inf"); } #[test] fn test_value_error() { let mut max = DefaultMax::new("new", "a"); let h = Headers::from_row(Row::from(vec!["a"])); let r = Row::from(vec!["chicken"]); max.update(&h, &r).unwrap(); assert_eq!(max.value(), "-inf"); } }