Skip to main content

EdgeStore

Struct EdgeStore 

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

Storage for graph edges with bidirectional indexing.

Provides O(1) access to edges by ID and O(degree) access to outgoing/incoming edges for any node.

§Index Structure (EPIC-019 US-003)

  • by_label: Secondary index for O(k) label-based queries
  • outgoing_by_label: Composite index (source, label) for O(k) filtered traversal

§CSR Snapshot (G1)

After loading from disk or after explicit build_read_snapshot(), the csr_snapshot field provides zero-copy &[u64] access to neighbor target IDs and edge IDs. Writes invalidate the snapshot automatically.

Implementations§

Source§

impl EdgeStore

Source

pub fn new() -> Self

Creates a new empty edge store.

Source

pub fn with_capacity(expected_edges: usize, expected_nodes: usize) -> Self

Creates an edge store with pre-allocated capacity for better performance.

Pre-allocating reduces memory reallocation overhead when inserting many edges. With 10M edges, this can reduce peak memory usage by ~2x and improve insert throughput.

Note: when accessed through the sharded ConcurrentEdgeStore, an edge whose endpoints hash to different shards is stored in both shards (outgoing + incoming halves), which offsets part of that saving — with many shards this applies to nearly all edges.

§Arguments
  • expected_edges - Expected number of edges to store
  • expected_nodes - Expected number of unique nodes (sources + targets)
§Example
// For a graph with ~1M edges and ~100K nodes
let store = EdgeStore::with_capacity(1_000_000, 100_000);
Source

pub fn add_edge(&mut self, edge: GraphEdge) -> Result<()>

Adds an edge to the store.

Creates bidirectional index entries for efficient traversal. Also maintains label-based secondary indices (EPIC-019 US-003).

§Errors

Returns Error::EdgeExists if an edge with the same ID already exists.

Source

pub fn add_edge_outgoing_only(&mut self, edge: GraphEdge) -> Result<()>

Adds an edge with only the outgoing index (for cross-shard storage).

Used by ConcurrentEdgeStore when source and target are in different shards. The edge is stored and indexed by source node only.

§Errors

Returns Error::EdgeExists if an edge with the same ID already exists.

Source

pub fn add_edge_incoming_only(&mut self, edge: GraphEdge) -> Result<()>

Adds an edge with only the incoming index (for cross-shard storage).

Used by ConcurrentEdgeStore when source and target are in different shards. The edge is stored and indexed by target node only. Note: Label indices are maintained by the source shard in ConcurrentEdgeStore.

§Errors

Returns Error::EdgeExists if an edge with the same ID already exists.

Source

pub fn edge_count(&self) -> usize

Returns the total number of edges in the store.

Source

pub fn outgoing_edge_count(&self) -> usize

Returns the count of edges where this shard is the source (for accurate cross-shard counting).

Source

pub fn get_edge(&self, id: u64) -> Option<&GraphEdge>

Gets an edge by its ID.

Source

pub fn get_outgoing(&self, node_id: u64) -> Vec<&GraphEdge>

Gets all outgoing edges from a node.

Source

pub fn for_each_outgoing<F: FnMut(&GraphEdge)>(&self, node_id: u64, f: F)

Invokes f for each outgoing edge from node_id without allocating a Vec.

Prefer this over get_outgoing in hot loops (e.g. BFS frontiers) where the caller processes edges inline rather than collecting them.

Source

pub fn outgoing_degree(&self, node_id: u64) -> usize

Returns the number of outgoing edges from node_id without materializing them.

Source

pub fn incoming_degree(&self, node_id: u64) -> usize

Returns the number of incoming edges to node_id without materializing them.

Source

pub fn get_incoming(&self, node_id: u64) -> Vec<&GraphEdge>

Gets all incoming edges to a node.

Source

pub fn get_outgoing_by_label( &self, node_id: u64, label: &str, ) -> Vec<&GraphEdge>

Gets outgoing edges filtered by label using composite index - O(k) where k = result count.

