pub struct PropertyStorage<Id: EntityId = NodeId> { /* private fields */ }Expand description
Thread-safe columnar property storage.
Each property key (“name”, “age”, etc.) gets its own column. This layout is great for analytical queries that filter on specific properties - you only touch the columns you need.
Generic over Id so the same storage works for nodes and edges.
§Example
use grafeo_core::graph::lpg::PropertyStorage;
use grafeo_common::types::{NodeId, PropertyKey};
let storage = PropertyStorage::new();
let alice = NodeId::new(1);
storage.set(alice, PropertyKey::new("name"), "Alice".into());
storage.set(alice, PropertyKey::new("age"), 30i64.into());
// Fetch all properties at once
let props = storage.get_all(alice);
assert_eq!(props.len(), 2);Implementations§
Source§impl<Id: EntityId> PropertyStorage<Id>
impl<Id: EntityId> PropertyStorage<Id>
Sourcepub fn with_compression(mode: CompressionMode) -> Self
pub fn with_compression(mode: CompressionMode) -> Self
Creates a new property storage with compression enabled.
Sourcepub fn set_default_compression(&mut self, mode: CompressionMode)
pub fn set_default_compression(&mut self, mode: CompressionMode)
Sets the default compression mode for new columns.
Sourcepub fn set(&self, id: Id, key: PropertyKey, value: Value)
pub fn set(&self, id: Id, key: PropertyKey, value: Value)
Sets a property value for an entity.
Sourcepub fn enable_compression(&self, key: &PropertyKey, mode: CompressionMode)
pub fn enable_compression(&self, key: &PropertyKey, mode: CompressionMode)
Enables compression for a specific column.
Sourcepub fn compress_all(&self)
pub fn compress_all(&self)
Compresses all columns that have compression enabled.
Sourcepub fn force_compress_all(&self)
pub fn force_compress_all(&self)
Forces compression on all columns regardless of mode.
Sourcepub fn compression_stats(&self) -> FxHashMap<PropertyKey, CompressionStats>
pub fn compression_stats(&self) -> FxHashMap<PropertyKey, CompressionStats>
Returns compression statistics for all columns.
Sourcepub fn memory_usage(&self) -> usize
pub fn memory_usage(&self) -> usize
Returns the total memory usage of all columns.
Sourcepub fn get(&self, id: Id, key: &PropertyKey) -> Option<Value>
pub fn get(&self, id: Id, key: &PropertyKey) -> Option<Value>
Gets a property value for an entity.
Sourcepub fn remove(&self, id: Id, key: &PropertyKey) -> Option<Value>
pub fn remove(&self, id: Id, key: &PropertyKey) -> Option<Value>
Removes a property value for an entity.
Sourcepub fn remove_all(&self, id: Id)
pub fn remove_all(&self, id: Id)
Removes all properties for an entity.
Sourcepub fn get_all(&self, id: Id) -> FxHashMap<PropertyKey, Value>
pub fn get_all(&self, id: Id) -> FxHashMap<PropertyKey, Value>
Gets all properties for an entity.
Sourcepub fn get_batch(&self, ids: &[Id], key: &PropertyKey) -> Vec<Option<Value>>
pub fn get_batch(&self, ids: &[Id], key: &PropertyKey) -> Vec<Option<Value>>
Gets property values for multiple entities in a single lock acquisition.
More efficient than calling Self::get in a loop because it acquires
the read lock only once.
§Example
use grafeo_core::graph::lpg::PropertyStorage;
use grafeo_common::types::{PropertyKey, Value};
use grafeo_common::NodeId;
let storage: PropertyStorage<NodeId> = PropertyStorage::new();
let key = PropertyKey::new("age");
let ids = vec![NodeId(1), NodeId(2), NodeId(3)];
let values = storage.get_batch(&ids, &key);
// values[i] is the property value for ids[i], or None if not setSourcepub fn get_all_batch(&self, ids: &[Id]) -> Vec<FxHashMap<PropertyKey, Value>> ⓘ
pub fn get_all_batch(&self, ids: &[Id]) -> Vec<FxHashMap<PropertyKey, Value>> ⓘ
Gets all properties for multiple entities efficiently.
More efficient than calling Self::get_all in a loop because it
acquires the read lock only once.
§Example
use grafeo_core::graph::lpg::PropertyStorage;
use grafeo_common::types::{PropertyKey, Value};
use grafeo_common::NodeId;
let storage: PropertyStorage<NodeId> = PropertyStorage::new();
let ids = vec![NodeId(1), NodeId(2)];
let all_props = storage.get_all_batch(&ids);
// all_props[i] is a HashMap of all properties for ids[i]Sourcepub fn get_selective_batch(
&self,
ids: &[Id],
keys: &[PropertyKey],
) -> Vec<FxHashMap<PropertyKey, Value>> ⓘ
pub fn get_selective_batch( &self, ids: &[Id], keys: &[PropertyKey], ) -> Vec<FxHashMap<PropertyKey, Value>> ⓘ
Gets selected properties for multiple entities efficiently (projection pushdown).
This is more efficient than Self::get_all_batch when you only need a subset
of properties - it only iterates the requested columns instead of all columns.
Performance: O(N × K) where N = ids.len() and K = keys.len(),
compared to O(N × C) for get_all_batch where C = total column count.
§Example
use grafeo_core::graph::lpg::PropertyStorage;
use grafeo_common::types::{PropertyKey, Value};
use grafeo_common::NodeId;
let storage: PropertyStorage<NodeId> = PropertyStorage::new();
let ids = vec![NodeId::new(1), NodeId::new(2)];
let keys = vec![PropertyKey::new("name"), PropertyKey::new("age")];
// Only fetches "name" and "age" columns, ignoring other properties
let props = storage.get_selective_batch(&ids, &keys);Sourcepub fn column_count(&self) -> usize
pub fn column_count(&self) -> usize
Returns the number of property columns.
Sourcepub fn keys(&self) -> Vec<PropertyKey>
pub fn keys(&self) -> Vec<PropertyKey>
Returns the keys of all columns.
Sourcepub fn column(&self, key: &PropertyKey) -> Option<PropertyColumnRef<'_, Id>>
pub fn column(&self, key: &PropertyKey) -> Option<PropertyColumnRef<'_, Id>>
Gets a column by key for bulk access.
Sourcepub fn might_match(
&self,
key: &PropertyKey,
op: CompareOp,
value: &Value,
) -> bool
pub fn might_match( &self, key: &PropertyKey, op: CompareOp, value: &Value, ) -> bool
Checks if a predicate might match any values (using zone maps).
Returns false only when we’re certain no values match - for example,
if you’re looking for age > 100 but the max age is 80. Returns true
if the property doesn’t exist (conservative - might match).
Sourcepub fn zone_map(&self, key: &PropertyKey) -> Option<ZoneMapEntry>
pub fn zone_map(&self, key: &PropertyKey) -> Option<ZoneMapEntry>
Gets the zone map for a property column.
Sourcepub fn might_match_range(
&self,
key: &PropertyKey,
min: Option<&Value>,
max: Option<&Value>,
min_inclusive: bool,
max_inclusive: bool,
) -> bool
pub fn might_match_range( &self, key: &PropertyKey, min: Option<&Value>, max: Option<&Value>, min_inclusive: bool, max_inclusive: bool, ) -> bool
Checks if a range predicate might match any values (using zone maps).
Returns false only when we’re certain no values match the range.
Returns true if the property doesn’t exist (conservative - might match).
Sourcepub fn rebuild_zone_maps(&self)
pub fn rebuild_zone_maps(&self)
Rebuilds zone maps for all columns (call after bulk removes).
Trait Implementations§
Auto Trait Implementations§
impl<Id = NodeId> !Freeze for PropertyStorage<Id>
impl<Id = NodeId> !RefUnwindSafe for PropertyStorage<Id>
impl<Id> Send for PropertyStorage<Id>where
Id: Send,
impl<Id> Sync for PropertyStorage<Id>
impl<Id> Unpin for PropertyStorage<Id>where
Id: Unpin,
impl<Id> UnwindSafe for PropertyStorage<Id>where
Id: UnwindSafe,
Blanket Implementations§
Source§impl<T> BorrowMut<T> for Twhere
T: ?Sized,
impl<T> BorrowMut<T> for Twhere
T: ?Sized,
Source§fn borrow_mut(&mut self) -> &mut T
fn borrow_mut(&mut self) -> &mut T
Source§impl<T> IntoEither for T
impl<T> IntoEither for T
Source§fn into_either(self, into_left: bool) -> Either<Self, Self>
fn into_either(self, into_left: bool) -> Either<Self, Self>
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 moreSource§fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>
fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>
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