changeset 113:0d848c6665f5

Implement simple get() method on TableReader
author Lewin Bormann <lbo@spheniscida.de>
date Sat, 24 Dec 2016 15:56:40 +0000
parents c0dbaae40771
children 8944889f75bd
files src/table_reader.rs
diffstat 1 files changed, 33 insertions(+), 0 deletions(-) [+]
line wrap: on
line diff
--- a/src/table_reader.rs	Sat Dec 24 14:22:42 2016 +0000
+++ b/src/table_reader.rs	Sat Dec 24 15:56:40 2016 +0000
@@ -5,6 +5,7 @@
 use options::{self, CompressionType, Options};
 use table_builder::{self, Footer};
 use types::{Comparator, LdbIterator};
+use key_types::InternalKey;
 
 use std::io::{self, Read, Seek, SeekFrom, Result};
 use std::cmp::Ordering;
@@ -159,6 +160,19 @@
         };
         iter
     }
+
+    /// Retrieve value from table
+    pub fn get<'a>(&mut self, k: InternalKey<'a>) -> Option<Vec<u8>> {
+        let mut iter = self.iter();
+
+        iter.seek(k);
+
+        if let Some((fkey, fval)) = iter.current() {
+            if fkey == k { Some(fval) } else { None }
+        } else {
+            None
+        }
+    }
 }
 
 /// This iterator is a "TwoLevelIterator"; it uses an index block in order to get an offset hint
@@ -484,4 +498,23 @@
         assert_eq!(iter.current(),
                    Some(("abc".as_bytes().to_vec(), "def".as_bytes().to_vec())));
     }
+
+    #[test]
+    fn test_table_get() {
+        let (src, size) = build_table();
+
+        let mut table = Table::new(Cursor::new(&src as &[u8]),
+                                   size,
+                                   StandardComparator,
+                                   BloomPolicy::new(4),
+                                   Options::default())
+            .unwrap();
+
+        assert!(table.get("aaa".as_bytes()).is_none());
+        assert_eq!(table.get("abc".as_bytes()), Some("def".as_bytes().to_vec()));
+        assert!(table.get("abcd".as_bytes()).is_none());
+        assert_eq!(table.get("bcd".as_bytes()), Some("asa".as_bytes().to_vec()));
+        assert_eq!(table.get("zzz".as_bytes()), Some("111".as_bytes().to_vec()));
+        assert!(table.get("zz1".as_bytes()).is_none());
+    }
 }