selene_graph/vector_index/
rebuild.rs1use std::num::NonZeroUsize;
4
5use selene_core::{DbString, HnswIndexConfig, IvfIndexConfig};
6
7use super::{VectorIndexKind, VectorIndexMemoryUsage};
8
9#[derive(Clone, Copy, Debug, Default, Eq, PartialEq)]
14pub struct VectorIndexMaintenancePolicy {
15 pub max_indexes_per_run: Option<NonZeroUsize>,
21}
22
23impl VectorIndexMaintenancePolicy {
24 #[must_use]
26 pub const fn recommended() -> Self {
27 Self {
28 max_indexes_per_run: None,
29 }
30 }
31
32 #[must_use]
34 pub const fn with_max_indexes_per_run(mut self, max_indexes_per_run: NonZeroUsize) -> Self {
35 self.max_indexes_per_run = Some(max_indexes_per_run);
36 self
37 }
38}
39
40#[derive(Clone, Debug, Eq, PartialEq)]
42pub struct VectorIndexRebuildEntry {
43 pub label: DbString,
45 pub property: DbString,
47 pub name: Option<DbString>,
49 pub kind: VectorIndexKind,
51 pub dimension: u32,
53 pub hnsw_config: Option<HnswIndexConfig>,
55 pub ivf_config: Option<IvfIndexConfig>,
57 pub before: VectorIndexMemoryUsage,
59 pub after: VectorIndexMemoryUsage,
61}
62
63#[derive(Clone, Debug, Default, Eq, PartialEq)]
65pub struct VectorIndexRebuildReport {
66 pub indexes_rebuilt: usize,
68 pub entries: Vec<VectorIndexRebuildEntry>,
70 pub reclaimed_hnsw_entries: usize,
72 pub reclaimed_hnsw_deleted_entries: usize,
74 pub reclaimed_ivf_entries: usize,
76 pub reclaimed_ivf_deleted_entries: usize,
78 pub reclaimed_index_bytes: usize,
80 pub reclaimed_reachable_bytes: usize,
82}
83
84impl VectorIndexRebuildReport {
85 pub(crate) fn new(entries: Vec<VectorIndexRebuildEntry>) -> Self {
86 let mut report = Self {
87 indexes_rebuilt: entries.len(),
88 entries,
89 ..Self::default()
90 };
91 for entry in &report.entries {
92 report.reclaimed_hnsw_entries = report.reclaimed_hnsw_entries.saturating_add(
93 entry
94 .before
95 .hnsw_entries
96 .saturating_sub(entry.after.hnsw_entries),
97 );
98 report.reclaimed_hnsw_deleted_entries =
99 report.reclaimed_hnsw_deleted_entries.saturating_add(
100 entry
101 .before
102 .hnsw_deleted_entries
103 .saturating_sub(entry.after.hnsw_deleted_entries),
104 );
105 report.reclaimed_ivf_entries = report.reclaimed_ivf_entries.saturating_add(
106 entry
107 .before
108 .ivf_entries
109 .saturating_sub(entry.after.ivf_entries),
110 );
111 report.reclaimed_ivf_deleted_entries =
112 report.reclaimed_ivf_deleted_entries.saturating_add(
113 entry
114 .before
115 .ivf_deleted_entries
116 .saturating_sub(entry.after.ivf_deleted_entries),
117 );
118 report.reclaimed_index_bytes = report.reclaimed_index_bytes.saturating_add(
119 entry
120 .before
121 .estimated_index_bytes
122 .saturating_sub(entry.after.estimated_index_bytes),
123 );
124 report.reclaimed_reachable_bytes = report.reclaimed_reachable_bytes.saturating_add(
125 entry
126 .before
127 .estimated_reachable_bytes
128 .saturating_sub(entry.after.estimated_reachable_bytes),
129 );
130 }
131 report
132 }
133}