use crate::var_provider::{VarProvider, VarType};
use chrono::{DateTime, TimeZone, Utc};
use datafusion_common::alias::AliasGenerator;
use datafusion_common::config::ConfigOptions;
use datafusion_common::HashMap;
use std::sync::Arc;
#[derive(Clone, Debug)]
pub struct ExecutionProps {
pub query_execution_start_time: DateTime<Utc>,
pub alias_generator: Arc<AliasGenerator>,
pub config_options: Option<Arc<ConfigOptions>>,
pub var_providers: Option<HashMap<VarType, Arc<dyn VarProvider + Send + Sync>>>,
}
impl Default for ExecutionProps {
fn default() -> Self {
Self::new()
}
}
impl ExecutionProps {
pub fn new() -> Self {
ExecutionProps {
query_execution_start_time: Utc.timestamp_nanos(0),
alias_generator: Arc::new(AliasGenerator::new()),
config_options: None,
var_providers: None,
}
}
pub fn with_query_execution_start_time(
mut self,
query_execution_start_time: DateTime<Utc>,
) -> Self {
self.query_execution_start_time = query_execution_start_time;
self
}
#[deprecated(since = "50.0.0", note = "Use mark_start_execution instead")]
pub fn start_execution(&mut self) -> &Self {
let default_config = Arc::new(ConfigOptions::default());
self.mark_start_execution(default_config)
}
pub fn mark_start_execution(&mut self, config_options: Arc<ConfigOptions>) -> &Self {
self.query_execution_start_time = Utc::now();
self.alias_generator = Arc::new(AliasGenerator::new());
self.config_options = Some(config_options);
&*self
}
pub fn add_var_provider(
&mut self,
var_type: VarType,
provider: Arc<dyn VarProvider + Send + Sync>,
) -> Option<Arc<dyn VarProvider + Send + Sync>> {
let mut var_providers = self.var_providers.take().unwrap_or_default();
let old_provider = var_providers.insert(var_type, provider);
self.var_providers = Some(var_providers);
old_provider
}
pub fn get_var_provider(
&self,
var_type: VarType,
) -> Option<Arc<dyn VarProvider + Send + Sync>> {
self.var_providers
.as_ref()
.and_then(|var_providers| var_providers.get(&var_type).cloned())
}
pub fn config_options(&self) -> Option<&Arc<ConfigOptions>> {
self.config_options.as_ref()
}
}
#[cfg(test)]
mod test {
use super::*;
#[test]
fn debug() {
let props = ExecutionProps::new();
assert_eq!("ExecutionProps { query_execution_start_time: 1970-01-01T00:00:00Z, alias_generator: AliasGenerator { next_id: 1 }, config_options: None, var_providers: None }", format!("{props:?}"));
}
}