Skip to main content

CrdtState

Struct CrdtState 

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

A CRDT state for a single tenant/namespace.

Implementations§

Source§

impl CrdtState

Source

pub fn upsert_versioned( &self, collection: &str, row_id: &str, fields: &[(&str, LoroValue)], ) -> Result<()>

Upsert a row with prior-version archiving for bitemporal collections. When a row with row_id already exists and carries a finite _ts_system, its field map is copied into the bitemporal history sibling before the new fields overwrite the live row. Non-bitemporal callers should stay on CrdtState::upsert — the archive has a non-trivial doc-size cost and is only meaningful when the collection participates in AS OF / audit queries.

Source

pub fn read_row_as_of( &self, collection: &str, row_id: &str, asof_ms: i64, ) -> Option<LoroValue>

Read the row as it was at asof_ms (system-time). Scans the archive for the highest sys_ms <= asof_ms; falls back to the current row when its _ts_system <= asof_ms; returns None when no version existed at or before the requested time.

Source

pub fn archive_version_count(&self, collection: &str, row_id: &str) -> usize

Count archived versions for a row (live row excluded). Primarily for tests and operational introspection.

Source

pub fn purge_history_before( &self, collection: &str, cutoff_ms: i64, ) -> Result<usize>

Drop archived versions with sys_ms < cutoff_ms for the given collection. Returns the number of archive entries deleted. The live row is never touched — retention only reclaims history, so the current state of every logical row remains readable even when the entire archive is pruned.

Source§

impl CrdtState

Source

pub fn new(peer_id: u64) -> Result<Self>

Create a new empty state for the given peer.

Source

pub fn register_array_surrogate(&mut self, id: String)

Register an array-engine surrogate ID as a valid referent for FK checks.

Call this before running constraint validation whenever the referent collection is backed by the array engine rather than the document/graph engines. The ID must be the string form of the surrogate (e.g., the decimal representation of the Surrogate value or the composite key used by the array catalog).

Source

pub fn upsert( &self, collection: &str, row_id: &str, fields: &[(&str, LoroValue)], ) -> Result<()>

Insert or update a row in a collection.

Source

pub fn delete(&self, collection: &str, row_id: &str) -> Result<()>

Delete a row from a collection.

Source

pub fn clear_collection(&self, collection: &str) -> Result<usize>

Delete all rows in a collection. Returns the number of rows deleted.

Source

pub fn read_row(&self, collection: &str, row_id: &str) -> Option<LoroValue>

Read a single row’s fields as a LoroValue::Map.

Navigates via LoroMap::get() to avoid the expensive recursive get_deep_value() clone on the entire row container.

Source

pub fn read_field( &self, collection: &str, row_id: &str, field: &str, ) -> Option<LoroValue>

Read a single field from a row without cloning the entire row.

This is the fast path for KV-style access where only one field is needed. Avoids allocating a full Map for single-field reads.

Shares the same doc.get_map(collection).get(row_id) lookup pattern as read_row, but returns a single field value instead of the whole row map — different return granularity, intentionally kept separate.

Source

pub fn row_exists(&self, collection: &str, row_id: &str) -> bool

Check if a row exists in a collection.

Checks the Loro-backed document/graph collections first. If not found there, falls back to the registered array surrogate set so that BiTemporalFK and ForeignKey constraints can reference array-engine cells as valid referents without requiring a full cross-engine query.

Source

pub fn collection_names(&self) -> Vec<String>

List all collection names (top-level map keys in the Loro doc).

Source

pub fn row_ids(&self, collection: &str) -> Vec<String>

Get all row IDs in a collection.

Source

pub fn field_value_exists( &self, collection: &str, field: &str, value: &LoroValue, ) -> bool

Check if a value exists for the given field across all rows in a collection. Used for UNIQUE constraint checking.

Source

pub fn field_value_exists_live( &self, collection: &str, field: &str, value: &LoroValue, ) -> bool

Bitemporal variant of [field_value_exists]: only considers rows whose _ts_valid_until is open (absent or i64::MAX).

A UNIQUE collision between a superseded version and a new live row is not a violation — both may share the same value because they represent the same logical entity at different valid-times.

Source

pub fn live_row_ids(&self, collection: &str) -> Vec<String>

Return row IDs currently “live” in a bitemporal collection (rows whose _ts_valid_until is open). For non-bitemporal collections every row is returned.

Source

