#![cfg(feature = "tui")]
mod ddl;
#[cfg(feature = "flightsql")]
mod flightsql_execution;
#[cfg(feature = "flightsql")]
mod flightsql_pagination;
mod keyboard_modifiers;
mod pagination;
mod quit;
mod sql_execution;
mod sql_pagination;
use datafusion::arrow::array::RecordBatch;
use datafusion::common::Result;
use datafusion_app::{extensions::DftSessionStateBuilder, local::ExecutionContext};
use datafusion_dft::{
args::DftArgs,
config::create_config,
execution::AppExecution,
tui::{state::AppState, App, AppEvent},
};
use tempfile::{tempdir, TempDir};
struct TestApp<'app> {
#[allow(dead_code)]
config_path: TempDir,
app: App<'app>,
}
impl TestApp<'_> {
async fn new() -> Self {
let config_path = tempdir().unwrap();
let config = create_config(config_path.path().to_path_buf());
let state = AppState::new(config);
let session_state =
DftSessionStateBuilder::try_new(Some(state.config.tui.execution.clone()))
.unwrap()
.with_extensions()
.await
.unwrap()
.build()
.unwrap();
let execution_ctx = ExecutionContext::try_new(
&state.config.tui.execution,
session_state,
"dft",
env!("CARGO_PKG_VERSION"),
)
.unwrap();
let app_execution = AppExecution::new(execution_ctx);
let args = DftArgs::default();
let mut app = App::new(state, args, app_execution);
app.enter(false).unwrap();
Self { config_path, app }
}
pub fn handle_app_event(&mut self, event: AppEvent) -> color_eyre::Result<()> {
self.app.handle_app_event(event)
}
pub fn state(&self) -> &datafusion_dft::tui::state::AppState<'_> {
self.app.state()
}
pub async fn wait_for_ddl(&mut self) {
if let Some(handle) = self.app.ddl_task().take() {
handle.await.unwrap();
}
}
pub async fn execute_sql(&self, sql: &str) -> Result<Vec<RecordBatch>> {
let ctx = self.app.execution().session_ctx().clone();
ctx.sql(sql).await.unwrap().collect().await
}
}