use std::collections::HashMap;
use async_trait::async_trait;
use hirn_core::HirnResult;
use hirn_core::id::MemoryId;
use hirn_core::metadata::Metadata;
use hirn_core::timestamp::Timestamp;
use hirn_core::types::{EdgeRelation, Layer, Namespace};
use crate::graph::{CausalEdgeData, EdgeId, GraphEdge, GraphNodeData};
#[async_trait]
pub trait GraphStore: Send + Sync {
async fn add_node(
&self,
id: MemoryId,
layer: Layer,
importance: f32,
created_at: Timestamp,
namespace: Namespace,
) -> HirnResult<bool>;
async fn remove_node(&self, id: MemoryId) -> HirnResult<bool>;
async fn has_node(&self, id: MemoryId) -> HirnResult<bool>;
async fn get_node(&self, id: MemoryId) -> HirnResult<Option<GraphNodeData>>;
async fn node_ids(&self) -> HirnResult<Vec<MemoryId>>;
async fn node_importance(&self, id: MemoryId) -> HirnResult<Option<f32>>;
async fn set_node_importance(&self, id: MemoryId, importance: f32) -> HirnResult<()>;
async fn node_layer(&self, id: MemoryId) -> HirnResult<Option<Layer>>;
async fn node_namespace(&self, id: MemoryId) -> HirnResult<Option<Namespace>>;
async fn namespaces_compatible(&self, a: MemoryId, b: MemoryId) -> HirnResult<bool>;
async fn add_edge(
&self,
source: MemoryId,
target: MemoryId,
relation: EdgeRelation,
weight: f32,
metadata: Metadata,
) -> HirnResult<EdgeId>;
async fn add_causal_edge(
&self,
source: MemoryId,
target: MemoryId,
relation: EdgeRelation,
weight: f32,
metadata: Metadata,
causal: CausalEdgeData,
) -> HirnResult<EdgeId>;
async fn remove_edge(&self, edge_id: EdgeId) -> HirnResult<()>;
async fn get_edge(&self, edge_id: EdgeId) -> HirnResult<Option<GraphEdge>>;
async fn get_edges(&self, node_id: MemoryId) -> HirnResult<Vec<GraphEdge>>;
async fn get_edges_between(&self, a: MemoryId, b: MemoryId) -> HirnResult<Vec<GraphEdge>>;
async fn get_edges_of_type(
&self,
node_id: MemoryId,
relation: EdgeRelation,
) -> HirnResult<Vec<GraphEdge>>;
async fn get_edges_of_type_many(
&self,
node_ids: &[MemoryId],
relation: EdgeRelation,
) -> HirnResult<HashMap<MemoryId, Vec<GraphEdge>>> {
let mut result = HashMap::with_capacity(node_ids.len());
for &node_id in node_ids {
let edges = self.get_edges_of_type(node_id, relation).await?;
if !edges.is_empty() {
result.insert(node_id, edges);
}
}
Ok(result)
}
async fn all_edges(&self) -> HirnResult<Vec<GraphEdge>>;
async fn update_edge_weight(
&self,
edge_id: EdgeId,
new_weight: f32,
co_retrieval_count: Option<u64>,
) -> HirnResult<()>;
async fn get_neighbors(
&self,
start: MemoryId,
depth: usize,
min_weight: f32,
) -> HirnResult<Vec<MemoryId>>;
async fn get_neighbors_filtered(
&self,
start: MemoryId,
depth: usize,
min_weight: f32,
namespace: Option<&Namespace>,
) -> HirnResult<Vec<MemoryId>>;
async fn outgoing_weighted(
&self,
node_id: MemoryId,
) -> HirnResult<Vec<(MemoryId, f32, EdgeRelation)>>;
async fn shortest_path(
&self,
source: MemoryId,
target: MemoryId,
) -> HirnResult<Option<Vec<MemoryId>>>;
async fn node_count(&self) -> HirnResult<usize>;
async fn edge_count(&self) -> HirnResult<usize>;
}