Skip to main content

PropertyStorage

Struct PropertyStorage 

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

Source

pub fn new() -> Self

Creates a new property storage.

Source

pub fn with_compression(mode: CompressionMode) -> Self

Creates a new property storage with compression enabled.

Source

pub fn set_default_compression(&mut self, mode: CompressionMode)

Sets the default compression mode for new columns.

Source

pub fn set(&self, id: Id, key: PropertyKey, value: Value)

Sets a property value for an entity.

Source

pub fn enable_compression(&self, key: &PropertyKey, mode: CompressionMode)

Enables compression for a specific column.

Source

pub fn compress_all(&self)

Compresses all columns that have compression enabled.

Source

pub fn force_compress_all(&self)

Forces compression on all columns regardless of mode.

Source

pub fn compression_stats(&self) -> FxHashMap<PropertyKey, CompressionStats>

Returns compression statistics for all columns.

Source

pub fn memory_usage(&self) -> usize

Returns the total memory usage of all columns.

Source

pub fn get(&self, id: Id, key: &PropertyKey) -> Option<Value>

Gets a property value for an entity.

Source

pub fn remove(&self, id: Id, key: &PropertyKey) -> Option<Value>

Removes a property value for an entity.

Source

pub fn remove_all(&self, id: Id)

Removes all properties for an entity.

Source

pub fn get_all(&self, id: Id) -> FxHashMap<PropertyKey, Value>

Gets all properties for an entity.

Source

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 set
Source

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]
Source

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);
Source

pub fn column_count(&self) -> usize

Returns the number of property columns.

Source

pub fn keys(&self) -> Vec<PropertyKey>

Returns the keys of all columns.

Source

pub fn column(&self, key: &PropertyKey) -> Option<PropertyColumnRef<'_, Id>>

Gets a column by key for bulk access.

Source

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).

Source

pub fn zone_map(&self, key: &PropertyKey) -> Option<ZoneMapEntry>

Gets the zone map for a property column.

Source

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).

Source

pub fn rebuild_zone_maps(&self)

Rebuilds zone maps for all columns (call after bulk removes).

Trait Implementations§

Source§

impl<Id: EntityId> Default for PropertyStorage<Id>

Source§

fn default() -> Self

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

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>
where Id: Sync + Send,

§

impl<Id> Unpin for PropertyStorage<Id>
where Id: Unpin,

§

impl<Id> UnwindSafe for PropertyStorage<Id>
where Id: UnwindSafe,

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