use super::TemporalVectorIndex;
use crate::core::error::Result;
use crate::core::observer::{StorageEvent, StorageObserver};
use std::sync::Arc;
#[cfg(feature = "observability")]
use tracing;
pub struct VectorIndexObserver {
index: Arc<TemporalVectorIndex>,
}
impl VectorIndexObserver {
pub fn new(index: Arc<TemporalVectorIndex>) -> Self {
Self { index }
}
}
impl StorageObserver for VectorIndexObserver {
fn on_event(&self, event: &StorageEvent) -> Result<()> {
match event {
StorageEvent::NodeAnchorCreated {
timestamp,
version_id,
..
} => {
#[cfg(feature = "observability")]
tracing::debug!(
"VectorIndexObserver: NodeAnchorCreated at {}, triggering snapshot",
timestamp
);
let snapshot_id = self.index.create_snapshot_for_anchor(*timestamp)?;
#[cfg(feature = "observability")]
if let Some(id) = snapshot_id {
tracing::info!(
"Created vector snapshot {} aligned with anchor version {}",
id,
version_id
);
}
#[cfg(not(feature = "observability"))]
{
let _ = version_id;
let _ = snapshot_id;
}
Ok(())
}
StorageEvent::EdgeAnchorCreated { timestamp, .. } => {
self.index.create_snapshot_for_anchor(*timestamp)?;
Ok(())
}
_ => Ok(()),
}
}
fn interested_in(&self, event: &StorageEvent) -> bool {
event.is_anchor_event()
}
}