use crate::TypedStoreError;
use serde::{de::DeserializeOwned, Serialize};
use std::ops::RangeBounds;
use std::{borrow::Borrow, collections::BTreeMap, error::Error};
pub trait Map<'a, K, V>
where
K: Serialize + DeserializeOwned,
V: Serialize + DeserializeOwned,
{
type Error: Error;
type SafeIterator: Iterator<Item = Result<(K, V), TypedStoreError>>;
fn contains_key(&self, key: &K) -> Result<bool, Self::Error>;
fn multi_contains_keys<J>(
&self,
keys: impl IntoIterator<Item = J>,
) -> Result<Vec<bool>, Self::Error>
where
J: Borrow<K>,
{
keys.into_iter()
.map(|key| self.contains_key(key.borrow()))
.collect()
}
fn get(&self, key: &K) -> Result<Option<V>, Self::Error>;
fn insert(&self, key: &K, value: &V) -> Result<(), Self::Error>;
fn remove(&self, key: &K) -> Result<(), Self::Error>;
fn unsafe_clear(&self) -> Result<(), Self::Error>;
fn schedule_delete_all(&self) -> Result<(), TypedStoreError>;
fn is_empty(&self) -> bool;
fn safe_iter(&'a self) -> Self::SafeIterator;
fn safe_iter_with_bounds(
&'a self,
lower_bound: Option<K>,
upper_bound: Option<K>,
) -> Self::SafeIterator;
fn safe_range_iter(&'a self, range: impl RangeBounds<K>) -> Self::SafeIterator;
fn multi_get<J>(&self, keys: impl IntoIterator<Item = J>) -> Result<Vec<Option<V>>, Self::Error>
where
J: Borrow<K>,
{
keys.into_iter().map(|key| self.get(key.borrow())).collect()
}
fn multi_insert<J, U>(
&self,
key_val_pairs: impl IntoIterator<Item = (J, U)>,
) -> Result<(), Self::Error>
where
J: Borrow<K>,
U: Borrow<V>,
{
key_val_pairs
.into_iter()
.try_for_each(|(key, value)| self.insert(key.borrow(), value.borrow()))
}
fn multi_remove<J>(&self, keys: impl IntoIterator<Item = J>) -> Result<(), Self::Error>
where
J: Borrow<K>,
{
keys.into_iter()
.try_for_each(|key| self.remove(key.borrow()))
}
fn try_catch_up_with_primary(&self) -> Result<(), Self::Error>;
}
pub struct TableSummary {
pub num_keys: u64,
pub key_bytes_total: usize,
pub value_bytes_total: usize,
pub key_hist: hdrhistogram::Histogram<u64>,
pub value_hist: hdrhistogram::Histogram<u64>,
}
pub trait TypedStoreDebug {
fn dump_table(
&self,
table_name: String,
page_size: u16,
page_number: usize,
) -> eyre::Result<BTreeMap<String, String>>;
fn primary_db_name(&self) -> String;
fn describe_all_tables(&self) -> BTreeMap<String, (String, String)>;
fn count_table_keys(&self, table_name: String) -> eyre::Result<usize>;
fn table_summary(&self, table_name: String) -> eyre::Result<TableSummary>;
}