use std::collections::HashMap;
use cognee_models::{Document, DocumentChunk, EdgeType, Embedding};
use uuid::Uuid;
use crate::graph_integration::{GraphEdgePair, GraphNodePair};
use crate::summarization::TextSummary;
#[derive(Debug, Clone)]
pub struct CognifyResult {
pub chunks: Vec<DocumentChunk>,
pub entities: Vec<GraphNodePair>,
pub edges: Vec<GraphEdgePair>,
pub summaries: Vec<TextSummary>,
pub edge_types: Vec<EdgeType>,
pub embeddings: Vec<Embedding>,
pub indexed_fields: IndexedFieldsStats,
pub documents_for_dlt: Vec<Document>,
pub already_completed: bool,
pub prior_pipeline_run_id: Option<Uuid>,
}
impl CognifyResult {
pub fn empty() -> Self {
Self {
chunks: vec![],
entities: vec![],
edges: vec![],
summaries: vec![],
edge_types: vec![],
embeddings: vec![],
indexed_fields: IndexedFieldsStats::default(),
documents_for_dlt: vec![],
already_completed: false,
prior_pipeline_run_id: None,
}
}
pub fn already_completed(pipeline_run_id: Uuid) -> Self {
Self {
already_completed: true,
prior_pipeline_run_id: Some(pipeline_run_id),
..Self::empty()
}
}
}
#[derive(Debug, Clone, Default)]
pub struct IndexedFieldsStats {
pub field_counts: HashMap<String, usize>,
pub triplet_count: usize,
}
impl IndexedFieldsStats {
pub fn record(&mut self, data_type: &str, field_name: &str, count: usize) {
let key = format!("{data_type}_{field_name}");
*self.field_counts.entry(key).or_insert(0) += count;
}
pub fn get(&self, data_type: &str, field_name: &str) -> usize {
let key = format!("{data_type}_{field_name}");
self.field_counts.get(&key).copied().unwrap_or(0)
}
pub fn chunk_text_count(&self) -> usize {
self.get("DocumentChunk", "text")
}
pub fn entity_name_count(&self) -> usize {
self.get("Entity", "name")
}
pub fn entity_type_name_count(&self) -> usize {
self.get("EntityType", "name")
}
pub fn summary_text_count(&self) -> usize {
self.get("TextSummary", "text")
}
pub fn edge_type_count(&self) -> usize {
self.get("EdgeType", "relationship_name")
}
}