pub use datafusion_app::{collect_plan_io_stats, ExecutionStats};
use color_eyre::Result;
use datafusion::prelude::*;
#[cfg(feature = "flightsql")]
use datafusion_app::flightsql::{FlightSQLClient, FlightSQLContext};
use datafusion_app::{local::ExecutionContext, ExecOptions, ExecResult};
#[derive(Clone, Debug)]
pub struct AppExecution {
local: ExecutionContext,
#[cfg(feature = "flightsql")]
flightsql: FlightSQLContext,
}
impl AppExecution {
pub fn new(local: ExecutionContext) -> Self {
Self {
local,
#[cfg(feature = "flightsql")]
flightsql: FlightSQLContext::default(),
}
}
pub fn execution_ctx(&self) -> &ExecutionContext {
&self.local
}
pub fn session_ctx(&self) -> &SessionContext {
self.local.session_ctx()
}
#[cfg(feature = "flightsql")]
pub fn flightsql_client(&self) -> &FlightSQLClient {
self.flightsql.client()
}
#[cfg(feature = "flightsql")]
pub fn flightsql_ctx(&self) -> &FlightSQLContext {
&self.flightsql
}
#[cfg(feature = "flightsql")]
pub fn with_flightsql_ctx(&mut self, flightsql_ctx: FlightSQLContext) {
self.flightsql = flightsql_ctx;
}
pub async fn execute_sql_with_opts(&self, sql: &str, opts: ExecOptions) -> Result<ExecResult> {
#[cfg(feature = "flightsql")]
if opts.flightsql {
return self
.flightsql
.execute_sql_with_opts(sql, opts)
.await
.map_err(|e| e.into());
}
self.local
.execute_sql_with_opts(sql, opts)
.await
.map_err(|e| e.into())
}
}