use std::sync::Arc;
use bytes::Bytes;
use datafusion::object_store::{GetOptions, ObjectMeta, ObjectStore, ObjectStoreExt};
use futures::future::BoxFuture;
use futures::{FutureExt, TryFutureExt};
use orc_rust::reader::AsyncChunkReader;
pub struct ObjectStoreReader {
store: Arc<dyn ObjectStore>,
file: ObjectMeta,
}
impl ObjectStoreReader {
pub fn new(store: Arc<dyn ObjectStore>, file: ObjectMeta) -> Self {
Self { store, file }
}
}
impl AsyncChunkReader for ObjectStoreReader {
fn len(&mut self) -> BoxFuture<'_, std::io::Result<u64>> {
self.store
.get_opts(&self.file.location, GetOptions::default())
.map(|result| result.map(|x| x.meta.size))
.map_err(|e| e.into())
.boxed()
}
fn get_bytes(
&mut self,
offset_from_start: u64,
length: u64,
) -> BoxFuture<'_, std::io::Result<Bytes>> {
let range = offset_from_start..(offset_from_start + length);
self.store
.get_range(&self.file.location, range)
.map_err(std::io::Error::from)
.boxed()
}
}