pub struct MultiIndex<'a, IK, T, PK> { /* private fields */ }
Expand description

MultiIndex stores (namespace, index_name, idx_value, pk) -> b“pk_len“. Allows many values per index, and references pk. The associated primary key value is stored in the main (pk_namespace) map, which stores (namespace, pk_namespace, pk) -> value.

The stored pk_len is used to recover the pk from the index namespace, and perform the secondary load of the associated value from the main map.

The PK type defines the type of Primary Key, both for deserialization, and more important, as the type-safe bound key type. This type must match the encompassing IndexedMap primary key type, or its owned variant.

Implementations§

source§

impl<'a, IK, T, PK> MultiIndex<'a, IK, T, PK>

source

pub const fn new( idx_fn: fn(_: &[u8], _: &T) -> IK, pk_namespace: &'a str, idx_namespace: &'static str ) -> Self

Create a new MultiIndex

idx_fn - lambda creating index key from value pk_namespace - prefix for the primary key idx_namespace - prefix for the index value

§Example:
use cw_storage_plus::MultiIndex;
use serde::{Deserialize, Serialize};

#[derive(Deserialize, Serialize, Clone)]
struct Data {
    pub name: String,
    pub age: u32,
}

let index: MultiIndex<_, _, String> = MultiIndex::new(
    |_pk: &[u8], d: &Data| d.age,
    "age",
    "age__owner",
);
source§

impl<'a, IK, T, PK> MultiIndex<'a, IK, T, PK>

source

pub fn index_key(&self, k: IK) -> Vec<u8>

source§

impl<'a, IK, T, PK> MultiIndex<'a, IK, T, PK>

source

pub fn range_raw<'c>( &'c self, store: &'c dyn Storage, min: Option<Bound<'a, (IK, PK)>>, max: Option<Bound<'a, (IK, PK)>>, order: Order ) -> Box<dyn Iterator<Item = StdResult<Record<T>>> + 'c>
where T: 'c,

source

pub fn keys_raw<'c>( &'c self, store: &'c dyn Storage, min: Option<Bound<'a, (IK, PK)>>, max: Option<Bound<'a, (IK, PK)>>, order: Order ) -> Box<dyn Iterator<Item = Vec<u8>> + 'c>

source

pub fn prefix_range_raw<'c>( &'c self, store: &'c dyn Storage, min: Option<PrefixBound<'a, IK>>, max: Option<PrefixBound<'a, IK>>, order: Order ) -> Box<dyn Iterator<Item = StdResult<Record<T>>> + 'c>
where T: 'c, 'a: 'c,

While range_raw over a prefix fixes the prefix to one element and iterates over the remaining, prefix_range_raw accepts bounds for the lowest and highest elements of the Prefix itself, and iterates over those (inclusively or exclusively, depending on PrefixBound). There are some issues that distinguish these two, and blindly casting to Vec<u8> doesn’t solve them.

source§

impl<'a, IK, T, PK> MultiIndex<'a, IK, T, PK>

source

pub fn prefix(&self, p: IK) -> IndexPrefix<PK, T, PK>

source

pub fn sub_prefix(&self, p: IK::Prefix) -> IndexPrefix<PK, T, (IK::Suffix, PK)>

source§

impl<'a, IK, T, PK> MultiIndex<'a, IK, T, PK>

source

pub fn prefix_range<'c>( &self, store: &'c dyn Storage, min: Option<PrefixBound<'a, IK>>, max: Option<PrefixBound<'a, IK>>, order: Order ) -> Box<dyn Iterator<Item = StdResult<(PK::Output, T)>> + 'c>
where T: 'c, IK: 'c, PK: 'c, PK::Output: 'static, 'a: 'c,

While range over a prefix fixes the prefix to one element and iterates over the remaining, prefix_range accepts bounds for the lowest and highest elements of the Prefix itself, and iterates over those (inclusively or exclusively, depending on PrefixBound). There are some issues that distinguish these two, and blindly casting to Vec<u8> doesn’t solve them.

source

pub fn range<'c>( &self, store: &'c dyn Storage, min: Option<Bound<'a, (IK, PK)>>, max: Option<Bound<'a, (IK, PK)>>, order: Order ) -> Box<dyn Iterator<Item = StdResult<(PK::Output, T)>> + 'c>
where T: 'c, PK::Output: 'static,

source

pub fn keys<'c>( &self, store: &'c dyn Storage, min: Option<Bound<'a, (IK, PK)>>, max: Option<Bound<'a, (IK, PK)>>, order: Order ) -> Box<dyn Iterator<Item = StdResult<PK::Output>> + 'c>
where T: 'c, PK::Output: 'static,

Trait Implementations§

source§

impl<'a, IK, T, PK> Index<T> for MultiIndex<'a, IK, T, PK>

source§

fn save(&self, store: &mut dyn Storage, pk: &[u8], data: &T) -> StdResult<()>

source§

fn remove( &self, store: &mut dyn Storage, pk: &[u8], old_data: &T ) -> StdResult<()>

Auto Trait Implementations§

§

impl<'a, IK, T, PK> Freeze for MultiIndex<'a, IK, T, PK>

§

impl<'a, IK, T, PK> RefUnwindSafe for MultiIndex<'a, IK, T, PK>
where PK: RefUnwindSafe,

§

impl<'a, IK, T, PK> Send for MultiIndex<'a, IK, T, PK>
where PK: Send,

§

impl<'a, IK, T, PK> Sync for MultiIndex<'a, IK, T, PK>
where PK: Sync,

§

impl<'a, IK, T, PK> Unpin for MultiIndex<'a, IK, T, PK>
where PK: Unpin,

§

impl<'a, IK, T, PK> UnwindSafe for MultiIndex<'a, IK, T, PK>
where PK: 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<U> As for U

source§

fn as_<T>(self) -> T
where T: CastFrom<U>,

Casts self to type T. The semantics of numeric casting with the as operator are followed, so <T as As>::as_::<U> can be used in the same way as T as U for numeric conversions. 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> Same for T

§

type Output = T

Should always be Self
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.