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}