Insert a new RowDescription into the cache
(&self, key: RowDescriptionKey, fields: Vec<FieldDescription>)
| 100 | |
| 101 | /// Insert a new RowDescription into the cache |
| 102 | pub fn insert(&self, key: RowDescriptionKey, fields: Vec<FieldDescription>) { |
| 103 | let mut cache = self.cache.write().unwrap(); |
| 104 | let mut stats = self.stats.write().unwrap(); |
| 105 | |
| 106 | // Check capacity and evict if necessary |
| 107 | if cache.len() >= self.capacity && !cache.contains_key(&key) { |
| 108 | // Find and remove the least recently used entry |
| 109 | if let Some((lru_key, _)) = cache.iter() |
| 110 | .min_by_key(|(_, entry)| (entry.hit_count, entry.created_at)) { |
| 111 | let lru_key = lru_key.clone(); |
| 112 | cache.remove(&lru_key); |
| 113 | stats.evictions += 1; |
| 114 | debug!("Evicted LRU RowDescription cache entry"); |
| 115 | } |
| 116 | } |
| 117 | |
| 118 | let entry = CachedRowDescription { |
| 119 | fields, |
| 120 | created_at: Instant::now(), |
| 121 | hit_count: 0, |
| 122 | }; |
| 123 | |
| 124 | cache.insert(key.clone(), entry); |
| 125 | stats.entries = cache.len(); |
| 126 | debug!("Cached RowDescription for query: {}", &key.query[..50.min(key.query.len())]); |
| 127 | } |
| 128 | |
| 129 | /// Clear all cache entries |
| 130 | pub fn clear(&self) { |