1pub mod config;
70pub mod context;
71pub mod statement_executor;
72
73pub use config::ExecutionConfig;
75pub use context::ExecutionContext;
76pub use statement_executor::{ExecutionResult, ExecutionStats, StatementExecutor};
77
78#[cfg(test)]
79mod tests {
80 use super::*;
81 use crate::data::datatable::{DataColumn, DataRow, DataTable, DataType, DataValue};
82 use crate::sql::recursive_parser::Parser;
83 use std::sync::Arc;
84
85 fn create_sample_table() -> DataTable {
86 let mut table = DataTable::new("sample");
87 table.add_column(DataColumn::new("id").with_type(DataType::Integer));
88 table.add_column(DataColumn::new("value").with_type(DataType::Integer));
89
90 for i in 1..=10 {
91 let _ = table.add_row(DataRow {
92 values: vec![DataValue::Integer(i), DataValue::Integer(i * 10)],
93 });
94 }
95
96 table
97 }
98
99 #[test]
100 fn test_module_integration() {
101 let table = create_sample_table();
103 let mut context = ExecutionContext::new(Arc::new(table));
104
105 let config = ExecutionConfig::new()
106 .with_case_insensitive(false)
107 .with_auto_hide_empty(false);
108
109 let executor = StatementExecutor::with_config(config);
110
111 let mut parser = Parser::new("SELECT id, value FROM sample WHERE id <= 5");
113 let stmt = parser.parse().unwrap();
114
115 let result = executor.execute(stmt, &mut context).unwrap();
116
117 assert_eq!(result.dataview.row_count(), 5);
118 assert_eq!(result.dataview.column_count(), 2);
119 assert!(result.stats.total_time_ms >= 0.0);
120 }
121
122 #[test]
123 fn test_temp_table_workflow() {
124 let base_table = create_sample_table();
126 let mut context = ExecutionContext::new(Arc::new(base_table));
127 let executor = StatementExecutor::new();
128
129 let mut temp_table = DataTable::new("#filtered");
131 temp_table.add_column(DataColumn::new("id").with_type(DataType::Integer));
132 temp_table.add_column(DataColumn::new("value").with_type(DataType::Integer));
133 for i in 1..=3 {
134 let _ = temp_table.add_row(DataRow {
135 values: vec![DataValue::Integer(i), DataValue::Integer(i * 10)],
136 });
137 }
138
139 context
141 .store_temp_table("#filtered".to_string(), Arc::new(temp_table))
142 .unwrap();
143
144 let mut parser = Parser::new("SELECT * FROM #filtered");
146 let stmt = parser.parse().unwrap();
147 let result = executor.execute(stmt, &mut context).unwrap();
148
149 assert_eq!(result.dataview.row_count(), 3);
150 assert!(context.has_temp_table("#filtered"));
151 }
152
153 #[test]
154 fn test_dual_table_usage() {
155 let table = create_sample_table();
157 let mut context = ExecutionContext::new(Arc::new(table));
158 let executor = StatementExecutor::new();
159
160 let mut parser = Parser::new("SELECT 1+1 as result, 'hello' as greeting");
161 let stmt = parser.parse().unwrap();
162
163 let result = executor.execute(stmt, &mut context).unwrap();
164
165 assert_eq!(result.dataview.row_count(), 1);
166 assert_eq!(result.dataview.column_count(), 2);
167 assert!(!result.stats.preprocessing_applied); }
169
170 #[test]
171 fn test_configuration_propagation() {
172 let table = create_sample_table();
174 let mut context = ExecutionContext::new(Arc::new(table));
175
176 let config = ExecutionConfig::new().without_preprocessing();
178 let executor = StatementExecutor::with_config(config);
179
180 let mut parser = Parser::new("SELECT * FROM sample");
181 let stmt = parser.parse().unwrap();
182
183 let result = executor.execute(stmt, &mut context).unwrap();
184
185 assert_eq!(result.dataview.row_count(), 10);
187 }
188
189 #[test]
190 fn test_execution_statistics() {
191 let table = create_sample_table();
193 let mut context = ExecutionContext::new(Arc::new(table));
194 let executor = StatementExecutor::new();
195
196 let mut parser = Parser::new("SELECT * FROM sample WHERE value > 50");
197 let stmt = parser.parse().unwrap();
198
199 let result = executor.execute(stmt, &mut context).unwrap();
200
201 assert_eq!(result.stats.row_count, 5); assert_eq!(result.stats.column_count, 2);
204 assert!(result.stats.total_time_ms >= result.stats.preprocessing_time_ms);
205 assert!(result.stats.total_time_ms >= result.stats.execution_time_ms);
206 }
207}