sql_cli/execution/
config.rs1use crate::query_plan::TransformerConfig;
7
8#[derive(Clone, Debug)]
12pub struct ExecutionConfig {
13 pub show_preprocessing: bool,
15
16 pub show_sql_transformations: bool,
18
19 pub case_insensitive: bool,
21
22 pub auto_hide_empty: bool,
24
25 pub transformer_config: TransformerConfig,
27
28 pub debug_trace: bool,
30}
31
32impl Default for ExecutionConfig {
33 fn default() -> Self {
34 Self {
35 show_preprocessing: false,
36 show_sql_transformations: false,
37 case_insensitive: false,
38 auto_hide_empty: false,
39 transformer_config: TransformerConfig::default(),
40 debug_trace: false,
41 }
42 }
43}
44
45impl ExecutionConfig {
46 pub fn new() -> Self {
48 Self::default()
49 }
50
51 pub fn with_show_preprocessing(mut self, show: bool) -> Self {
53 self.show_preprocessing = show;
54 self
55 }
56
57 pub fn with_show_sql_transformations(mut self, show: bool) -> Self {
59 self.show_sql_transformations = show;
60 self
61 }
62
63 pub fn with_case_insensitive(mut self, insensitive: bool) -> Self {
65 self.case_insensitive = insensitive;
66 self
67 }
68
69 pub fn with_auto_hide_empty(mut self, hide: bool) -> Self {
71 self.auto_hide_empty = hide;
72 self
73 }
74
75 pub fn with_transformer_config(mut self, config: TransformerConfig) -> Self {
77 self.transformer_config = config;
78 self
79 }
80
81 pub fn with_debug_trace(mut self, trace: bool) -> Self {
83 self.debug_trace = trace;
84 self
85 }
86
87 pub fn without_preprocessing(mut self) -> Self {
89 self.transformer_config.enable_expression_lifter = false;
90 self.transformer_config.enable_where_expansion = false;
91 self.transformer_config.enable_group_by_expansion = false;
92 self.transformer_config.enable_having_expansion = false;
93 self.transformer_config.enable_qualify_to_where = false;
94 self.transformer_config.enable_cte_hoister = false;
95 self.transformer_config.enable_in_lifter = false;
96 self
97 }
98
99 pub fn from_cli_flags(
101 show_preprocessing: bool,
102 show_sql_transformations: bool,
103 case_insensitive: bool,
104 auto_hide_empty: bool,
105 no_expression_lifter: bool,
106 no_where_expansion: bool,
107 no_group_by_expansion: bool,
108 no_having_expansion: bool,
109 no_order_by_expansion: bool,
110 no_qualify_to_where: bool,
111 no_cte_hoister: bool,
112 no_in_lifter: bool,
113 debug_trace: bool,
114 ) -> Self {
115 let config = Self {
116 show_preprocessing,
117 show_sql_transformations,
118 case_insensitive,
119 auto_hide_empty,
120 transformer_config: TransformerConfig {
121 enable_pivot_expander: true, enable_expression_lifter: !no_expression_lifter,
123 enable_where_expansion: !no_where_expansion,
124 enable_group_by_expansion: !no_group_by_expansion,
125 enable_having_expansion: !no_having_expansion,
126 enable_order_by_expansion: !no_order_by_expansion,
127 enable_qualify_to_where: !no_qualify_to_where,
128 enable_ilike_to_like: true, enable_cte_hoister: !no_cte_hoister,
130 enable_in_lifter: !no_in_lifter,
131 },
132 debug_trace,
133 };
134
135 config
136 }
137}
138
139#[cfg(test)]
140mod tests {
141 use super::*;
142
143 #[test]
144 fn test_default_config() {
145 let config = ExecutionConfig::default();
146
147 assert!(!config.show_preprocessing);
148 assert!(!config.case_insensitive);
149 assert!(!config.auto_hide_empty);
150 assert!(!config.debug_trace);
151
152 assert!(config.transformer_config.enable_expression_lifter);
154 assert!(config.transformer_config.enable_where_expansion);
155 assert!(config.transformer_config.enable_group_by_expansion);
156 assert!(config.transformer_config.enable_having_expansion);
157 assert!(config.transformer_config.enable_qualify_to_where);
158 assert!(config.transformer_config.enable_cte_hoister);
159 assert!(config.transformer_config.enable_in_lifter);
160 }
161
162 #[test]
163 fn test_builder_pattern() {
164 let config = ExecutionConfig::new()
165 .with_show_preprocessing(true)
166 .with_case_insensitive(true)
167 .with_auto_hide_empty(true)
168 .with_debug_trace(true);
169
170 assert!(config.show_preprocessing);
171 assert!(config.case_insensitive);
172 assert!(config.auto_hide_empty);
173 assert!(config.debug_trace);
174 }
175
176 #[test]
177 fn test_without_preprocessing() {
178 let config = ExecutionConfig::new().without_preprocessing();
179
180 assert!(!config.transformer_config.enable_expression_lifter);
181 assert!(!config.transformer_config.enable_where_expansion);
182 assert!(!config.transformer_config.enable_group_by_expansion);
183 assert!(!config.transformer_config.enable_having_expansion);
184 assert!(!config.transformer_config.enable_qualify_to_where);
185 assert!(!config.transformer_config.enable_cte_hoister);
186 assert!(!config.transformer_config.enable_in_lifter);
187 }
188
189 #[test]
190 fn test_from_cli_flags_all_disabled() {
191 let config = ExecutionConfig::from_cli_flags(
192 false, false, false, false, true, true, true, true, true, true, true, true, false, );
206
207 assert!(!config.show_preprocessing);
208 assert!(!config.show_sql_transformations);
209 assert!(!config.case_insensitive);
210 assert!(!config.transformer_config.enable_expression_lifter);
211 assert!(!config.transformer_config.enable_where_expansion);
212 assert!(!config.transformer_config.enable_group_by_expansion);
213 assert!(!config.transformer_config.enable_having_expansion);
214 assert!(!config.transformer_config.enable_qualify_to_where);
215 assert!(!config.transformer_config.enable_cte_hoister);
216 assert!(!config.transformer_config.enable_in_lifter);
217 }
218
219 #[test]
220 fn test_from_cli_flags_all_enabled() {
221 let config = ExecutionConfig::from_cli_flags(
222 true, true, true, true, false, false, false, false, false, false, false, false, true, );
236
237 assert!(config.show_preprocessing);
238 assert!(config.show_sql_transformations);
239 assert!(config.case_insensitive);
240 assert!(config.auto_hide_empty);
241 assert!(config.debug_trace);
242 assert!(config.transformer_config.enable_expression_lifter);
243 assert!(config.transformer_config.enable_where_expansion);
244 assert!(config.transformer_config.enable_group_by_expansion);
245 assert!(config.transformer_config.enable_having_expansion);
246 assert!(config.transformer_config.enable_qualify_to_where);
247 assert!(config.transformer_config.enable_cte_hoister);
248 assert!(config.transformer_config.enable_in_lifter);
249 }
250
251 #[test]
252 fn test_custom_transformer_config() {
253 let custom_transformer = TransformerConfig {
254 enable_pivot_expander: true,
255 enable_expression_lifter: true,
256 enable_where_expansion: false,
257 enable_group_by_expansion: true,
258 enable_having_expansion: false,
259 enable_order_by_expansion: true,
260 enable_qualify_to_where: false,
261 enable_ilike_to_like: true,
262 enable_cte_hoister: true,
263 enable_in_lifter: false,
264 };
265
266 let config = ExecutionConfig::new().with_transformer_config(custom_transformer.clone());
267
268 assert!(config.transformer_config.enable_expression_lifter);
269 assert!(!config.transformer_config.enable_where_expansion);
270 assert!(config.transformer_config.enable_group_by_expansion);
271 assert!(!config.transformer_config.enable_having_expansion);
272 assert!(!config.transformer_config.enable_qualify_to_where);
273 assert!(config.transformer_config.enable_cte_hoister);
274 assert!(!config.transformer_config.enable_in_lifter);
275 }
276}