use std::cell::RefCell;
use std::rc::Rc;
use std::sync::{Arc, Mutex};
use crate::error::Result;
use crate::logicalplan::ScalarValue;
use arrow::array::ArrayRef;
use arrow::datatypes::{DataType, Field, Schema, SchemaRef};
use arrow::record_batch::{RecordBatch, RecordBatchReader};
pub trait ExecutionPlan {
fn schema(&self) -> SchemaRef;
fn partitions(&self) -> Result<Vec<Arc<dyn Partition>>>;
}
pub trait Partition: Send + Sync {
fn execute(&self) -> Result<Arc<Mutex<dyn RecordBatchReader + Send + Sync>>>;
}
pub trait PhysicalExpr: Send + Sync {
fn name(&self) -> String;
fn data_type(&self, input_schema: &Schema) -> Result<DataType>;
fn nullable(&self, input_schema: &Schema) -> Result<bool>;
fn evaluate(&self, batch: &RecordBatch) -> Result<ArrayRef>;
fn to_schema_field(&self, input_schema: &Schema) -> Result<Field> {
Ok(Field::new(
&self.name(),
self.data_type(input_schema)?,
self.nullable(input_schema)?,
))
}
}
pub trait AggregateExpr: Send + Sync {
fn name(&self) -> String;
fn data_type(&self, input_schema: &Schema) -> Result<DataType>;
fn evaluate_input(&self, batch: &RecordBatch) -> Result<ArrayRef>;
fn create_accumulator(&self) -> Rc<RefCell<dyn Accumulator>>;
fn create_reducer(&self, column_index: usize) -> Arc<dyn AggregateExpr>;
}
pub trait Accumulator {
fn accumulate_scalar(&mut self, value: Option<ScalarValue>) -> Result<()>;
fn accumulate_batch(&mut self, array: &ArrayRef) -> Result<()>;
fn get_value(&self) -> Result<Option<ScalarValue>>;
}
pub mod common;
pub mod csv;
pub mod datasource;
pub mod expressions;
pub mod hash_aggregate;
pub mod limit;
pub mod math_expressions;
pub mod memory;
pub mod merge;
pub mod parquet;
pub mod projection;
pub mod selection;
pub mod sort;
pub mod udf;