use super::App;
use std::time::Duration;
impl App {
pub fn load_related_for_selected(&mut self) {
self.ui.related_selected = 0;
self.ui.related_rx = None;
let (entity_type, entity_id) = match self.get_selected_entity_info() {
Some(info) => info,
None => {
self.ui.related_items.clear();
self.ui.related_pending_load = None;
return;
}
};
let cache_key = (entity_type.clone(), entity_id.clone());
if let Some(cached) = self.ui.related_cache.get(&cache_key) {
self.ui.related_items = cached.clone();
self.ui.related_pending_load = None;
return;
}
self.ui.related_items.clear();
self.ui.related_pending_load = Some((entity_type, entity_id, std::time::Instant::now()));
}
pub(super) fn check_pending_related_load(&mut self) {
let received = if let Some((ref et, ref eid, ref rx)) = self.ui.related_rx {
match rx.try_recv() {
Ok(results) => Some((et.clone(), eid.clone(), results)),
Err(std::sync::mpsc::TryRecvError::Disconnected) => {
Some((et.clone(), eid.clone(), Vec::new()))
}
Err(std::sync::mpsc::TryRecvError::Empty) => None, }
} else {
None
};
if let Some((et, eid, results)) = received {
self.ui.related_rx = None;
if self.get_selected_entity_info() == Some((et.clone(), eid.clone())) {
let items: Vec<_> = results.into_iter().filter(|r| r.similarity > 0.5).collect();
self.ui.related_cache.insert((et, eid), items.clone());
self.ui.related_items = items;
}
return;
}
let (entity_type, entity_id) = match &self.ui.related_pending_load {
Some((et, eid, requested_at))
if requested_at.elapsed() >= Duration::from_millis(300) =>
{
(et.clone(), eid.clone())
}
_ => return,
};
self.ui.related_pending_load = None;
if self.get_selected_entity_info() != Some((entity_type.clone(), entity_id.clone())) {
return;
}
if let Some(ref db_path) = self.db_path {
let db_path = db_path.clone();
let et = entity_type.clone();
let eid = entity_id.clone();
let (tx, rx) = std::sync::mpsc::channel();
std::thread::spawn(move || {
use crate::db::{search::find_similar, Database};
if let Ok(db) = Database::open(&db_path) {
if let Ok(results) = find_similar(db.conn(), &et, &eid, None, 5) {
let _ = tx.send(results);
}
}
});
self.ui.related_rx = Some((entity_type, entity_id, rx));
}
}
}