use super::query_cache_types::{QueryKey, QueryType};
use std::collections::HashMap;
#[derive(Debug, Clone, Default)]
pub struct AdvancedCacheStats {
pub hits: u64,
pub misses: u64,
pub evictions: u64,
pub expirations: u64,
pub invalidations: u64,
pub current_size: usize,
pub hot_queries: usize,
pub refreshes: u64,
pub hit_rate_by_type: HashMap<QueryType, f64>,
}
impl AdvancedCacheStats {
pub fn hit_rate(&self) -> f64 {
let total = self.hits + self.misses;
if total == 0 {
0.0
} else {
self.hits as f64 / total as f64
}
}
pub fn merge(&mut self, other: &AdvancedCacheStats) {
self.hits += other.hits;
self.misses += other.misses;
self.evictions += other.evictions;
self.expirations += other.expirations;
self.invalidations += other.invalidations;
self.refreshes += other.refreshes;
}
}
#[derive(Debug, Clone)]
pub enum InvalidationMessage {
TableChanged(super::query_cache_types::TableDependency),
InvalidateKey(QueryKey),
InvalidateAll,
Shutdown,
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_cache_stats() {
let mut stats = AdvancedCacheStats::default();
stats.hits = 10;
stats.misses = 5;
assert!((stats.hit_rate() - 0.666).abs() < 0.01);
}
#[test]
fn test_cache_stats_merge() {
let mut stats1 = AdvancedCacheStats {
hits: 10,
misses: 5,
..Default::default()
};
let stats2 = AdvancedCacheStats {
hits: 5,
misses: 3,
..Default::default()
};
stats1.merge(&stats2);
assert_eq!(stats1.hits, 15);
assert_eq!(stats1.misses, 8);
}
}