pub mod exec;
pub mod fetcher;
pub mod joins;
use datafusion::arrow::datatypes::{Field, Schema, SchemaRef};
use datafusion::common::{Result, Statistics};
use datafusion::execution::SendableRecordBatchStream;
use datafusion::logical_expr::{utils::expr_to_columns, Expr};
use datafusion_common::DataFusionError;
use std::any::Any;
use std::collections::HashSet;
use std::fmt;
use datafusion::physical_expr::{EquivalenceProperties, PhysicalSortExpr};
use datafusion::physical_plan::execution_plan::{Boundedness, EmissionType};
use datafusion::physical_plan::expressions::Column as PhysicalColumn;
use datafusion::physical_plan::{Partitioning, PlanProperties};
use std::sync::Arc;
pub fn create_plan_properties_for_pk_scan(schema: SchemaRef, ordered: bool) -> PlanProperties {
let mut eq_properties = EquivalenceProperties::new(schema.clone());
if ordered {
let sort_exprs: Vec<PhysicalSortExpr> = schema
.fields()
.iter()
.enumerate()
.map(|(i, field)| {
PhysicalSortExpr::new_default(Arc::new(PhysicalColumn::new(field.name(), i))).asc()
})
.collect();
eq_properties.add_ordering(sort_exprs);
}
PlanProperties::new(
eq_properties,
Partitioning::RoundRobinBatch(1),
EmissionType::Incremental,
Boundedness::Bounded,
)
}
pub fn create_index_schema(fields: impl IntoIterator<Item = Field>) -> SchemaRef {
Arc::new(Schema::new(fields.into_iter().collect::<Vec<_>>()))
}
pub trait Index: fmt::Debug + Send + Sync + 'static {
fn as_any(&self) -> &dyn Any;
fn name(&self) -> &str;
fn index_schema(&self) -> SchemaRef;
fn table_name(&self) -> &str;
fn column_name(&self) -> &str;
fn supports_predicate(&self, predicate: &Expr) -> Result<bool> {
let mut columns = HashSet::new();
expr_to_columns(predicate, &mut columns)?;
Ok(columns.iter().any(|col| col.name == self.column_name()))
}
fn is_ordered(&self) -> bool {
false
}
fn scan(
&self,
filters: &[Expr],
limit: Option<usize>,
) -> Result<SendableRecordBatchStream, DataFusionError>;
fn statistics(&self) -> Statistics;
}