#![allow(dead_code)]
use std::collections::HashMap;
use std::sync::Arc;
use datafusion::error::Result;
use datafusion::execution::session_state::SessionStateBuilder;
use datafusion::prelude::SessionContext;
use tracing_subscriber::EnvFilter;
use zarr_datafusion::datasource::factory::ZarrTableFactory;
use zarr_datafusion::optimizer::{CountStatisticsRule, MinMaxStatisticsRule};
pub fn init_tracing() {
tracing_subscriber::fmt()
.with_env_filter(EnvFilter::from_default_env())
.with_target(true)
.with_line_number(true)
.init();
}
pub fn create_local_context() -> SessionContext {
let state = SessionStateBuilder::new()
.with_default_features()
.with_optimizer_rule(Arc::new(CountStatisticsRule::new()))
.with_optimizer_rule(Arc::new(MinMaxStatisticsRule::new()))
.build();
SessionContext::new_with_state(state)
}
pub fn create_remote_context() -> SessionContext {
let state = SessionStateBuilder::new()
.with_default_features()
.with_table_factories(HashMap::from([(
"ZARR".to_string(),
Arc::new(ZarrTableFactory) as _,
)]))
.with_optimizer_rule(Arc::new(CountStatisticsRule::new()))
.with_optimizer_rule(Arc::new(MinMaxStatisticsRule::new()))
.build();
SessionContext::new_with_state(state)
}
pub async fn run_query(ctx: &SessionContext, description: &str, sql: &str) -> Result<()> {
println!("\n{description}");
println!("SQL: {sql}");
println!();
let df = ctx.sql(sql).await?;
df.show().await?;
Ok(())
}