use cognis_core::error::Result;
use super::Store;
pub struct LayeredStore {
fast: Box<dyn Store>,
slow: Box<dyn Store>,
}
impl LayeredStore {
pub fn new(fast: Box<dyn Store>, slow: Box<dyn Store>) -> Self {
Self { fast, slow }
}
pub fn invalidate(&self, key: &str) -> Result<bool> {
self.fast.delete(key)
}
pub fn warm_up(&self, keys: &[&str]) -> Result<()> {
for key in keys {
if let Some(value) = self.slow.get(key)? {
self.fast.set(key, &value)?;
}
}
Ok(())
}
}
impl Store for LayeredStore {
fn get(&self, key: &str) -> Result<Option<Vec<u8>>> {
if let Some(value) = self.fast.get(key)? {
return Ok(Some(value));
}
if let Some(value) = self.slow.get(key)? {
self.fast.set(key, &value)?;
return Ok(Some(value));
}
Ok(None)
}
fn set(&self, key: &str, value: &[u8]) -> Result<()> {
self.fast.set(key, value)?;
self.slow.set(key, value)?;
Ok(())
}
fn delete(&self, key: &str) -> Result<bool> {
let a = self.fast.delete(key)?;
let b = self.slow.delete(key)?;
Ok(a || b)
}
fn exists(&self, key: &str) -> bool {
self.fast.exists(key) || self.slow.exists(key)
}
fn keys(&self) -> Result<Vec<String>> {
let mut all = self.fast.keys()?;
let slow_keys = self.slow.keys()?;
for k in slow_keys {
if !all.contains(&k) {
all.push(k);
}
}
Ok(all)
}
fn clear(&self) -> Result<()> {
self.fast.clear()?;
self.slow.clear()?;
Ok(())
}
}