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_expression_lifter: !no_expression_lifter,
122 enable_where_expansion: !no_where_expansion,
123 enable_group_by_expansion: !no_group_by_expansion,
124 enable_having_expansion: !no_having_expansion,
125 enable_order_by_expansion: !no_order_by_expansion,
126 enable_qualify_to_where: !no_qualify_to_where,
127 enable_cte_hoister: !no_cte_hoister,
128 enable_in_lifter: !no_in_lifter,
129 },
130 debug_trace,
131 };
132
133 config
134 }
135}
136
137#[cfg(test)]
138mod tests {
139 use super::*;
140
141 #[test]
142 fn test_default_config() {
143 let config = ExecutionConfig::default();
144
145 assert!(!config.show_preprocessing);
146 assert!(!config.case_insensitive);
147 assert!(!config.auto_hide_empty);
148 assert!(!config.debug_trace);
149
150 assert!(config.transformer_config.enable_expression_lifter);
152 assert!(config.transformer_config.enable_where_expansion);
153 assert!(config.transformer_config.enable_group_by_expansion);
154 assert!(config.transformer_config.enable_having_expansion);
155 assert!(config.transformer_config.enable_qualify_to_where);
156 assert!(config.transformer_config.enable_cte_hoister);
157 assert!(config.transformer_config.enable_in_lifter);
158 }
159
160 #[test]
161 fn test_builder_pattern() {
162 let config = ExecutionConfig::new()
163 .with_show_preprocessing(true)
164 .with_case_insensitive(true)
165 .with_auto_hide_empty(true)
166 .with_debug_trace(true);
167
168 assert!(config.show_preprocessing);
169 assert!(config.case_insensitive);
170 assert!(config.auto_hide_empty);
171 assert!(config.debug_trace);
172 }
173
174 #[test]
175 fn test_without_preprocessing() {
176 let config = ExecutionConfig::new().without_preprocessing();
177
178 assert!(!config.transformer_config.enable_expression_lifter);
179 assert!(!config.transformer_config.enable_where_expansion);
180 assert!(!config.transformer_config.enable_group_by_expansion);
181 assert!(!config.transformer_config.enable_having_expansion);
182 assert!(!config.transformer_config.enable_qualify_to_where);
183 assert!(!config.transformer_config.enable_cte_hoister);
184 assert!(!config.transformer_config.enable_in_lifter);
185 }
186
187 #[test]
188 fn test_from_cli_flags_all_disabled() {
189 let config = ExecutionConfig::from_cli_flags(
190 false, false, false, false, true, true, true, true, true, true, true, true, false, );
204
205 assert!(!config.show_preprocessing);
206 assert!(!config.show_sql_transformations);
207 assert!(!config.case_insensitive);
208 assert!(!config.transformer_config.enable_expression_lifter);
209 assert!(!config.transformer_config.enable_where_expansion);
210 assert!(!config.transformer_config.enable_group_by_expansion);
211 assert!(!config.transformer_config.enable_having_expansion);
212 assert!(!config.transformer_config.enable_qualify_to_where);
213 assert!(!config.transformer_config.enable_cte_hoister);
214 assert!(!config.transformer_config.enable_in_lifter);
215 }
216
217 #[test]
218 fn test_from_cli_flags_all_enabled() {
219 let config = ExecutionConfig::from_cli_flags(
220 true, true, true, true, false, false, false, false, false, false, false, false, true, );
234
235 assert!(config.show_preprocessing);
236 assert!(config.show_sql_transformations);
237 assert!(config.case_insensitive);
238 assert!(config.auto_hide_empty);
239 assert!(config.debug_trace);
240 assert!(config.transformer_config.enable_expression_lifter);
241 assert!(config.transformer_config.enable_where_expansion);
242 assert!(config.transformer_config.enable_group_by_expansion);
243 assert!(config.transformer_config.enable_having_expansion);
244 assert!(config.transformer_config.enable_qualify_to_where);
245 assert!(config.transformer_config.enable_cte_hoister);
246 assert!(config.transformer_config.enable_in_lifter);
247 }
248
249 #[test]
250 fn test_custom_transformer_config() {
251 let custom_transformer = TransformerConfig {
252 enable_expression_lifter: true,
253 enable_where_expansion: false,
254 enable_group_by_expansion: true,
255 enable_having_expansion: false,
256 enable_order_by_expansion: true,
257 enable_qualify_to_where: false,
258 enable_cte_hoister: true,
259 enable_in_lifter: false,
260 };
261
262 let config = ExecutionConfig::new().with_transformer_config(custom_transformer.clone());
263
264 assert!(config.transformer_config.enable_expression_lifter);
265 assert!(!config.transformer_config.enable_where_expansion);
266 assert!(config.transformer_config.enable_group_by_expansion);
267 assert!(!config.transformer_config.enable_having_expansion);
268 assert!(!config.transformer_config.enable_qualify_to_where);
269 assert!(config.transformer_config.enable_cte_hoister);
270 assert!(!config.transformer_config.enable_in_lifter);
271 }
272}