Skip to main content

selene_graph/
candidate_state_shared.rs

1//! Shared-graph helpers for maintained candidate-state providers.
2
3use selene_core::DbString;
4
5use crate::{
6    CANDIDATE_STATE_PROVIDER_TAG, ProviderError, ProviderTag, SharedGraph, VectorCandidateSet,
7    VectorCandidateStateInfo,
8};
9
10impl SharedGraph {
11    /// Look up a generation-checked maintained vector candidate set by name.
12    ///
13    /// `Ok(None)` means no maintained candidate-state provider is registered or
14    /// the provider has no set named `name`. The returned set is tied to the
15    /// same immutable snapshot generation used for the lookup.
16    ///
17    /// # Errors
18    ///
19    /// Returns [`ProviderError`] when the candidate-state provider is present
20    /// but cannot prove it has applied through the current graph generation.
21    pub fn vector_candidate_set(
22        &self,
23        name: &DbString,
24    ) -> Result<Option<VectorCandidateSet>, ProviderError> {
25        let snapshot = self.read();
26        let Some(provider) = self.index_provider_by_tag(ProviderTag(CANDIDATE_STATE_PROVIDER_TAG))
27        else {
28            return Ok(None);
29        };
30        provider.vector_candidate_set(name, snapshot.meta.generation)
31    }
32
33    /// Return generation-checked metadata for maintained vector candidate states.
34    ///
35    /// An empty vector means no maintained candidate-state provider is
36    /// registered for this graph. The metadata is tied to the same immutable
37    /// graph snapshot that supplies the generation value, so callers can use the
38    /// returned names immediately with vector candidate-state scoring.
39    ///
40    /// # Errors
41    ///
42    /// Returns [`ProviderError`] when the candidate-state provider is present
43    /// but cannot prove it has applied through the current graph generation.
44    pub fn vector_candidate_state_infos(
45        &self,
46    ) -> Result<Vec<VectorCandidateStateInfo>, ProviderError> {
47        let snapshot = self.read();
48        let Some(provider) = self.index_provider_by_tag(ProviderTag(CANDIDATE_STATE_PROVIDER_TAG))
49        else {
50            return Ok(Vec::new());
51        };
52        provider.vector_candidate_state_infos(snapshot.meta.generation)
53    }
54}