Uses the outgoing_by_label composite index for fast lookup instead of iterating through all outgoing edges (EPIC-019 US-003).

Source

pub fn get_edges_by_label(&self, label: &str) -> Vec<&GraphEdge>

Gets all edges with a specific label - O(k) where k = result count.

Uses the by_label secondary index for fast lookup (EPIC-019 US-003).

Source

pub fn get_incoming_by_label( &self, node_id: u64, label: &str, ) -> Vec<&GraphEdge>

Gets incoming edges filtered by label.

Source

pub fn contains_edge(&self, edge_id: u64) -> bool

Checks if an edge with the given ID exists.

Source

pub fn len(&self) -> usize

Returns the number of edges in the store.

Source

pub fn is_empty(&self) -> bool

Returns true if the store contains no edges.

Source

pub fn all_edges(&self) -> Vec<&GraphEdge>

Returns all edges in the store.

Source§

impl EdgeStore

Source

pub fn build_read_snapshot(&mut self)

Builds a CSR snapshot from the current outgoing index.

This pre-computes contiguous arrays of target IDs, edge IDs, and interned labels for all source nodes. After calling this, BFS traversal uses with_neighbors() for zero-copy &[u64] access instead of cloning full GraphEdge objects.

§When to call
  • After loading from disk (graph is ready for reads)
  • After a batch of mutations, before a read-heavy phase

The snapshot is automatically invalidated by any write operation.

Source

pub fn csr_snapshot(&self) -> Option<&CsrSnapshot>

Returns a reference to the CSR snapshot, if built.

Source

pub fn has_csr_snapshot(&self) -> bool

Returns true if a CSR snapshot is available for zero-copy reads.

Source

pub fn with_neighbors<F, R>(&self, source_id: u64, f: F) -> R
where F: FnOnce(&[u64]) -> R,

Provides zero-copy access to neighbor target IDs via a callback.

Source

pub fn with_neighbor_edges<F, R>(&self, source_id: u64, f: F) -> R
where F: FnOnce(&[u64], &[u64]) -> R,

Provides zero-copy access to (target_id, edge_id) pairs via callback.

Source§

impl EdgeStore

Source

pub fn to_bytes(&self) -> Result<Vec<u8>, Error>

Serializes the edge store to bytes using postcard.

§Errors

Returns an error if serialization fails.

Source

pub fn from_bytes(bytes: &[u8]) -> Result<Self, Error>

Deserializes an edge store from bytes.

§Errors

Returns an error if deserialization fails (e.g., corrupted data).

Source

pub fn save_to_file(&self, path: &Path) -> Result<()>

Saves the edge store to a file.

§Errors

Returns an error if serialization or file I/O fails.

Source

pub fn load_from_file(path: &Path) -> Result<Self>

Loads an edge store from a file.

Automatically builds a CSR snapshot after loading for zero-copy BFS traversal (G1).

§Errors

Returns an error if file I/O or deserialization fails.

Source§

impl EdgeStore

Source

pub fn remove_edge(&mut self, edge_id: u64)

Removes an edge by ID.

Cleans up all indices: outgoing, incoming, by_label, and outgoing_by_label.

Source

pub fn remove_edge_outgoing_only(&mut self, edge_id: u64)

Removes an edge by ID, only cleaning the outgoing index.

Used by ConcurrentEdgeStore for cross-shard cleanup. Also cleans up label indices since they are maintained by source shard.

Source

pub fn remove_edge_incoming_only(&mut self, edge_id: u64)

Removes an edge by ID, only cleaning the incoming index.

Used by ConcurrentEdgeStore for cross-shard cleanup.

Source

pub fn remove_node_edges(&mut self, node_id: u64)

Removes all edges connected to a node (cascade delete).

Removes both outgoing and incoming edges, cleaning up all indices including label indices (EPIC-019 US-003).

Trait Implementations§

Source§

impl AdjacencySource for EdgeStore

Source§

fn neighbors(&self, node_id: u64) -> Vec<u64>

Returns outgoing neighbor target IDs from the edge index.

Source§

