Skip to main content

NodeSecondaryIndex

Struct NodeSecondaryIndex 

Source
pub struct NodeSecondaryIndex { /* private fields */ }
Expand description

Inverted secondary indexes on graph nodes.

  • by_type: LabelId → set of node ids — keyed by the registry-assigned identifier so user-defined labels participate in the same fast path the legacy enum used to enjoy.
  • by_label: label string → set of node ids (display label, not category)
  • label_bloom: fast negative filter over distinct display labels

Implementations§

Source§

impl NodeSecondaryIndex

Source

pub fn new(expected_labels: usize) -> NodeSecondaryIndex

Create an empty index sized for expected_labels distinct label values (used to size the bloom filter).

Source

pub fn insert(&self, node_id: &str, label_id: LabelId, label: &str)

Record (label_id, label, node_id) in both inverted maps.

Safe to call concurrently — each map takes its own write lock. Duplicate inserts are idempotent (sets).

Source

pub fn remove(&self, node_id: &str, label_id: LabelId, label: &str)

Remove a node from both inverted maps. Does not rebuild the bloom (bloom filters don’t support removal — stale positives are harmless).

Source

pub fn nodes_by_type(&self, label_id: LabelId) -> Vec<String>

Return all node ids of a given label. O(1) lookup + clone.

Source

pub fn nodes_by_label(&self, label: &str) -> Vec<String>

Return all node ids with a given label. Uses the bloom as a pre-check — callers get an immediate empty Vec for definitely-absent labels.

Source

pub fn count_by_type(&self, label_id: LabelId) -> usize

Cardinality of a label bucket (fast stat for the planner).

Source

pub fn label_id_counts(&self) -> Vec<(LabelId, u64)>

Snapshot (label_id, cardinality) for every populated bucket. Cheap enough for stats() to call on demand instead of a full iter_nodes() scan.

Source

pub fn distinct_labels(&self) -> usize

Number of distinct labels tracked.

Source

pub fn distinct_types(&self) -> usize

Number of distinct node types tracked.

Source

pub fn clear(&self)

Reset everything. Used by rebuild_indexes.

Source§

impl NodeSecondaryIndex

Source

pub fn may_contain_label(&self, label: &str) -> bool

Public fast-path for label membership. Returns false iff the bloom proves the label was never inserted.

Trait Implementations§

Source§

impl Default for NodeSecondaryIndex

Source§

fn default() -> NodeSecondaryIndex

Returns the “default value” for a type. Read more
Source§

impl HasBloom for NodeSecondaryIndex

HasBloom impl pushes the label bloom through the shared trait so the unified query planner can consult it uniformly.

Note: this returns None because the underlying bloom is behind a RwLock. See NodeSecondaryIndex::may_contain_label for the actual fast-path. The impl exists so call-sites that only know dyn HasBloom can still reach the index via IndexBase::definitely_absent.

Source§

fn bloom_segment(&self) -> Option<&BloomSegment>

Reference to the bloom filter attached to this segment, if any.
Source§

fn definitely_absent(&self, key: &[u8]) -> bool

Fast-path negative check. Returns true iff the bloom is present and reports the key as absent.
Source§

impl IndexBase for NodeSecondaryIndex

Source§

fn name(&self) -> &str

Human-readable name (e.g. “users.email”, “graph.city_by_node”).
Source§

fn kind(&self) -> IndexKind

Index family (btree, hash, bitmap, hnsw, …).
Source§

fn stats(&self) -> IndexStats

Current statistics (cardinality, estimated selectivity, memory).
Source§

fn bloom(&self) -> Option<&BloomFilter>

Optional bloom filter for fast negative lookups. Cross-structure pruning relies on this.
Source§

fn definitely_absent(&self, key_bytes: &[u8]) -> bool

Returns true iff the key is guaranteed to be absent from this index. Default implementation consults IndexBase::bloom and falls back to false when no bloom is available (meaning “don’t know — caller must probe”). Read more

Auto Trait Implementations§

Blanket Implementations§

Source§

impl<T> Any for T
where T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

Source§

impl<T> Instrument for T

Source§

fn instrument(self, span: Span) -> Instrumented<Self>

Instruments this type with the provided Span, returning an Instrumented wrapper. Read more
Source§

fn in_current_span(self) -> Instrumented<Self>

Instruments this type with the current Span, returning an Instrumented wrapper. Read more
Source§

impl<T, U> Into<U> for T
where U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

That is, this conversion is whatever the implementation of From<T> for U chooses to do.

Source§

impl<T> IntoEither for T

Source§

fn into_either(self, into_left: bool) -> Either<Self, Self>

Converts self into a Left variant of Either<Self, Self> if into_left is true. Converts self into a Right variant of Either<Self, Self> otherwise. Read more
Source§

fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>
where F: FnOnce(&Self) -> bool,

Converts self into a Left variant of Either<Self, Self> if into_left(&self) returns true. Converts self into a Right variant of Either<Self, Self> otherwise. Read more
Source§

impl<T> IntoRequest<T> for T

Source§

fn into_request(self) -> Request<T>

Wrap the input message T in a tonic::Request
Source§

impl<L> LayerExt<L> for L

Source§

fn named_layer<S>(&self, service: S) -> Layered<<L as Layer<S>>::Service, S>
where L: Layer<S>,

Applies the layer to a service and wraps it in Layered.
Source§

impl<T> Pointable for T

Source§

const ALIGN: usize

The alignment of pointer.
Source§

type Init = T

The type for initializers.
Source§

unsafe fn init(init: <T as Pointable>::Init) -> usize

Initializes a with the given initializer. Read more
Source§

unsafe fn deref<'a>(ptr: usize) -> &'a T

Dereferences the given pointer. Read more
Source§

unsafe fn deref_mut<'a>(ptr: usize) -> &'a mut T

Mutably dereferences the given pointer. Read more
Source§

unsafe fn drop(ptr: usize)

Drops the object pointed to by the given pointer. Read more
Source§

impl<T> Same for T

Source§

type Output = T

Should always be Self
Source§

impl<T, U> TryFrom<U> for T
where U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
Source§

impl<T> WithSubscriber for T

Source§

fn with_subscriber<S>(self, subscriber: S) -> WithDispatch<Self>
where S: Into<Dispatch>,

Attaches the provided Subscriber to this type, returning a WithDispatch wrapper. Read more
Source§

fn with_current_subscriber(self) -> WithDispatch<Self>

Attaches the current default Subscriber to this type, returning a WithDispatch wrapper. Read more