apache-datasketches 0.2.0

Safe, idiomatic Rust bindings for Apache DataSketches
Documentation
use apache_datasketches::tuple::{
    ArrayOfDoublesIntersection, ArrayOfDoublesSketch, ArrayOfDoublesSketchBuilder,
};
use apache_datasketches::SketchError;

fn sketch(num_values: u8, keys: std::ops::Range<u64>, values: &[f64]) -> ArrayOfDoublesSketch {
    let mut s = ArrayOfDoublesSketchBuilder::new()
        .num_values(num_values)
        .build()
        .unwrap();
    for key in keys {
        s.update_u64(key, values).unwrap();
    }
    s
}

#[test]
fn intersection_half_overlap() {
    let a = sketch(1, 0..1000, &[1.0]);
    let b = sketch(1, 500..1500, &[1.0]);
    let mut i = ArrayOfDoublesIntersection::new(1).unwrap();
    i.update(&a).unwrap();
    i.update(&b).unwrap();
    assert_eq!(i.get_result(true).unwrap().get_estimate(), 500.0);
}

#[test]
fn intersection_accepts_both_input_types_and_sums_values() {
    let a = sketch(2, 0..1, &[1.0, 10.0]);
    let b = sketch(2, 0..1, &[2.0, 20.0]).compact(true);
    let mut i = ArrayOfDoublesIntersection::new(2).unwrap();
    i.update(&a).unwrap();
    i.update(&b).unwrap();
    let entries: Vec<(u64, Vec<f64>)> = i.get_result(true).unwrap().entries().collect();
    assert_eq!(entries.len(), 1);
    assert_eq!(entries[0].1, vec![3.0, 30.0]);
}

#[test]
fn get_result_before_update_is_empty_intersection_err() {
    let i = ArrayOfDoublesIntersection::new(1).unwrap();
    assert!(!i.has_result());
    assert!(matches!(
        i.get_result(true),
        Err(SketchError::EmptyIntersection)
    ));
}

#[test]
fn mismatched_num_values_is_err() {
    let a = sketch(3, 0..10, &[1.0, 2.0, 3.0]);
    let mut i = ArrayOfDoublesIntersection::new(2).unwrap();
    assert_eq!(i.get_num_values(), 2);
    assert!(i.update(&a).is_err());
    assert!(i.update(&a.compact(true)).is_err());
}

#[test]
fn num_values_zero_is_err() {
    assert!(ArrayOfDoublesIntersection::new(0).is_err());
}

#[test]
fn intersection_is_send() {
    fn assert_send<T: Send>() {}
    assert_send::<ArrayOfDoublesIntersection>();
}