impl Debug for EdgeStore

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
Source§

impl Default for EdgeStore

Source§

fn default() -> EdgeStore

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

impl<'de> Deserialize<'de> for EdgeStore

Source§

fn deserialize<__D>(__deserializer: __D) -> Result<Self, __D::Error>
where __D: Deserializer<'de>,

Deserialize this value from the given Serde deserializer. Read more
Source§

impl Serialize for EdgeStore

Source§

fn serialize<__S>(&self, __serializer: __S) -> Result<__S::Ok, __S::Error>
where __S: Serializer,

Serialize this value into the given Serde serializer. 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> DeserializeOwned for T
where T: for<'de> Deserialize<'de>,

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> Paint for T
where T: ?Sized,

Source§

fn fg(&self, value: Color) -> Painted<&T>

Returns a styled value derived from self with the foreground set to value.

This method should be used rarely. Instead, prefer to use color-specific builder methods like red() and green(), which have the same functionality but are pithier.

§Example

Set foreground color to white using fg():

use yansi::{Paint, Color};

painted.fg(Color::White);

Set foreground color to white using white().

use yansi::Paint;

painted.white();
Source§

fn primary(&self) -> Painted<&T>

Returns self with the fg() set to [Color :: Primary].

§Example
println!("{}", value.primary());
Source§

fn fixed(&self, color: u8) -> Painted<&T>

Returns self with the fg() set to [Color :: Fixed].

§Example
println!("{}", value.fixed(color));
Source§

fn rgb(&self, r: u8, g: u8, b: u8) -> Painted<&T>

Returns self with the fg() set to [Color :: Rgb].

§Example
println!("{}", value.rgb(r, g, b));
Source§

fn black(&self) -> Painted<&T>

Returns self with the fg() set to [Color :: Black].

§Example
println!("{}", value.black());
Source§

fn red(&self) -> Painted<&T>

Returns self with the fg() set to [Color :: Red].

§Example
println!("{}", value.red());
Source§

fn green(&self) -> Painted<&T>

Returns self with the fg() set to [Color :: Green].

§Example
println!("{}", value.green());
Source§

fn yellow(&self) -> Painted<&T>

Returns self with the fg() set to [Color :: Yellow].

§Example
println!("{}", value.yellow());
Source§

fn blue(&self) -> Painted<&T>

Returns self with the fg() set to [Color :: Blue].

§Example
println!("{}", value.blue());
Source§

fn magenta(&self) -> Painted<&T>

Returns self with the fg() set to [Color :: Magenta].

§Example
println!("{}", value.magenta());
Source§

fn cyan(&self) -> Painted<&T>

Returns self with the fg() set to [Color :: Cyan].

§Example
println!("{}", value.cyan());
Source§

fn white(&self) -> Painted<&T>

Returns self with the fg() set to [Color :: White].

§Example
println!("{}", value.white());
Source§

fn bright_black(&self) -> Painted<&T>

Returns self with the fg() set to [Color :: BrightBlack].

§Example
println!("{}", value.bright_black());
Source§

fn bright_red(&self) -> Painted<&T>

Returns self with the fg() set to [Color :: BrightRed].

§Example
println!("{}", value.bright_red());
Source§

fn bright_green(&self) -> Painted<&T>

Returns self with the fg() set to [Color :: BrightGreen].

§Example
println!("{}", value.bright_green());
Source§

fn bright_yellow(&self) -> Painted<&T>

Returns self with the fg() set to [Color :: BrightYellow].

§Example
println!("{}", value.bright_yellow());
Source§

fn bright_blue(&self) -> Painted<&T>

Returns self with the fg() set to [Color :: BrightBlue].

§Example
println!("{}", value.bright_blue());
Source§

fn bright_magenta(&self) -> Painted<&T>

Returns self with the fg() set to [Color :: BrightMagenta].

§Example
println!("{}", value.bright_magenta());
Source§

fn bright_cyan(&self) -> Painted<&T>

Returns self with the fg() set to [Color :: BrightCyan].

