Mercurial > lbo > hg > leveldb-rs
changeset 41:05a99b5b895c
[unfinished] Add filterpolicy trait and module
author | Lewin Bormann <lbo@spheniscida.de> |
---|---|
date | Wed, 15 Jun 2016 16:43:29 +0000 |
parents | e38f5617df6f |
children | f484809acbe7 |
files | src/filter.rs src/lib.rs src/types.rs |
diffstat | 3 files changed, 56 insertions(+), 1 deletions(-) [+] |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/filter.rs Wed Jun 15 16:43:29 2016 +0000 @@ -0,0 +1,50 @@ + +/// Encapsulates a filter algorithm allowing to search for keys more efficiently. +pub trait FilterPolicy { + fn name(&self) -> &'static str; + fn create_filter(&self, keys: &Vec<&[u8]>) -> Vec<u8>; + fn key_may_match(&self, key: &[u8], filter: &[u8]) -> bool; +} + +pub struct BloomPolicy { + bits_per_key: usize, + k: usize, +} + +impl BloomPolicy { + pub fn new(bits_per_key: usize) -> BloomPolicy { + let mut k = (bits_per_key as f32 * 0.69) as usize; + + if k < 1 { + k = 1; + } else if k > 30 { + k = 30; + } + + BloomPolicy { + bits_per_key: bits_per_key, + k: k, + } + } +} + +impl FilterPolicy for BloomPolicy { + fn name(&self) -> &'static str { + "leveldb.BuiltinBloomFilter2" + } + fn create_filter(&self, keys: &Vec<&[u8]>) -> Vec<u8> { + let filter_size = keys.len() * self.bits_per_key; + let mut filter = Vec::new(); + + if filter_size < 64 { + filter.resize(8, 0 as u8); + } else { + filter.resize((filter_size + 7) / 8, 0); + } + + filter + } + fn key_may_match(&self, key: &[u8], filter: &[u8]) -> bool { + true + } +}
--- a/src/lib.rs Sun Jun 12 20:05:40 2016 +0200 +++ b/src/lib.rs Wed Jun 15 16:43:29 2016 +0000 @@ -7,6 +7,7 @@ mod block; mod blockhandle; +mod filter; mod log; mod memtable; mod skipmap;
--- a/src/types.rs Sun Jun 12 20:05:40 2016 +0200 +++ b/src/types.rs Wed Jun 15 16:43:29 2016 +0000 @@ -1,6 +1,8 @@ use std::default::Default; use std::cmp::Ordering; +use filter::FilterPolicy; + pub enum ValueType { TypeDeletion = 0, TypeValue = 1, @@ -47,7 +49,8 @@ pub block_size: usize, pub block_restart_interval: usize, // pub compression_type: CompressionType, - pub reuse_logs: bool, // pub filter_policy: FilterPolicy, + pub reuse_logs: bool, + pub filter_policy: Option<Box<FilterPolicy>>, } impl Default for Options<StandardComparator> { @@ -62,6 +65,7 @@ block_size: 4 << 10, block_restart_interval: 16, reuse_logs: false, + filter_policy: None, } } }