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
// This code is released under the
// General Public License (GPL), version 3
// http://www.gnu.org/licenses/gpl-3.0.en.html
// (c) Lorenzo Vannucci

//! # Bitrush-Index
//! Bitrush-Index is a Rust library that provides a serializable bitmap index
//! able to index millions values/sec on a single thread. On default this
//! library build bitmap-index using [`ozbcbitmap`] but if you want you can
//! also use another compressed/uncrompressed bitmap.
//! Only equality-query (A = X) are supported.
//!
//! ## Example
//!```
//! use bitrush_index::{
//!     BitmapIndex,
//!     OZBCBitmap,
//! };
//! 
//! use rand::Rng;
//! use std::time::Instant;
//! 
//! fn main() {
//!     // number of values to insert (defalut 10M)
//!     const N: usize = (1 << 20) * 10;
//!     let mut rng = rand::thread_rng();
//! 
//!     let build_options = bitrush_index::new_default_index_options::<u32>();
//!     let mut b_index = match BitmapIndex::<OZBCBitmap, u32>::new(build_options) {
//!         Ok(b_index) => b_index,
//!         Err(err) => panic!("Error occured creating bitmap index: {:?}", err)
//!     };
//!     let mut values: Vec<u32> = Vec::new();
//! 
//!     for _i in 0..N {
//!         let val: u32 = rng.gen::<u32>();
//!         values.push(val);
//!     }
//!     println!("--------------------------------------------------");
//!     println!("Inserting {} values in bitmap index...", N);
//!     let timer = Instant::now();
//!     //if index is opened in memory mode you can ignore the push_values result.
//!     let _result_index = b_index.push_values(&values); 
//!     let time_b_index_insert = timer.elapsed();
//!     println!("Bitmap index created in {:?}.", time_b_index_insert);
//!     println!("Insert per second = {}.", N / (time_b_index_insert.as_millis() as usize) * 1000);
//!     println!("--------------------------------------------------");
//! 
//!     let random_index: usize = rng.gen::<usize>() % values.len();
//!     let val_to_find = values[random_index];
//!     let timer = Instant::now();
//!     let values_indexes: Vec<u64> = match b_index.run_query(val_to_find, None, None) {
//!         Ok(indexes) => indexes,
//!         Err(err) => panic!("Error occured running looking for value = {}, error: {:?}", val_to_find, err)
//!     };
//! 
//!     let time_linear_search = timer.elapsed();
//!     println!("Bitmap index search runned in {:?}, match values founded: {}.", time_linear_search, values_indexes.len());
//!     println!("--------------------------------------------------");
//! }
//!```
//!
//! [`ozbcbitmap`]: ./ozbcbitmap/mod.rs

mod bitmap_index;
pub use bitmap_index::{
    BitValue,
    BitmapIndex,
    StorageIdx,
    Bitmap,
    MetaData,
    BuildOptions,
    ChunkSize
};

mod ozbcbitmap;
pub use ozbcbitmap::OZBCBitmap;

/// Return default options to create a BitmapIndex.
pub fn new_default_index_options<U: BitValue>() -> BuildOptions {
    let value_size = std::mem::size_of::<U>();
    if value_size == 1 {
        return BuildOptions::new(8, ChunkSize::M32);
    }
    BuildOptions::new(16, ChunkSize::M16) 
}