§Example
println!("{}", value.bright_cyan());
Source§

fn bright_white(&self) -> Painted<&T>

Returns self with the fg() set to [Color :: BrightWhite].

§Example
println!("{}", value.bright_white());
Source§

fn bg(&self, value: Color) -> Painted<&T>

Returns a styled value derived from self with the background set to value.

This method should be used rarely. Instead, prefer to use color-specific builder methods like on_red() and on_green(), which have the same functionality but are pithier.

§Example

Set background color to red using fg():

use yansi::{Paint, Color};

painted.bg(Color::Red);

Set background color to red using on_red().

use yansi::Paint;

painted.on_red();
Source§

fn on_primary(&self) -> Painted<&T>

Returns self with the bg() set to [Color :: Primary].

§Example
println!("{}", value.on_primary());
Source§

fn on_fixed(&self, color: u8) -> Painted<&T>

Returns self with the bg() set to [Color :: Fixed].

§Example
println!("{}", value.on_fixed(color));
Source§

fn on_rgb(&self, r: u8, g: u8, b: u8) -> Painted<&T>

Returns self with the bg() set to [Color :: Rgb].

§Example
println!("{}", value.on_rgb(r, g, b));
Source§

fn on_black(&self) -> Painted<&T>

Returns self with the bg() set to [Color :: Black].

§Example
println!("{}", value.on_black());
Source§

fn on_red(&self) -> Painted<&T>

Returns self with the bg() set to [Color :: Red].

§Example
println!("{}", value.on_red());
Source§

fn on_green(&self) -> Painted<&T>

Returns self with the bg() set to [Color :: Green].

§Example
println!("{}", value.on_green());
Source§

fn on_yellow(&self) -> Painted<&T>

Returns self with the bg() set to [Color :: Yellow].

§Example
println!("{}", value.on_yellow());
Source§

fn on_blue(&self) -> Painted<&T>

Returns self with the bg() set to [Color :: Blue].

§Example
println!("{}", value.on_blue());
Source§

fn on_magenta(&self) -> Painted<&T>

Returns self with the bg() set to [Color :: Magenta].

§Example
println!("{}", value.on_magenta());
Source§

fn on_cyan(&self) -> Painted<&T>

Returns self with the bg() set to [Color :: Cyan].

§Example
println!("{}", value.on_cyan());
Source§

fn on_white(&self) -> Painted<&T>

Returns self with the bg() set to [Color :: White].

§Example
println!("{}", value.on_white());
Source§

fn on_bright_black(&self) -> Painted<&T>

Returns self with the bg() set to [Color :: BrightBlack].

§Example
println!("{}", value.on_bright_black());
Source§

fn on_bright_red(&self) -> Painted<&T>

Returns self with the bg() set to [Color :: BrightRed].

§Example
println!("{}", value.on_bright_red());
Source§

fn on_bright_green(&self) -> Painted<&T>

Returns self with the bg() set to [Color :: BrightGreen].

§Example
println!("{}", value.on_bright_green());
Source§

fn on_bright_yellow(&self) -> Painted<&T>

Returns self with the bg() set to [Color :: BrightYellow].

§Example
println!("{}", value.on_bright_yellow());
Source§

fn on_bright_blue(&self) -> Painted<&T>

Returns self with the bg() set to [Color :: BrightBlue].

§Example
println!("{}", value.on_bright_blue());
Source§

fn on_bright_magenta(&self) -> Painted<&T>

Returns self with the bg() set to [Color :: BrightMagenta].

§Example
println!("{}", value.on_bright_magenta());
Source§

fn on_bright_cyan(&self) -> Painted<&T>

Returns self with the bg() set to [Color :: BrightCyan].

§Example
println!("{}", value.on_bright_cyan());
Source§

fn on_bright_white(&self) -> Painted<&T>

Returns self with the bg() set to [Color :: BrightWhite].

§Example
println!("{}", value.on_bright_white());
Source§

fn attr(&self, value: Attribute) -> Painted<&T>

Enables the styling Attribute value.

