feoxdb/core/store/range.rs
1use crate::constants::MAX_KEY_SIZE;
2use crate::error::{FeoxError, Result};
3
4use super::FeoxStore;
5
6impl FeoxStore {
7 /// Perform a range query on the store.
8 ///
9 /// Returns all key-value pairs where the key is >= `start_key` and <= `end_key`.
10 /// Both bounds are inclusive.
11 ///
12 /// # Arguments
13 ///
14 /// * `start_key` - Inclusive lower bound
15 /// * `end_key` - Inclusive upper bound
16 /// * `limit` - Maximum number of results to return
17 ///
18 /// # Returns
19 ///
20 /// Returns a vector of (key, value) pairs in sorted order.
21 ///
22 /// # Example
23 ///
24 /// ```rust
25 /// # use feoxdb::FeoxStore;
26 /// # fn main() -> feoxdb::Result<()> {
27 /// # let store = FeoxStore::new(None)?;
28 /// store.insert(b"user:001", b"Alice")?;
29 /// store.insert(b"user:002", b"Bob")?;
30 /// store.insert(b"user:003", b"Charlie")?;
31 /// store.insert(b"user:004", b"David")?;
32 ///
33 /// // Get users 001 through 003 (inclusive)
34 /// let results = store.range_query(b"user:001", b"user:003", 10)?;
35 /// assert_eq!(results.len(), 3);
36 /// # Ok(())
37 /// # }
38 /// ```
39 pub fn range_query(
40 &self,
41 start_key: &[u8],
42 end_key: &[u8],
43 limit: usize,
44 ) -> Result<Vec<(Vec<u8>, Vec<u8>)>> {
45 if start_key.len() > MAX_KEY_SIZE || end_key.len() > MAX_KEY_SIZE {
46 return Err(FeoxError::InvalidKeySize);
47 }
48
49 let mut results = Vec::new();
50
51 for entry in self.tree.range(start_key.to_vec()..=end_key.to_vec()) {
52 if results.len() >= limit {
53 break;
54 }
55
56 let record = entry.value();
57 let value = if let Some(val) = record.get_value() {
58 val.to_vec()
59 } else {
60 self.load_value_from_disk(record)?
61 };
62
63 results.push((entry.key().clone(), value));
64 }
65
66 Ok(results)
67 }
68}