use std::collections::HashMap;
use serde_json::Value;
use crate::graph::{Edge, Node, ProjectMeta};
use crate::task_graph_knowledge::KnowledgeNode;
use super::error::StorageError;
#[derive(Debug, Clone, Default)]
pub struct NodeFilter {
pub node_type: Option<String>,
pub status: Option<String>,
pub file_path: Option<String>,
pub tag: Option<String>,
pub owner: Option<String>,
pub limit: Option<usize>,
pub offset: Option<usize>,
}
impl NodeFilter {
pub fn new() -> Self {
Self::default()
}
pub fn with_node_type(mut self, node_type: impl Into<String>) -> Self {
self.node_type = Some(node_type.into());
self
}
pub fn with_status(mut self, status: impl Into<String>) -> Self {
self.status = Some(status.into());
self
}
pub fn with_file_path(mut self, file_path: impl Into<String>) -> Self {
self.file_path = Some(file_path.into());
self
}
pub fn with_tag(mut self, tag: impl Into<String>) -> Self {
self.tag = Some(tag.into());
self
}
pub fn with_owner(mut self, owner: impl Into<String>) -> Self {
self.owner = Some(owner.into());
self
}
pub fn with_limit(mut self, limit: usize) -> Self {
self.limit = Some(limit);
self
}
pub fn with_offset(mut self, offset: usize) -> Self {
self.offset = Some(offset);
self
}
}
pub trait GraphStorage {
fn put_node(&self, node: &Node) -> Result<(), StorageError>;
fn get_node(&self, id: &str) -> Result<Option<Node>, StorageError>;
fn delete_node(&self, id: &str) -> Result<(), StorageError>;
fn get_edges(&self, node_id: &str) -> Result<Vec<Edge>, StorageError>;
fn add_edge(&self, edge: &Edge) -> Result<(), StorageError>;
fn remove_edge(&self, from: &str, to: &str, relation: &str) -> Result<(), StorageError>;
fn query_nodes(&self, filter: &NodeFilter) -> Result<Vec<Node>, StorageError>;
fn search(&self, query: &str) -> Result<Vec<Node>, StorageError>;
fn get_tags(&self, node_id: &str) -> Result<Vec<String>, StorageError>;
fn set_tags(&self, node_id: &str, tags: &[String]) -> Result<(), StorageError>;
fn get_metadata(&self, node_id: &str) -> Result<HashMap<String, Value>, StorageError>;
fn set_metadata(
&self,
node_id: &str,
metadata: &HashMap<String, Value>,
) -> Result<(), StorageError>;
fn get_project_meta(&self) -> Result<Option<ProjectMeta>, StorageError>;
fn set_project_meta(&self, meta: &ProjectMeta) -> Result<(), StorageError>;
fn get_knowledge(&self, node_id: &str) -> Result<Option<KnowledgeNode>, StorageError>;
fn set_knowledge(&self, node_id: &str, knowledge: &KnowledgeNode)
-> Result<(), StorageError>;
fn get_node_count(&self) -> Result<usize, StorageError>;
fn get_edge_count(&self) -> Result<usize, StorageError>;
fn get_all_node_ids(&self) -> Result<Vec<String>, StorageError>;
fn execute_batch(&self, ops: &[BatchOp]) -> Result<(), StorageError>;
}
#[derive(Debug, Clone)]
pub enum BatchOp {
PutNode(Node),
DeleteNode(String),
AddEdge(Edge),
RemoveEdge {
from: String,
to: String,
relation: String,
},
SetTags(String, Vec<String>),
SetMetadata(String, HashMap<String, Value>),
SetKnowledge(String, KnowledgeNode),
}