use crate::extraction::{deduplicate_patterns, rank_patterns};
use crate::pattern::Pattern;
use crate::types::TaskContext;
use tracing::{debug, info, instrument};
use uuid::Uuid;
use super::super::SelfLearningMemory;
impl SelfLearningMemory {
#[instrument(skip(self))]
pub async fn retrieve_relevant_patterns(
&self,
context: &TaskContext,
limit: usize,
) -> Vec<Pattern> {
let mut patterns = self.patterns_fallback.write().await;
debug!(
total_patterns = patterns.len(),
limit = limit,
"Retrieving relevant patterns"
);
let all_patterns: Vec<Pattern> = patterns.values().cloned().collect();
let mut ranked = rank_patterns(all_patterns, context);
ranked = deduplicate_patterns(ranked);
for pattern in &mut ranked.iter_mut().take(limit) {
pattern.record_retrieval();
patterns.insert(pattern.id(), pattern.clone());
}
ranked.truncate(limit);
info!(
retrieved_count = ranked.len(),
"Retrieved relevant patterns with effectiveness tracking"
);
ranked
}
#[instrument(skip(self))]
pub async fn get_pattern(&self, pattern_id: Uuid) -> crate::Result<Option<Pattern>> {
if let Some(storage) = &self.turso_storage {
match storage.get_pattern(pattern_id).await {
Ok(pattern) => return Ok(pattern),
Err(e) => {
debug!("Failed to get pattern from Turso storage: {}", e);
}
}
}
if let Some(cache) = &self.cache_storage {
match cache.get_pattern(pattern_id).await {
Ok(pattern) => return Ok(pattern),
Err(e) => {
debug!("Failed to get pattern from cache storage: {}", e);
}
}
}
let patterns = self.patterns_fallback.read().await;
Ok(patterns.get(&pattern_id).cloned())
}
}