Skip to main content

kevy_index/
view_mode.rs

1//! [`ViewMode`] — how a view answers: evaluated per query, or kept
2//! as an incremental result set.
3
4/// View mode.
5///
6/// ```
7/// use kevy_index::{IndexValue, Leaf, Tree, ViewMode, ViewSpec};
8/// let t = Tree::Leaf(Leaf::new("age", IndexValue::I64(0), IndexValue::I64(99)));
9/// let v = ViewSpec::new("v", t, "age");
10/// assert_eq!(v.mode, ViewMode::Virtual, "views are virtual unless declared otherwise");
11/// ```
12#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
13#[non_exhaustive]
14pub enum ViewMode {
15    /// Evaluate the tree at query time.
16    ///
17    /// ```
18    /// use kevy_index::ViewMode;
19    /// assert_eq!(ViewMode::Virtual.name(), "virtual");
20    /// ```
21    Virtual,
22    /// Maintain an incremental result set; `top_k = 0` = unbounded.
23    ///
24    /// ```
25    /// use kevy_index::ViewMode;
26    /// let m = ViewMode::Materialized { top_k: 10 };
27    /// assert_eq!(m.name(), "materialized");
28    /// ```
29    Materialized {
30        /// Bounded size (0 = keep every member).
31        ///
32        /// ```
33        /// use kevy_index::{IndexValue, MaterializedSet, Membership, SortOrder};
34        /// // K = 2 keeps K + K/4 = 2 members
35        /// let mut top2 = MaterializedSet::new(2, SortOrder::Desc);
36        /// for (k, v) in [(b"a", 1), (b"b", 5), (b"c", 3)] {
37        ///     top2.apply(k, Membership::Member(Some(IndexValue::I64(v))));
38        /// }
39        /// assert_eq!(top2.len(), 2, "top_k bounds the members kept");
40        /// assert_eq!(top2.page(None, 9)[1], (IndexValue::I64(3), b"c".to_vec()));
41        /// ```
42        top_k: u32,
43    },
44}
45
46impl ViewMode {
47    /// The mode as `VIEW.CREATE … MODE` and the describe replies spell it.
48    ///
49    /// ```
50    /// use kevy_index::ViewMode;
51    /// assert_eq!(ViewMode::Virtual.name(), "virtual");
52    /// assert_eq!(ViewMode::Materialized { top_k: 5 }.name(), "materialized");
53    /// ```
54    pub fn name(&self) -> &'static str {
55        match self {
56            ViewMode::Virtual => "virtual",
57            ViewMode::Materialized { .. } => "materialized",
58        }
59    }
60}