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}