use crate::query_plan::TransformerConfig;
#[derive(Clone, Debug)]
pub struct ExecutionConfig {
pub show_preprocessing: bool,
pub show_sql_transformations: bool,
pub case_insensitive: bool,
pub auto_hide_empty: bool,
pub transformer_config: TransformerConfig,
pub debug_trace: bool,
}
impl Default for ExecutionConfig {
fn default() -> Self {
Self {
show_preprocessing: false,
show_sql_transformations: false,
case_insensitive: false,
auto_hide_empty: false,
transformer_config: TransformerConfig::default(),
debug_trace: false,
}
}
}
impl ExecutionConfig {
pub fn new() -> Self {
Self::default()
}
pub fn with_show_preprocessing(mut self, show: bool) -> Self {
self.show_preprocessing = show;
self
}
pub fn with_show_sql_transformations(mut self, show: bool) -> Self {
self.show_sql_transformations = show;
self
}
pub fn with_case_insensitive(mut self, insensitive: bool) -> Self {
self.case_insensitive = insensitive;
self
}
pub fn with_auto_hide_empty(mut self, hide: bool) -> Self {
self.auto_hide_empty = hide;
self
}
pub fn with_transformer_config(mut self, config: TransformerConfig) -> Self {
self.transformer_config = config;
self
}
pub fn with_debug_trace(mut self, trace: bool) -> Self {
self.debug_trace = trace;
self
}
pub fn without_preprocessing(mut self) -> Self {
self.transformer_config.enable_expression_lifter = false;
self.transformer_config.enable_where_expansion = false;
self.transformer_config.enable_group_by_expansion = false;
self.transformer_config.enable_having_expansion = false;
self.transformer_config.enable_qualify_to_where = false;
self.transformer_config.enable_cte_hoister = false;
self.transformer_config.enable_in_lifter = false;
self
}
pub fn from_cli_flags(
show_preprocessing: bool,
show_sql_transformations: bool,
case_insensitive: bool,
auto_hide_empty: bool,
no_expression_lifter: bool,
no_where_expansion: bool,
no_group_by_expansion: bool,
no_having_expansion: bool,
no_order_by_expansion: bool,
no_qualify_to_where: bool,
no_cte_hoister: bool,
no_in_lifter: bool,
debug_trace: bool,
) -> Self {
let config = Self {
show_preprocessing,
show_sql_transformations,
case_insensitive,
auto_hide_empty,
transformer_config: TransformerConfig {
enable_pivot_expander: true, enable_expression_lifter: !no_expression_lifter,
enable_where_expansion: !no_where_expansion,
enable_group_by_expansion: !no_group_by_expansion,
enable_having_expansion: !no_having_expansion,
enable_order_by_expansion: !no_order_by_expansion,
enable_qualify_to_where: !no_qualify_to_where,
enable_ilike_to_like: true, enable_cte_hoister: !no_cte_hoister,
enable_in_lifter: !no_in_lifter,
},
debug_trace,
};
config
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_default_config() {
let config = ExecutionConfig::default();
assert!(!config.show_preprocessing);
assert!(!config.case_insensitive);
assert!(!config.auto_hide_empty);
assert!(!config.debug_trace);
assert!(config.transformer_config.enable_expression_lifter);
assert!(config.transformer_config.enable_where_expansion);
assert!(config.transformer_config.enable_group_by_expansion);
assert!(config.transformer_config.enable_having_expansion);
assert!(config.transformer_config.enable_qualify_to_where);
assert!(config.transformer_config.enable_cte_hoister);
assert!(config.transformer_config.enable_in_lifter);
}
#[test]
fn test_builder_pattern() {
let config = ExecutionConfig::new()
.with_show_preprocessing(true)
.with_case_insensitive(true)
.with_auto_hide_empty(true)
.with_debug_trace(true);
assert!(config.show_preprocessing);
assert!(config.case_insensitive);
assert!(config.auto_hide_empty);
assert!(config.debug_trace);
}
#[test]
fn test_without_preprocessing() {
let config = ExecutionConfig::new().without_preprocessing();
assert!(!config.transformer_config.enable_expression_lifter);
assert!(!config.transformer_config.enable_where_expansion);
assert!(!config.transformer_config.enable_group_by_expansion);
assert!(!config.transformer_config.enable_having_expansion);
assert!(!config.transformer_config.enable_qualify_to_where);
assert!(!config.transformer_config.enable_cte_hoister);
assert!(!config.transformer_config.enable_in_lifter);
}
#[test]
fn test_from_cli_flags_all_disabled() {
let config = ExecutionConfig::from_cli_flags(
false, false, false, false, true, true, true, true, true, true, true, true, false, );
assert!(!config.show_preprocessing);
assert!(!config.show_sql_transformations);
assert!(!config.case_insensitive);
assert!(!config.transformer_config.enable_expression_lifter);
assert!(!config.transformer_config.enable_where_expansion);
assert!(!config.transformer_config.enable_group_by_expansion);
assert!(!config.transformer_config.enable_having_expansion);
assert!(!config.transformer_config.enable_qualify_to_where);
assert!(!config.transformer_config.enable_cte_hoister);
assert!(!config.transformer_config.enable_in_lifter);
}
#[test]
fn test_from_cli_flags_all_enabled() {
let config = ExecutionConfig::from_cli_flags(
true, true, true, true, false, false, false, false, false, false, false, false, true, );
assert!(config.show_preprocessing);
assert!(config.show_sql_transformations);
assert!(config.case_insensitive);
assert!(config.auto_hide_empty);
assert!(config.debug_trace);
assert!(config.transformer_config.enable_expression_lifter);
assert!(config.transformer_config.enable_where_expansion);
assert!(config.transformer_config.enable_group_by_expansion);
assert!(config.transformer_config.enable_having_expansion);
assert!(config.transformer_config.enable_qualify_to_where);
assert!(config.transformer_config.enable_cte_hoister);
assert!(config.transformer_config.enable_in_lifter);
}
#[test]
fn test_custom_transformer_config() {
let custom_transformer = TransformerConfig {
enable_pivot_expander: true,
enable_expression_lifter: true,
enable_where_expansion: false,
enable_group_by_expansion: true,
enable_having_expansion: false,
enable_order_by_expansion: true,
enable_qualify_to_where: false,
enable_ilike_to_like: true,
enable_cte_hoister: true,
enable_in_lifter: false,
};
let config = ExecutionConfig::new().with_transformer_config(custom_transformer.clone());
assert!(config.transformer_config.enable_expression_lifter);
assert!(!config.transformer_config.enable_where_expansion);
assert!(config.transformer_config.enable_group_by_expansion);
assert!(!config.transformer_config.enable_having_expansion);
assert!(!config.transformer_config.enable_qualify_to_where);
assert!(config.transformer_config.enable_cte_hoister);
assert!(!config.transformer_config.enable_in_lifter);
}
}