bitrush-index 0.1.1

A serializable bitmap index library able to index millions values/sec on a single thread.
Documentation
use bitrush_index::{
    BuildOptions,
    BitmapIndex,
    ChunkSize,
    OZBCBitmap
};
use rand::Rng;

fn create_random_number(n: usize) -> Vec<u32> {
    let mut values = Vec::new();
    let mut rng = rand::thread_rng();
    for _i in 0..n {
        let val: u32 = rng.gen::<u32>();
        values.push(val);
    }
    values
}

#[test]
fn memory_mode() {
    let n =  2 * 1000 * 1000;
    
    let build_options = BuildOptions::new(16, ChunkSize::M1);
    let b_index_r = BitmapIndex::<OZBCBitmap, u32>::new(build_options);
    assert!(b_index_r.is_ok());

    let mut b_index: BitmapIndex<OZBCBitmap, u32> = b_index_r.unwrap();
    let mut values: Vec<u32> = create_random_number(n);

    let result_insert = b_index.push_values(&values);
    assert!(result_insert.is_ok());

    let mut rng = rand::thread_rng();
    let random_index: usize = rng.gen::<usize>() % values.len();
    let val_to_find = values[random_index];
    values.push(val_to_find);
    let result_insert = b_index.push_value(val_to_find);
    assert!(result_insert.is_ok());
   
    let linear_search_result: Vec<u64> = values.iter().enumerate().filter(|(_i, v)| **v == val_to_find).map(|(i, _v)| i as u64).collect();
 
    let values_indexes: Vec<u64> = b_index.run_query(val_to_find, None, None).unwrap();

    assert_eq!(linear_search_result.len(), values_indexes.len());

    for i in 0..linear_search_result.len() {
        assert_eq!(linear_search_result[i], values_indexes[i]);
    }
}


#[test]
fn storage_mode() {
    let n =  3 * 1000 * 1000;
    
    let build_options = BuildOptions::new(16, ChunkSize::M1);
    let path = std::path::Path::new("test_storage_mode");
    let b_index_r = BitmapIndex::<OZBCBitmap, u32>::create(&path, build_options);
    assert!(b_index_r.is_ok());

    let mut b_index: BitmapIndex<OZBCBitmap, u32> = b_index_r.unwrap();
    let mut values: Vec<u32> = create_random_number(n);

    let result_insert = b_index.push_values(&values);
    assert!(result_insert.is_ok());

    let mut rng = rand::thread_rng();
    let random_index: usize = rng.gen::<usize>() % values.len();
    let val_to_find = values[random_index];
    values.push(val_to_find);
    let result_insert = b_index.push_value(val_to_find);
    assert!(result_insert.is_ok());
 
    let linear_search_result: Vec<u64> = values.iter().enumerate().filter(|(_i, v)| **v == val_to_find).map(|(i, _v)| i as u64).collect();

    let run_query_r  = b_index.run_query(val_to_find, None, None);
    assert!(run_query_r.is_ok());
    let values_indexes: Vec<u64> = run_query_r.unwrap();

    let _err = std::fs::remove_dir_all(&path);

    assert_eq!(linear_search_result.len(), values_indexes.len());

    for i in 0..linear_search_result.len() {        
        assert_eq!(linear_search_result[i], values_indexes[i]);
    }
}