view src/filter.rs @ 41:05a99b5b895c

[unfinished] Add filterpolicy trait and module
author Lewin Bormann <lbo@spheniscida.de>
date Wed, 15 Jun 2016 16:43:29 +0000
parents
children f484809acbe7
line wrap: on
line source


/// 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
    }
}