use chrono::{DateTime, Utc};
use crate::graph_memory::{ConsolidationResult, DreamConsolidator, GraphMemory, GraphStats};
#[derive(Debug, Clone)]
pub struct DreamReport {
pub run_number: u64,
pub timestamp: DateTime<Utc>,
pub result: ConsolidationResult,
pub graph_stats: GraphStats,
}
pub struct DreamScheduler {
last_run: Option<DateTime<Utc>>,
run_count: u64,
consolidator: DreamConsolidator,
}
impl Default for DreamScheduler {
fn default() -> Self {
Self::new()
}
}
impl DreamScheduler {
pub fn new() -> Self {
Self {
last_run: None,
run_count: 0,
consolidator: DreamConsolidator::new(),
}
}
pub fn run_cycle(&mut self, graph: &mut GraphMemory) -> ConsolidationResult {
let result = self.consolidator.consolidate(graph);
self.last_run = Some(Utc::now());
self.run_count += 1;
result
}
pub fn run_cycle_with_report(&mut self, graph: &mut GraphMemory) -> DreamReport {
let result = self.run_cycle(graph);
let graph_stats = graph.stats();
DreamReport {
run_number: self.run_count,
timestamp: self.last_run.unwrap_or_else(Utc::now),
result,
graph_stats,
}
}
pub fn run_count(&self) -> u64 {
self.run_count
}
pub fn last_run(&self) -> Option<DateTime<Utc>> {
self.last_run
}
}
#[cfg(test)]
mod tests {
use super::*;
use crate::graph_memory::{EdgeRelation, MemoryEdge, MemoryNode, NodeType};
fn populated_graph() -> GraphMemory {
let mut graph = GraphMemory::new();
graph.add_node(MemoryNode {
id: "alpha".to_string(),
label: "Alpha".to_string(),
node_type: NodeType::Concept,
description: String::new(),
source_file: None,
source_location: None,
tags: Vec::new(),
created_at: Utc::now(),
});
graph.add_node(MemoryNode {
id: "beta".to_string(),
label: "Beta".to_string(),
node_type: NodeType::Concept,
description: String::new(),
source_file: None,
source_location: None,
tags: Vec::new(),
created_at: Utc::now(),
});
let _ = graph.add_edge(MemoryEdge {
source: "alpha".to_string(),
target: "beta".to_string(),
relation: EdgeRelation::RelatedTo,
confidence: 0.1,
source_file: None,
});
graph
}
#[test]
fn test_run_cycle_executes() {
let mut scheduler = DreamScheduler::new();
let mut graph = populated_graph();
let result = scheduler.run_cycle(&mut graph);
assert_eq!(result.pruned_count, 1);
assert!(scheduler.last_run().is_some());
}
#[test]
fn test_run_count_increments() {
let mut scheduler = DreamScheduler::new();
let mut graph = populated_graph();
assert_eq!(scheduler.run_count(), 0);
scheduler.run_cycle(&mut graph);
assert_eq!(scheduler.run_count(), 1);
scheduler.run_cycle(&mut graph);
assert_eq!(scheduler.run_count(), 2);
}
#[test]
fn test_dream_report() {
let mut scheduler = DreamScheduler::new();
let mut graph = populated_graph();
let report = scheduler.run_cycle_with_report(&mut graph);
assert_eq!(report.run_number, 1);
assert_eq!(report.result.pruned_count, 1);
assert_eq!(report.graph_stats.node_count, 2);
assert_eq!(report.graph_stats.edge_count, 0);
}
}