This method should be used rarely. Instead, prefer to use attribute-specific builder methods like bold() and underline(), which have the same functionality but are pithier.

§Example

Make text bold using attr():

use yansi::{Paint, Attribute};

painted.attr(Attribute::Bold);

Make text bold using using bold().

use yansi::Paint;

painted.bold();
Source§

fn bold(&self) -> Painted<&T>

Returns self with the attr() set to [Attribute :: Bold].

§Example
println!("{}", value.bold());
Source§

fn dim(&self) -> Painted<&T>

Returns self with the attr() set to [Attribute :: Dim].

§Example
println!("{}", value.dim());
Source§

fn italic(&self) -> Painted<&T>

Returns self with the attr() set to [Attribute :: Italic].

§Example
println!("{}", value.italic());
Source§

fn underline(&self) -> Painted<&T>

Returns self with the attr() set to [Attribute :: Underline].

§Example
println!("{}", value.underline());

Returns self with the attr() set to [Attribute :: Blink].

§Example
println!("{}", value.blink());

Returns self with the attr() set to [Attribute :: RapidBlink].

§Example
println!("{}", value.rapid_blink());
Source§

fn invert(&self) -> Painted<&T>

Returns self with the attr() set to [Attribute :: Invert].

§Example
println!("{}", value.invert());
Source§

fn conceal(&self) -> Painted<&T>

Returns self with the attr() set to [Attribute :: Conceal].

§Example
println!("{}", value.conceal());
Source§

fn strike(&self) -> Painted<&T>

Returns self with the attr() set to [Attribute :: Strike].

§Example
println!("{}", value.strike());
Source§

fn quirk(&self, value: Quirk) -> Painted<&T>

Enables the yansi Quirk value.

This method should be used rarely. Instead, prefer to use quirk-specific builder methods like mask() and wrap(), which have the same functionality but are pithier.

§Example

Enable wrapping using .quirk():

use yansi::{Paint, Quirk};

painted.quirk(Quirk::Wrap);

Enable wrapping using wrap().

use yansi::Paint;

painted.wrap();
Source§

fn mask(&self) -> Painted<&T>

Returns self with the quirk() set to [Quirk :: Mask].

§Example
println!("{}", value.mask());
Source§

fn wrap(&self) -> Painted<&T>

Returns self with the quirk() set to [Quirk :: Wrap].

§Example
println!("{}", value.wrap());
Source§

fn linger(&self) -> Painted<&T>

Returns self with the quirk() set to [Quirk :: Linger].

§Example
println!("{}", value.linger());
Source§

fn clear(&self) -> Painted<&T>

👎Deprecated since 1.0.1:

renamed to resetting() due to conflicts with Vec::clear(). The clear() method will be removed in a future release.

Returns self with the quirk() set to [Quirk :: Clear].

§Example
println!("{}", value.clear());
Source§

fn resetting(&self) -> Painted<&T>

Returns self with the quirk() set to [Quirk :: Resetting].

§Example
println!("{}", value.resetting());
Source§

fn bright(&self) -> Painted<&T>

Returns self with the quirk() set to [Quirk :: Bright].

§Example
println!("{}", value.bright());
Source§

fn on_bright(&self) -> Painted<&T>

Returns self with the quirk() set to [Quirk :: OnBright].

§Example
println!("{}", value.on_bright());
Source§

fn whenever(&self, value: Condition) -> Painted<&T>

Conditionally enable styling based on whether the Condition value applies. Replaces any previous condition.

See the crate level docs for more details.

§Example

Enable styling painted only when both stdout and stderr are TTYs:

use yansi::{Paint, Condition};

painted.red().on_yellow().whenever(Condition::STDOUTERR_ARE_TTY);
Source§

fn new(self) -> Painted<Self>
where Self: Sized,

Create a new Painted with a default Style. Read more
Source§

fn paint<S>(&self, style: S) -> Painted<&Self>
where S: Into<Style>,

Apply a style wholesale to self. Any previous style is replaced. Read more
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, 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