use crate::arrow::record_batch::RecordBatch;
use crate::error::Result;
use crate::logical_plan::{
DFSchema, Expr, FunctionRegistry, JoinType, LogicalPlan, Partitioning,
};
use std::sync::Arc;
use async_trait::async_trait;
#[async_trait]
pub trait DataFrame {
fn select_columns(&self, columns: Vec<&str>) -> Result<Arc<dyn DataFrame>>;
fn select(&self, expr: Vec<Expr>) -> Result<Arc<dyn DataFrame>>;
fn filter(&self, expr: Expr) -> Result<Arc<dyn DataFrame>>;
fn aggregate(
&self,
group_expr: Vec<Expr>,
aggr_expr: Vec<Expr>,
) -> Result<Arc<dyn DataFrame>>;
fn limit(&self, n: usize) -> Result<Arc<dyn DataFrame>>;
fn sort(&self, expr: Vec<Expr>) -> Result<Arc<dyn DataFrame>>;
fn join(
&self,
right: Arc<dyn DataFrame>,
join_type: JoinType,
left_cols: &[&str],
right_cols: &[&str],
) -> Result<Arc<dyn DataFrame>>;
fn repartition(
&self,
partitioning_scheme: Partitioning,
) -> Result<Arc<dyn DataFrame>>;
async fn collect(&self) -> Result<Vec<RecordBatch>>;
fn schema(&self) -> &DFSchema;
fn to_logical_plan(&self) -> LogicalPlan;
fn explain(&self, verbose: bool) -> Result<Arc<dyn DataFrame>>;
fn registry(&self) -> Arc<dyn FunctionRegistry>;
}