changeset 30:cf6c50c9a5e7

Remove infrastructure for InternalKeys
author Lewin Bormann <lbo@spheniscida.de>
date Tue, 03 Jan 2017 19:59:01 +0100
parents 8fe35754a39d
children db6eae79024a
files src/table_builder.rs src/table_reader.rs
diffstat 2 files changed, 17 insertions(+), 111 deletions(-) [+]
line wrap: on
line diff
--- a/src/table_builder.rs	Tue Jan 03 19:45:33 2017 +0100
+++ b/src/table_builder.rs	Tue Jan 03 19:59:01 2017 +0100
@@ -1,6 +1,5 @@
 use block::{BlockBuilder, BlockContents};
 use blockhandle::BlockHandle;
-use cmp::InternalKeyCmp;
 use filter::{BoxedFilterPolicy, NoFilterPolicy};
 use filter_block::FilterBlockBuilder;
 use key_types::InternalKey;
@@ -8,7 +7,6 @@
 
 use std::io::Write;
 use std::cmp::Ordering;
-use std::sync::Arc;
 
 use crc::crc32;
 use crc::Hasher32;
@@ -101,15 +99,9 @@
 /// It's recommended that you use InternalFilterPolicy as FilterPol, as that policy extracts the
 /// underlying user keys from the InternalKeys used as keys in the table.
 impl<'a, Dst: Write> TableBuilder<'a, Dst> {
-    /// Create a new table builder.
-    /// The comparator in opt will be wrapped in a InternalKeyCmp.
-    pub fn new(mut opt: Options, dst: Dst, fpol: BoxedFilterPolicy) -> TableBuilder<'a, Dst> {
-        opt.cmp = Arc::new(Box::new(InternalKeyCmp(opt.cmp.clone())));
-        TableBuilder::new_raw(opt, dst, fpol)
-    }
-
-    /// Like new(), but doesn't wrap the comparator in an InternalKeyCmp (for testing)
-    pub fn new_raw(opt: Options, dst: Dst, fpol: BoxedFilterPolicy) -> TableBuilder<'a, Dst> {
+    /// Create a new TableBuilder. Currently the best choice for `fpol` is `NoFilterPolicy` (mod
+    /// filter; or use new_no_filter())
+    pub fn new(opt: Options, dst: Dst, fpol: BoxedFilterPolicy) -> TableBuilder<'a, Dst> {
         TableBuilder {
             opt: opt.clone(),
             dst: dst,
@@ -127,7 +119,7 @@
     }
 
     /// Add a key to the table. The key as to be lexically greater or equal to the last one added.
