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