iridium-db 0.4.0

A high-performance vector-graph hybrid storage and indexing engine
use super::*;

pub(super) fn node_row_summary_from_logical(logical: &LogicalNode) -> NodeRowSummary {
    NodeRowSummary {
        has_full: logical.full.is_some(),
        delta_count: logical.deltas.len(),
        adjacency_degree: logical.adjacency().len(),
    }
}

pub(super) fn cache_get_logical_node(
    handle: &mut StorageHandle,
    node_id: u64,
) -> Option<LogicalNode> {
    handle.logical_node_cache.get(&node_id).cloned()
}

pub(super) fn cache_put_logical_node(
    handle: &mut StorageHandle,
    node_id: u64,
    logical: LogicalNode,
) {
    if handle.logical_node_cache_capacity == 0 {
        return;
    }
    if !handle.logical_node_cache.contains_key(&node_id) {
        if handle.logical_node_cache.len() >= handle.logical_node_cache_capacity {
            if let Some(evict_key) = handle.logical_node_cache_order.pop_front() {
                handle.logical_node_cache.remove(&evict_key);
            }
        }
        handle.logical_node_cache_order.push_back(node_id);
    }
    handle.logical_node_cache.insert(node_id, logical);
}

pub(super) fn invalidate_logical_node_cache(handle: &mut StorageHandle, node_id: u64) {
    if handle.logical_node_cache.remove(&node_id).is_some() {
        handle
            .logical_node_cache_order
            .retain(|key| *key != node_id);
    }
}

pub(super) fn clear_logical_node_cache(handle: &mut StorageHandle) {
    handle.logical_node_cache.clear();
    handle.logical_node_cache_order.clear();
}