datafusion_federation/sql/
executor.rsuse async_trait::async_trait;
use core::fmt;
use datafusion::{
arrow::datatypes::SchemaRef, error::Result, physical_plan::SendableRecordBatchStream,
sql::sqlparser::ast, sql::unparser::dialect::Dialect,
};
use std::sync::Arc;
pub type SQLExecutorRef = Arc<dyn SQLExecutor>;
pub type AstAnalyzer = Box<dyn Fn(ast::Statement) -> Result<ast::Statement>>;
#[async_trait]
pub trait SQLExecutor: Sync + Send {
fn name(&self) -> &str;
fn compute_context(&self) -> Option<String>;
fn dialect(&self) -> Arc<dyn Dialect>;
fn ast_analyzer(&self) -> Option<AstAnalyzer> {
None
}
fn execute(&self, query: &str, schema: SchemaRef) -> Result<SendableRecordBatchStream>;
async fn table_names(&self) -> Result<Vec<String>>;
async fn get_table_schema(&self, table_name: &str) -> Result<SchemaRef>;
}
impl fmt::Debug for dyn SQLExecutor {
fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
write!(f, "{} {:?}", self.name(), self.compute_context())
}
}
impl fmt::Display for dyn SQLExecutor {
fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
write!(f, "{} {:?}", self.name(), self.compute_context())
}
}