pgm-extra 1.3.0

PGM-Extra: high-performance learned index structures for Rust
Documentation
#![cfg(feature = "serde")]

use pgm_extra::index::external::Static;
use pgm_extra::{Map, Set};

#[test]
fn serde_roundtrip_static() {
    let data: Vec<u64> = (0..1000).collect();
    let index = Static::new(&data, 64, 4).unwrap();

    let json = serde_json::to_string(&index).unwrap();
    let de: Static<u64> = serde_json::from_str(&json).unwrap();

    assert_eq!(index.len(), de.len());
    assert_eq!(index.height(), de.height());
    assert_eq!(index.segments_count(), de.segments_count());

    for key in [0u64, 10, 500, 999] {
        assert_eq!(index.lower_bound(&data, &key), de.lower_bound(&data, &key));
    }
}

#[test]
fn serde_roundtrip_set() {
    let set: Set<u64> = (0..100).collect();
    let json = serde_json::to_string(&set).unwrap();
    let de: Set<u64> = serde_json::from_str(&json).unwrap();

    assert_eq!(set.len(), de.len());
    for v in 0..100 {
        assert_eq!(set.contains(&v), de.contains(&v));
    }
}

#[test]
fn serde_roundtrip_map() {
    let map: Map<u64, String> = (0..100).map(|i| (i, format!("v{i}"))).collect();
    let json = serde_json::to_string(&map).unwrap();
    let de: Map<u64, String> = serde_json::from_str(&json).unwrap();

    assert_eq!(map.len(), de.len());
    for k in 0..100 {
        assert_eq!(map.get(&k), de.get(&k));
    }
}

#[test]
fn serde_roundtrip_set_strings() {
    let words: Vec<String> = vec!["apple", "banana", "cherry", "date", "elderberry"]
        .into_iter()
        .map(String::from)
        .collect();
    let set: Set<String> = words.into_iter().collect();
    let json = serde_json::to_string(&set).unwrap();
    let de: Set<String> = serde_json::from_str(&json).unwrap();

    assert_eq!(set.len(), de.len());
    assert!(de.contains(&String::from("banana")));
    assert!(!de.contains(&String::from("fig")));
}

#[test]
fn serde_roundtrip_signed_integers() {
    let data: Vec<i64> = (-500..500).collect();
    let index = Static::new(&data, 64, 4).unwrap();

    let json = serde_json::to_string(&index).unwrap();
    let de: Static<i64> = serde_json::from_str(&json).unwrap();

    for key in [-500i64, -100, 0, 100, 499] {
        assert_eq!(index.lower_bound(&data, &key), de.lower_bound(&data, &key));
    }
}