pub fn doc(&self) -> &LoroDoc

Get the underlying LoroDoc for advanced operations.

Source

pub fn peer_id(&self) -> u64

Peer ID of this state.

Source§

impl CrdtState

Source

pub fn oplog_version_vector(&self) -> VersionVector

Get the current oplog version vector.

Source

pub fn read_at_version( &self, collection: &str, row_id: &str, version: &VersionVector, ) -> Result<Option<LoroValue>>

Read the document state at a historical version.

Uses fork_at to create a lightweight copy at the target version and reads the specified row. Returns None if the row didn’t exist.

Cost: O(oplog_size) for the fork — not for hot-path queries.

Source

pub fn export_updates_since( &self, from_version: &VersionVector, ) -> Result<Vec<u8>>

Export the oplog delta from a version to the current state.

Returns the operations that transform from_version into current state. Used for DIFF rendering and delta sync.

Source

pub fn compact_at_version(&mut self, version: &VersionVector) -> Result<()>

Compact history at a specific version (not just current frontiers).

Discards oplog entries before the target version. Current state and all versions after the target are preserved.

Source

pub fn restore_to_version( &self, collection: &str, row_id: &str, version: &VersionVector, ) -> Result<Vec<u8>>

Restore a document to a historical version by creating a forward delta.

Reads the state at the target version, then generates a new mutation that sets the current state to match the historical state. History is preserved — this is a forward operation, not a rollback.

Returns the delta bytes to be applied through the normal write path.

Source§

impl CrdtState

Source

pub fn export_snapshot(&self) -> Result<Vec<u8>>

Export the current state as bytes for sync.

Source

pub fn import(&self, data: &[u8]) -> Result<()>

Import remote updates.

Source

pub fn compact_history(&mut self) -> Result<()>

Compact the CRDT history by replacing the internal LoroDoc with a shallow snapshot.

A shallow snapshot contains the current state but discards the full operation history. This is the CRDT equivalent of WAL truncation after checkpoint.

After compaction:

  • All current state is preserved (reads return same values).
  • New deltas can still be applied and merged.
  • Historical operations before the snapshot point are gone.
  • Peers that sync after compaction receive a full snapshot instead of incremental deltas (acceptable for long-offline peers).

Call this periodically (e.g., every 30 minutes or when memory pressure exceeds threshold) to prevent unbounded history growth.

Source

pub fn estimated_memory_bytes(&self) -> usize

Estimated memory usage of the CRDT state (bytes).

Includes operation history, current state, and internal caches. Use this to decide when to trigger compact_history().

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> ArchivePointee for T

Source§

type ArchivedMetadata = ()

The archived version of the pointer metadata for this type.
Source§

fn pointer_metadata( _: &<T as ArchivePointee>::ArchivedMetadata, ) -> <T as Pointee>::Metadata

Converts some archived metadata to the pointer metadata for itself.
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> LayoutRaw for T

Source§

fn layout_raw(_: <T as Pointee>::Metadata) -> Result<Layout, LayoutError>

Returns the layout of the type.
Source§

impl<T, N1, N2> Niching<NichedOption<T, N1>> for N2
where T: SharedNiching<N1, N2>, N1: Niching<T>, N2: Niching<T>,

Source§

unsafe fn is_niched(niched: *const NichedOption<T, N1>) -> bool

Returns whether the given value has been niched. Read more
Source§

fn resolve_niched(out: Place<NichedOption<T, N1>>)

Writes data to out indicating that a T is niched.
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> Pointee for T

Source§

type Metadata = ()

The metadata type for pointers and references to this type.
Source§

impl<T> Same for T

Source§

type Output = T

Should always be Self
Source§

impl<SS, SP> SupersetOf<SS> for SP
where SS: SubsetOf<SP>,

Source§

fn to_subset(&self) -> Option<SS>

The inverse inclusion map: attempts to construct self from the equivalent element of its superset. Read more
Source§

fn is_in_subset(&self) -> bool

Checks if self is actually part of its subset T (and can be converted to it).
Source§

fn to_subset_unchecked(&self) -> SS

Use with care! Same as self.to_subset but without any property checks. Always succeeds.
Source§

fn from_subset(element: &SS) -> SP

The inclusion map: converts self to the equivalent element of its superset.
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<V, T> VZip<V> for T
where V: MultiLane<T>,

Source§

fn vzip(self) -> V

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