use crate::Result;
use meshdb_core::{Edge, EdgeId, Node, NodeId, Property};
use std::path::Path;
#[derive(Debug, Clone, PartialEq, Eq, Hash)]
pub struct PropertyIndexSpec {
pub label: String,
pub property: String,
}
#[derive(Debug, Clone)]
pub enum GraphMutation {
PutNode(Node),
PutEdge(Edge),
DeleteEdge(EdgeId),
DetachDeleteNode(NodeId),
}
pub trait StorageEngine: Send + Sync {
fn put_node(&self, node: &Node) -> Result<()>;
fn get_node(&self, id: NodeId) -> Result<Option<Node>>;
fn detach_delete_node(&self, id: NodeId) -> Result<()>;
fn put_edge(&self, edge: &Edge) -> Result<()>;
fn get_edge(&self, id: EdgeId) -> Result<Option<Edge>>;
fn delete_edge(&self, id: EdgeId) -> Result<()>;
fn apply_batch(&self, mutations: &[GraphMutation]) -> Result<()>;
fn all_nodes(&self) -> Result<Vec<Node>>;
fn all_edges(&self) -> Result<Vec<Edge>>;
fn all_node_ids(&self) -> Result<Vec<NodeId>>;
fn outgoing(&self, source: NodeId) -> Result<Vec<(EdgeId, NodeId)>>;
fn incoming(&self, target: NodeId) -> Result<Vec<(EdgeId, NodeId)>>;
fn nodes_by_label(&self, label: &str) -> Result<Vec<NodeId>>;
fn edges_by_type(&self, edge_type: &str) -> Result<Vec<EdgeId>>;
fn nodes_by_property(
&self,
label: &str,
property: &str,
value: &Property,
) -> Result<Vec<NodeId>>;
fn create_property_index(&self, label: &str, property: &str) -> Result<()>;
fn drop_property_index(&self, label: &str, property: &str) -> Result<()>;
fn list_property_indexes(&self) -> Vec<PropertyIndexSpec>;
fn create_checkpoint(&self, path: &Path) -> Result<()>;
fn clear_all(&self) -> Result<()>;
}