Struct re_entity_db::entity_db::EntityDb

source ·
pub struct EntityDb {
    pub data_source: Option<SmartChannelSource>,
    set_store_info: Option<SetStoreInfo>,
    last_modified_at: Instant,
    latest_row_id: Option<RowId>,
    entity_path_from_hash: IntMap<EntityPathHash, EntityPath>,
    times_per_timeline: TimesPerTimeline,
    time_histogram_per_timeline: TimeHistogramPerTimeline,
    tree: EntityTree,
    storage_engine: StorageEngine,
    stats: IngestionStatistics,
}
Expand description

An in-memory database built from a stream of [LogMsg]es.

NOTE: all mutation is to be done via public functions!

Fields§

§data_source: Option<SmartChannelSource>

Set by whomever created this EntityDb.

Clones of an EntityDb gets a None source.

§set_store_info: Option<SetStoreInfo>

Comes in a special message, [LogMsg::SetStoreInfo].

§last_modified_at: Instant

Keeps track of the last time data was inserted into this store (viewer wall-clock).

§latest_row_id: Option<RowId>

The highest RowId in the store, which corresponds to the last edit time. Ignores deletions.

§entity_path_from_hash: IntMap<EntityPathHash, EntityPath>

In many places we just store the hashes, so we need a way to translate back.

§times_per_timeline: TimesPerTimeline

The global-scope time tracker.

For each timeline, keeps track of what times exist, recursively across all entities/components.

Used for time control.

