linkrs-storage 0.1.0

Storage engine with CSR and memory-mapped containers
Documentation
use crate::index::traits::IndexGcOps;
use crate::index::types::{EdgeIdentity, GcStats};
use linkrs_core::metadata::IndexMetadataManager;
use linkrs_core::types::{LabelId, Timestamp};
use linkrs_core::{StorageResult, Value};
use std::sync::Arc;

use super::GraphStorageContext;

impl GraphStorageContext {
    pub(crate) fn invalidate_vertex_cache(&self, label: LabelId) {
        self.persistent
            .cache_manager
            .invalidate_vertices_by_label(label);
    }

    pub(crate) fn update_vertex_indexes_mvcc(
        &self,
        space_id: u64,
        vertex_id: &Value,
        index_name: &str,
        props: &[(Arc<str>, Value)],
        ts: Timestamp,
    ) -> StorageResult<()> {
        super::super::index_engine::update_vertex_indexes_mvcc(
            self, space_id, vertex_id, index_name, props, ts,
        )
    }

    pub(crate) fn delete_vertex_indexes_mvcc(
        &self,
        space_id: u64,
        vertex_id: &Value,
        index_names: &[String],
        ts: Timestamp,
    ) -> StorageResult<()> {
        super::super::index_engine::delete_vertex_indexes_mvcc(
            self,
            space_id,
            vertex_id,
            index_names,
            ts,
        )
    }

    pub(crate) fn update_edge_indexes_mvcc(
        &self,
        edge: &EdgeIdentity<'_>,
        index_name: &str,
        props: &[(Arc<str>, Value)],
        ts: Timestamp,
    ) -> StorageResult<()> {
        super::super::index_engine::update_edge_indexes_mvcc(self, edge, index_name, props, ts)
    }

    pub(crate) fn delete_edge_indexes_mvcc(
        &self,
        edge: &EdgeIdentity<'_>,
        index_names: &[String],
        ts: Timestamp,
    ) -> StorageResult<()> {
        super::super::index_engine::delete_edge_indexes_mvcc(self, edge, index_names, ts)
    }

    pub(crate) fn update_all_edge_indexes_mvcc(
        &self,
        edge: &EdgeIdentity<'_>,
        props: &[(Arc<str>, Value)],
        ts: Timestamp,
    ) -> StorageResult<()> {
        for index in self
            .index_metadata_manager()
            .list_edge_indexes(edge.space_id)?
            .into_iter()
            .filter(|index| index.schema_name == edge.edge_type)
        {
            self.update_edge_indexes_mvcc(edge, &index.name, props, ts)?;
        }
        Ok(())
    }

    pub(crate) fn delete_all_edge_indexes_mvcc(
        &self,
        edge: &EdgeIdentity<'_>,
        ts: Timestamp,
    ) -> StorageResult<()> {
        let index_names: Vec<String> = self
            .index_metadata_manager()
            .list_edge_indexes(edge.space_id)?
            .into_iter()
            .filter(|index| index.schema_name == edge.edge_type)
            .map(|index| index.name)
            .collect();
        if !index_names.is_empty() {
            self.delete_edge_indexes_mvcc(edge, &index_names, ts)?;
        }
        Ok(())
    }

    pub(crate) fn gc_index_tombstones(&self, ts: Timestamp) -> StorageResult<GcStats> {
        self.persistent.index_data_manager.read().gc_tombstones(ts)
    }
}