-    pub fn add(&mut self, key: InternalKey<'a>, val: &[u8]) {
+    pub fn add(&mut self, key: &'a [u8], val: &[u8]) {
         assert!(self.data_block.is_some());
 
         if !self.prev_block_last_key.is_empty() {
@@ -270,7 +262,7 @@
         let mut d = Vec::with_capacity(512);
         let mut opt = Options::default();
         opt.block_restart_interval = 3;
-        let mut b = TableBuilder::new_raw(opt, &mut d, BloomPolicy::new(4));
+        let mut b = TableBuilder::new(opt, &mut d, BloomPolicy::new(4));
 
         let data = vec![("abc", "def"), ("abd", "dee"), ("bcd", "asa"), ("bsr", "a00")];
 
@@ -288,7 +280,7 @@
         let mut d = Vec::with_capacity(512);
         let mut opt = Options::default();
         opt.block_restart_interval = 3;
-        let mut b = TableBuilder::new_raw(opt, &mut d, BloomPolicy::new(4));
+        let mut b = TableBuilder::new(opt, &mut d, BloomPolicy::new(4));
 
         // Test two equal consecutive keys
         let data = vec![("abc", "def"), ("abc", "dee"), ("bcd", "asa"), ("bsr", "a00")];
--- a/src/table_reader.rs	Tue Jan 03 19:45:33 2017 +0100
+++ b/src/table_reader.rs	Tue Jan 03 19:59:01 2017 +0100
@@ -1,16 +1,14 @@
 use block::{Block, BlockIter};
 use blockhandle::BlockHandle;
-use filter::{BoxedFilterPolicy, InternalFilterPolicy};
+use filter::BoxedFilterPolicy;
 use filter_block::FilterBlockReader;
 use key_types::InternalKey;
-use cmp::InternalKeyCmp;
 use options::{self, CompressionType, Options};
 use table_builder::{self, Footer};
 use iterator::SSIterator;
 
 use std::cmp::Ordering;
 use std::io::{self, Read, Seek, SeekFrom, Result};
-use std::sync::Arc;
 
 use integer_encoding::FixedInt;
 use crc::crc32::{self, Hasher32};
@@ -86,8 +84,8 @@
 }
 
 impl<R: Read + Seek> Table<R> {
-    /// Creates a new table reader operating on unformatted keys (i.e., UserKey).
-    fn new_raw(opt: Options, mut file: R, size: usize, fp: BoxedFilterPolicy) -> Result<Table<R>> {
+    /// Creates a new table reader.
+    pub fn new(opt: Options, mut file: R, size: usize, fp: BoxedFilterPolicy) -> Result<Table<R>> {
         let footer = try!(read_footer(&mut file, size));
 
         let indexblock = try!(TableBlock::read_block(opt.clone(), &mut file, &footer.index));
@@ -127,15 +125,6 @@
         })
     }
 
-    /// Creates a new table reader operating on internal keys (i.e., InternalKey). This means that
-    /// a different comparator (internal_key_cmp) and a different filter policy
-    /// (InternalFilterPolicy) are used.
-    pub fn new(mut opt: Options, file: R, size: usize, fp: BoxedFilterPolicy) -> Result<Table<R>> {
-        opt.cmp = Arc::new(Box::new(InternalKeyCmp(opt.cmp.clone())));
-        let t = try!(Table::new_raw(opt, file, size, InternalFilterPolicy::new(fp)));
-        Ok(t)
-    }
-
     fn read_block(&mut self, location: &BlockHandle) -> Result<TableBlock> {
         let b = try!(TableBlock::read_block(self.opt.clone(), &mut self.file, location));
 
@@ -334,11 +323,9 @@
 #[cfg(test)]
 mod tests {
     use filter::BloomPolicy;
-    use filter::InternalFilterPolicy;
     use options::Options;
     use table_builder::TableBuilder;
     use iterator::SSIterator;
-    use key_types::LookupKey;
 
     use std::io::Cursor;
 
@@ -366,7 +353,7 @@
 
         {
             // Uses the standard comparator in opt.
-            let mut b = TableBuilder::new_raw(opt, &mut d, BloomPolicy::new(4));
+            let mut b = TableBuilder::new(opt, &mut d, BloomPolicy::new(4));
             let data = build_data();
 
             for &(k, v) in data.iter() {
@@ -382,40 +369,6 @@
         (d, size)
     }
 
-    // Build a table containing keys in InternalKey format.
-    fn build_internal_table() -> (Vec<u8>, usize) {
-        let mut d = Vec::with_capacity(512);
-        let mut opt = Options::default();
-        opt.block_restart_interval = 1;
-        opt.block_size = 32;
-
-        let mut i = 0 as u64;
-        let data: Vec<(Vec<u8>, &'static str)> = build_data()
-            .into_iter()
-            .map(|(k, v)| {
-                i += 1;
-                (LookupKey::new(k.as_bytes(), i).internal_key().to_vec(), v)
-            })
-            .collect();
-
-        {
-            // Uses InternalKeyCmp
-            let mut b =
-                TableBuilder::new(opt, &mut d, InternalFilterPolicy::new(BloomPolicy::new(4)));
-
-            for &(ref k, ref v) in data.iter() {
-                b.add(k.as_slice(), v.as_bytes());
-            }
-
-            b.finish();
-
-        }
-
-        let size = d.len();
-
-        (d, size)
-    }
-
     #[test]
     fn test_table_reader_checksum() {
         let (mut src, size) = build_table();
@@ -423,7 +376,7 @@
 
         src[10] += 1;
 
-        let mut table = Table::new_raw(Options::default(),
+        let mut table = Table::new(Options::default(),
                                        Cursor::new(&src as &[u8]),
                                        size,
                                        BloomPolicy::new(4))
@@ -456,7 +409,7 @@
         let (src, size) = build_table();
         let data = build_data();
 
-        let mut table = Table::new_raw(Options::default(),
+        let mut table = Table::new(Options::default(),
                                        Cursor::new(&src as &[u8]),
                                        size,
                                        BloomPolicy::new(4))
@@ -492,7 +445,7 @@
     fn test_table_iterator_filter() {
         let (src, size) = build_table();
 
-        let mut table = Table::new_raw(Options::default(),
+        let mut table = Table::new(Options::default(),
                                        Cursor::new(&src as &[u8]),
                                        size,
                                        BloomPolicy::new(4))
@@ -515,7 +468,7 @@
     fn test_table_iterator_state_behavior() {
         let (src, size) = build_table();
 
-        let mut table = Table::new_raw(Options::default(),
+        let mut table = Table::new(Options::default(),
                                        Cursor::new(&src as &[u8]),
                                        size,
                                        BloomPolicy::new(4))
@@ -549,7 +502,7 @@
         let (src, size) = build_table();
         let data = build_data();
 
-        let mut table = Table::new_raw(Options::default(),
+        let mut table = Table::new(Options::default(),
                                        Cursor::new(&src as &[u8]),
                                        size,
                                        BloomPolicy::new(4))
@@ -586,7 +539,7 @@
     fn test_table_iterator_seek() {
         let (src, size) = build_table();
 
-        let mut table = Table::new_raw(Options::default(),
+        let mut table = Table::new(Options::default(),
                                        Cursor::new(&src as &[u8]),
                                        size,
                                        BloomPolicy::new(4))
@@ -607,7 +560,7 @@
     fn test_table_get() {
         let (src, size) = build_table();
 
-        let mut table = Table::new_raw(Options::default(),
+        let mut table = Table::new(Options::default(),
                                        Cursor::new(&src as &[u8]),
                                        size,
                                        BloomPolicy::new(4))
@@ -620,43 +573,4 @@
         assert_eq!(table.get("zzz".as_bytes()), Some("111".as_bytes().to_vec()));
         assert!(table.get("zz1".as_bytes()).is_none());
     }
-
-    // This test verifies that the table and filters work with internal keys. This means:
-    // The table contains keys in InternalKey format and it uses a filter wrapped by
-    // InternalFilterPolicy.
-    // All the other tests use raw keys that don't have any internal structure; this is fine in
-    // general, but here we want to see that the other infrastructure works too.
-    #[test]
-    fn test_table_internal_keys() {
-        use key_types::LookupKey;
-
-        let (src, size) = build_internal_table();
-
-        let mut table = Table::new(Options::default(),
-                                   Cursor::new(&src as &[u8]),
-                                   size,
-                                   BloomPolicy::new(4))
-            .unwrap();
-        let filter_reader = table.filters.clone().unwrap();
-
-        // Check that we're actually using internal keys
-        for (ref k, _) in table.iter() {
-            assert_eq!(k.len(), 3 + 8);
-        }
-
-        let mut iter = table.iter();
-
-        loop {
-            if let Some((k, _)) = iter.next() {
-                let lk = LookupKey::new(&k, 123);
-                let userkey = lk.user_key();
-
-                assert!(filter_reader.key_may_match(iter.current_block_off, userkey));
-                assert!(!filter_reader.key_may_match(iter.current_block_off,
-                                                     "somerandomkey".as_bytes()));
-            } else {
-                break;
-            }
-        }
-    }
 }