TODO(#7084): Get rid of TimesPerTimeline and implement time-stepping with crate::TimeHistogram instead.

§time_histogram_per_timeline: TimeHistogramPerTimeline

A time histogram of all entities, for every timeline.

§tree: EntityTree

A tree-view (split on path components) of the entities.

§storage_engine: StorageEngine

The StorageEngine that backs this EntityDb.

This object and all its internal fields are never allowed to be publicly exposed, whether that is directly or through methods, even if that’s just shared references.

The only way to get access to the StorageEngine from the outside is to use EntityDb::storage_engine, which returns a read-only guard. The design statically guarantees the absence of deadlocks and race conditions that normally results from letting store and cache handles arbitrarily loose all across the codebase.

§stats: IngestionStatistics

Implementations§

source§

impl EntityDb

source

pub fn new(store_id: StoreId) -> Self

source

pub fn with_store_config( store_id: StoreId, store_config: ChunkStoreConfig ) -> Self

source

pub fn tree(&self) -> &EntityTree

source

pub fn storage_engine(&self) -> StorageEngineReadGuard<'_>

Returns a read-only guard to the backing StorageEngine.

source

pub fn storage_engine_arc(&self) -> StorageEngineArcReadGuard

Returns a read-only guard to the backing StorageEngine.

That guard can be cloned at will and has a static lifetime.

It is not possible to insert any more data in this EntityDb until the returned guard, and any clones, have been dropped.

source

pub fn store_info_msg(&self) -> Option<&SetStoreInfo>

source

pub fn store_info(&self) -> Option<&StoreInfo>

source

pub fn app_id(&self) -> Option<&ApplicationId>

source

pub fn latest_at( &self, query: &LatestAtQuery, entity_path: &EntityPath, component_names: impl IntoIterator<Item = ComponentName> ) -> LatestAtResults

Queries for the given component_names using latest-at semantics.

See re_query::LatestAtResults for more information about how to handle the results.

This is a cached API – data will be lazily cached upon access.

source

pub fn latest_at_component<C: Component>( &self, entity_path: &EntityPath, query: &LatestAtQuery ) -> Option<((TimeInt, RowId), C)>

Get the latest index and value for a given dense [re_types_core::Component].

This assumes that the row we get from the store contains at most one instance for this component; it will log a warning otherwise.

This should only be used for “mono-components” such as Transform and Tensor.

This is a best-effort helper, it will merely log errors on failure.

source

pub fn latest_at_component_quiet<C: Component>( &self, entity_path: &EntityPath, query: &LatestAtQuery ) -> Option<((TimeInt, RowId), C)>

Get the latest index and value for a given dense [re_types_core::Component].

This assumes that the row we get from the store contains at most one instance for this component; it will log a warning otherwise.

This should only be used for “mono-components” such as Transform and Tensor.

This is a best-effort helper, and will quietly swallow any errors.

source

pub fn latest_at_component_at_closest_ancestor<C: Component>( &self, entity_path: &EntityPath, query: &LatestAtQuery ) -> Option<(EntityPath, (TimeInt, RowId), C)>

source

pub fn store_kind(&self) -> StoreKind

source

pub fn store_id(&self) -> StoreId

source

pub fn cloned_from(&self) -> Option<&StoreId>

If this entity db is the result of a clone, which store was it cloned from?

A cloned store always gets a new unique ID.

We currently only use entity db cloning for blueprints: when we activate a default blueprint that was received on the wire (e.g. from a recording), we clone it and make the clone the active blueprint. This means all active blueprints are clones.

source

pub fn timelines(&self) -> impl ExactSizeIterator<Item = &Timeline>

source

pub fn times_per_timeline(&self) -> &TimesPerTimeline

source

pub fn has_any_data_on_timeline(&self, timeline: &Timeline) -> bool

source

pub fn time_range_for(&self, timeline: &Timeline) -> Option<ResolvedTimeRange>

Returns the time range of data on the given timeline, ignoring any static times.

source

pub fn time_histogram(&self, timeline: &Timeline) -> Option<&TimeHistogram>

Histogram of all events on the timeeline, of all entities.

source

pub fn num_rows(&self) -> u64

source

pub fn generation(&self) -> ChunkStoreGeneration

Return the current ChunkStoreGeneration. This can be used to determine whether the database has been modified since the last time it was queried.

source

pub fn last_modified_at(&self) -> Instant

source

pub fn latest_row_id(&self) -> Option<RowId>

The highest RowId in the store, which corresponds to the last edit time. Ignores deletions.

source

pub fn is_empty(&self) -> bool

source

pub fn entity_paths(&self) -> Vec<&EntityPath>

A sorted list of all the entity paths in this database.

source

pub fn ingestion_stats(&self) -> &IngestionStatistics

source

pub fn entity_path_from_hash( &self, entity_path_hash: &EntityPathHash ) -> Option<&EntityPath>

source

pub fn is_known_entity(&self, entity_path: &EntityPath) -> bool

Returns true also for entities higher up in the hierarchy.

source

pub fn is_logged_entity(&self, entity_path: &EntityPath) -> bool

If you log world/points, then that is a logged entity, but world is not, unless you log something to world too.

source

pub fn add(&mut self, msg: &LogMsg) -> Result<Vec<ChunkStoreEvent>, Error>

source

pub fn add_chunk( &mut self, chunk: &Arc<Chunk> ) -> Result<Vec<ChunkStoreEvent>, Error>

source

pub fn set_store_info(&mut self, store_info: SetStoreInfo)

source

pub fn gc_everything_but_the_latest_row_on_non_default_timelines( &mut self ) -> Vec<ChunkStoreEvent>

source

pub fn purge_fraction_of_ram( &mut self, fraction_to_purge: f32 ) -> Vec<ChunkStoreEvent>

Free up some RAM by forgetting the older parts of all timelines.

source

pub(crate) fn gc( &mut self, gc_options: &GarbageCollectionOptions ) -> Vec<ChunkStoreEvent>

source

pub fn drop_time_range( &mut self, timeline: &Timeline, drop_range: ResolvedTimeRange ) -> Vec<ChunkStoreEvent>

Drop all events in the given time range from the given timeline.

Used to implement undo (erase the last event from the blueprint db).

source

pub fn drop_entity_path(&mut self, entity_path: &EntityPath)

Unconditionally drops all the data for a given [EntityPath] .

This is not recursive. Children of this entity will not be affected.

To drop the entire subtree below an entity, see: Self::drop_entity_path_recursive.

source

pub fn drop_entity_path_recursive(&mut self, entity_path: &EntityPath)

Unconditionally drops all the data for a given [EntityPath] and all its children.

source

fn on_store_deletions( times_per_timeline: &mut TimesPerTimeline, time_histogram_per_timeline: &mut TimeHistogramPerTimeline, tree: &mut EntityTree, engine: StorageEngineWriteGuard<'_>, store_events: &[ChunkStoreEvent] )

source

pub fn sort_key(&self) -> impl Ord + '_

Key used for sorting recordings in the UI.

source

pub fn to_messages( &self, time_selection: Option<(Timeline, ResolvedTimeRangeF)> ) -> impl Iterator<Item = ChunkResult<LogMsg>> + '_

Export the contents of the current database to a sequence of messages.

If time_selection is specified, then only data for that specific timeline over that specific time range will be accounted for.

source

pub fn clone_with_new_id(&self, new_id: StoreId) -> Result<Self, Error>

Make a clone of this EntityDb, assigning it a new [StoreId].

source§

impl EntityDb

§Stats
source

pub fn subtree_stats_static( &self, engine: &StorageEngineReadGuard<'_>, entity_path: &EntityPath ) -> ChunkStoreChunkStats

Returns the stats for the static store of the entity and all its children, recursively.

This excludes temporal data.

source

pub fn subtree_stats_on_timeline( &self, engine: &StorageEngineReadGuard<'_>, entity_path: &EntityPath, timeline: &Timeline ) -> ChunkStoreChunkStats

Returns the stats for the entity and all its children on the given timeline, recursively.

This excludes static data.

source

pub fn subtree_has_data_on_timeline( &self, engine: &StorageEngineReadGuard<'_>, timeline: &Timeline, entity_path: &EntityPath ) -> bool

Returns true if an entity or any of its children have any data on the given timeline.

This includes static data.

source

pub fn subtree_has_temporal_data_on_timeline( &self, engine: &StorageEngineReadGuard<'_>, timeline: &Timeline, entity_path: &EntityPath ) -> bool

Returns true if an entity or any of its children have any temporal data on the given timeline.

This ignores static data.

Trait Implementations§

source§

impl SizeBytes for EntityDb

source§

fn heap_size_bytes(&self) -> u64

Returns the total size of self on the heap, in bytes.
§

fn total_size_bytes(&self) -> u64

Returns the total size of self in bytes, accounting for both stack and heap space.
§

fn stack_size_bytes(&self) -> u64

Returns the total size of self on the stack, in bytes. Read more
§

fn is_pod() -> bool

Is Self just plain old data? 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> Az for T

source§

fn az<Dst>(self) -> Dst
where T: Cast<Dst>,

Casts the value.
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<Src, Dst> CastFrom<Src> for Dst
where Src: Cast<Dst>,

source§

fn cast_from(src: Src) -> Dst

Casts the value.
source§

impl<T> CheckedAs for T

source§

fn checked_as<Dst>(self) -> Option<Dst>
where T: CheckedCast<Dst>,

Casts the value.
source§

impl<Src, Dst> CheckedCastFrom<Src> for Dst
where Src: CheckedCast<Dst>,

source§

fn checked_cast_from(src: Src) -> Option<Dst>

Casts the value.
§

impl<T> Downcast for T
where T: Any,

§

fn into_any(self: Box<T>) -> Box<dyn Any>

Convert Box<dyn Trait> (where Trait: Downcast) to Box<dyn Any>. Box<dyn Any> can then be further downcast into Box<ConcreteType> where ConcreteType implements Trait.
§

fn into_any_rc(self: Rc<T>) -> Rc<dyn Any>

Convert Rc<Trait> (where Trait: Downcast) to Rc<Any>. Rc<Any> can then be further downcast into Rc<ConcreteType> where ConcreteType implements Trait.
§

fn as_any(&self) -> &(dyn Any + 'static)

Convert &Trait (where Trait: Downcast) to &Any. This is needed since Rust cannot generate &Any’s vtable from &Trait’s.
§

fn as_any_mut(&mut self) -> &mut (dyn Any + 'static)

Convert &mut Trait (where Trait: Downcast) to &Any. This is needed since Rust cannot generate &mut Any’s vtable from &mut Trait’s.
§

impl<T> DowncastSync for T
where T: Any + Send + Sync,

§

fn into_any_arc(self: Arc<T>) -> Arc<dyn Any + Sync + Send>

Convert Arc<Trait> (where Trait: Downcast) to Arc<Any>. Arc<Any> can then be further downcast into Arc<ConcreteType> where ConcreteType implements Trait.
source§

impl<T> From<T> for T

source§

fn from(t: T) -> T

Returns the argument unchanged.

§

impl<T> Instrument for T

§

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

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

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<Src, Dst> LosslessTryInto<Dst> for Src
where Dst: LosslessTryFrom<Src>,

source§

fn lossless_try_into(self) -> Option<Dst>

Performs the conversion.
source§

impl<Src, Dst> LossyInto<Dst> for Src
where Dst: LossyFrom<Src>,

source§

fn lossy_into(self) -> Dst

Performs the conversion.
source§

impl<T> OverflowingAs for T

source§

fn overflowing_as<Dst>(self) -> (Dst, bool)
where T: OverflowingCast<Dst>,

Casts the value.
source§

impl<Src, Dst> OverflowingCastFrom<Src> for Dst
where Src: OverflowingCast<Dst>,

source§

fn overflowing_cast_from(src: Src) -> (Dst, bool)

Casts the value.
§

impl<T> Pointable for T

§

const ALIGN: usize = _

The alignment of pointer.
§

type Init = T

The type for initializers.
§

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

Initializes a with the given initializer. Read more
§

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

Dereferences the given pointer. Read more
§

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

Mutably dereferences the given pointer. Read more
§

unsafe fn drop(ptr: usize)

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

impl<T> Same for T

§

type Output = T

Should always be Self
source§

impl<T> SaturatingAs for T

source§

fn saturating_as<Dst>(self) -> Dst
where T: SaturatingCast<Dst>,

Casts the value.
source§

impl<Src, Dst> SaturatingCastFrom<Src> for Dst
where Src: SaturatingCast<Dst>,

source§

fn saturating_cast_from(src: Src) -> Dst

Casts the value.
source§

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

§

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>,

§

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

source§

fn unwrapped_as<Dst>(self) -> Dst
where T: UnwrappedCast<Dst>,

Casts the value.
source§

impl<Src, Dst> UnwrappedCastFrom<Src> for Dst
where Src: UnwrappedCast<Dst>,

source§

fn unwrapped_cast_from(src: Src) -> Dst

Casts the value.
§

impl<V, T> VZip<V> for T
where V: MultiLane<T>,

§

fn vzip(self) -> V

§

impl<T> WithSubscriber for T

§

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
§

fn with_current_subscriber(self) -> WithDispatch<Self>

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

impl<T> WrappingAs for T

source§

fn wrapping_as<Dst>(self) -> Dst
where T: WrappingCast<Dst>,

Casts the value.
source§

impl<Src, Dst> WrappingCastFrom<Src> for Dst
where Src: WrappingCast<Dst>,

source§

fn wrapping_cast_from(src: Src) -> Dst

Casts the value.
§

impl<T> Ungil for T
where T: Send,