linkrs-storage 0.1.0

Storage engine with CSR and memory-mapped containers
Documentation
use crate::engine::graph_storage::GraphStorageContext;
use crate::index::{EdgeIndexOps, VertexIndexOps};
use linkrs_core::metadata::IndexMetadataManager;
use linkrs_core::types::{Index, Timestamp};
use linkrs_core::StorageResult;
use linkrs_transaction::wal::{
    CreateEdgeIndexRedo, CreateTagIndexRedo, DropEdgeIndexRedo, DropTagIndexRedo,
};

pub(crate) fn replay_create_tag_index(
    ctx: &GraphStorageContext,
    redo: &CreateTagIndexRedo,
    _ts: Timestamp,
) -> StorageResult<()> {
    let index = Index::new(linkrs_core::types::IndexConfig {
        id: 0,
        name: redo.index_name.clone(),
        space_id: redo.space_id,
        schema_name: String::new(),
        fields: redo
            .fields
            .iter()
            .map(|(name, _typ)| {
                linkrs_core::types::IndexField::new(
                    name.clone(),
                    linkrs_core::Value::string(""),
                    true,
                )
            })
            .collect(),
        properties: redo.properties.clone(),
        index_type: linkrs_core::types::IndexType::TagIndex,
        is_unique: redo.is_unique,
        covering: false,
        partial_condition: None,
    });
    match ctx
        .index_metadata_manager()
        .create_tag_index(redo.space_id, &index)
    {
        Ok(_) => {}
        Err(e) => log::warn!("create_tag_index replay: {}", e),
    }
    let stored = ctx
        .index_metadata_manager()
        .get_tag_index(redo.space_id, &redo.index_name)?
        .unwrap_or(index);
    let data_mgr = ctx.index_data_manager().write();
    let _ = data_mgr.register_native_index(redo.space_id, &stored);
    Ok(())
}

pub(crate) fn replay_drop_tag_index(
    ctx: &GraphStorageContext,
    redo: &DropTagIndexRedo,
    _ts: Timestamp,
) -> StorageResult<()> {
    let _ = ctx
        .index_metadata_manager()
        .drop_tag_index(redo.space_id, &redo.index_name);
    let data_mgr = ctx.index_data_manager().write();
    let _ = data_mgr.clear_tag_index(redo.space_id, &redo.index_name);
    data_mgr.unregister_native_index(redo.space_id, &redo.index_name);
    Ok(())
}

pub(crate) fn replay_create_edge_index(
    ctx: &GraphStorageContext,
    redo: &CreateEdgeIndexRedo,
    _ts: Timestamp,
) -> StorageResult<()> {
    let index = Index::new(linkrs_core::types::IndexConfig {
        id: 0,
        name: redo.index_name.clone(),
        space_id: redo.space_id,
        schema_name: String::new(),
        fields: redo
            .fields
            .iter()
            .map(|(name, _typ)| {
                linkrs_core::types::IndexField::new(
                    name.clone(),
                    linkrs_core::Value::string(""),
                    true,
                )
            })
            .collect(),
        properties: redo.properties.clone(),
        index_type: linkrs_core::types::IndexType::EdgeIndex,
        is_unique: redo.is_unique,
        covering: false,
        partial_condition: None,
    });
    match ctx
        .index_metadata_manager()
        .create_edge_index(redo.space_id, &index)
    {
        Ok(_) => {}
        Err(e) => log::warn!("create_edge_index replay: {}", e),
    }
    let stored = ctx
        .index_metadata_manager()
        .get_edge_index(redo.space_id, &redo.index_name)?
        .unwrap_or(index);
    let data_mgr = ctx.index_data_manager().write();
    let _ = data_mgr.register_native_index(redo.space_id, &stored);
    Ok(())
}

pub(crate) fn replay_drop_edge_index(
    ctx: &GraphStorageContext,
    redo: &DropEdgeIndexRedo,
    _ts: Timestamp,
) -> StorageResult<()> {
    let _ = ctx
        .index_metadata_manager()
        .drop_edge_index(redo.space_id, &redo.index_name);
    let data_mgr = ctx.index_data_manager().write();
    let _ = data_mgr.clear_edge_index(redo.space_id, &redo.index_name);
    data_mgr.unregister_native_index(redo.space_id, &redo.index_name);
    Ok(())
}