use std::sync::Arc;
use async_trait::async_trait;
use vortex_array::stats::{Stat, StatsSet};
use vortex_array::Array;
use vortex_dtype::{DType, FieldPath};
use vortex_error::VortexResult;
use vortex_expr::ExprRef;
use vortex_scan::RowMask;
use crate::Layout;
pub trait LayoutReader: Send + Sync + ExprEvaluator + StatsEvaluator {
fn layout(&self) -> &Layout;
}
impl LayoutReader for Arc<dyn LayoutReader + 'static> {
fn layout(&self) -> &Layout {
self.as_ref().layout()
}
}
#[async_trait]
pub trait ExprEvaluator {
async fn evaluate_expr(&self, row_mask: RowMask, expr: ExprRef) -> VortexResult<Array>;
}
#[async_trait]
impl ExprEvaluator for Arc<dyn LayoutReader + 'static> {
async fn evaluate_expr(&self, row_mask: RowMask, expr: ExprRef) -> VortexResult<Array> {
self.as_ref().evaluate_expr(row_mask, expr).await
}
}
#[async_trait]
pub trait StatsEvaluator {
async fn evaluate_stats(
&self,
field_paths: Arc<[FieldPath]>,
stats: Arc<[Stat]>,
) -> VortexResult<Vec<StatsSet>>;
}
#[async_trait]
impl StatsEvaluator for Arc<dyn LayoutReader + 'static> {
async fn evaluate_stats(
&self,
field_paths: Arc<[FieldPath]>,
stats: Arc<[Stat]>,
) -> VortexResult<Vec<StatsSet>> {
self.as_ref().evaluate_stats(field_paths, stats).await
}
}
pub trait LayoutReaderExt: LayoutReader {
fn into_arc(self) -> Arc<dyn LayoutReader>
where
Self: Sized + 'static,
{
Arc::new(self) as _
}
fn row_count(&self) -> u64 {
self.layout().row_count()
}
fn dtype(&self) -> &DType {
self.layout().dtype()
}
}
impl<L: LayoutReader> LayoutReaderExt for L {}