use async_trait::async_trait;
use object_store::path::Path;
use serde::{Deserialize, Serialize};
use std::sync::Arc;
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct PrefetchItem {
pub key: String,
pub size: u64,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub ranges: Option<Vec<[u64; 2]>>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct PrefetchResponse {
pub accepted: usize,
pub rejected: usize,
pub dropped: usize,
}
#[async_trait]
pub trait ObjectPrefetch: Send + Sync + std::fmt::Debug {
async fn prefetch(&self, items: Vec<PrefetchItem>) -> anyhow::Result<PrefetchResponse>;
}
#[derive(Debug)]
pub struct PrefixPrefetch {
inner: Arc<dyn ObjectPrefetch>,
prefix: Path,
}
impl PrefixPrefetch {
pub fn new(inner: Arc<dyn ObjectPrefetch>, prefix: Path) -> Self {
Self { inner, prefix }
}
}
#[async_trait]
impl ObjectPrefetch for PrefixPrefetch {
async fn prefetch(&self, mut items: Vec<PrefetchItem>) -> anyhow::Result<PrefetchResponse> {
for item in &mut items {
let full = Path::from_iter(
self.prefix
.parts()
.chain(Path::from(item.key.as_str()).parts()),
);
item.key = full.as_ref().to_string();
}
self.inner.prefetch(items).await
}
}