| 176 | } |
| 177 | |
| 178 | fn execute_gitql_query( |
| 179 | query: &str, |
| 180 | arguments: &Arguments, |
| 181 | repos: &[gix::Repository], |
| 182 | env: &mut Environment, |
| 183 | reporter: &mut DiagnosticReporter, |
| 184 | ) { |
| 185 | let front_start = std::time::Instant::now(); |
| 186 | let tokenizer_result = Tokenizer::tokenize(query); |
| 187 | if tokenizer_result.is_err() { |
| 188 | let diagnostic = tokenizer_result.err().unwrap(); |
| 189 | reporter.report_diagnostic(query, *diagnostic); |
| 190 | std::process::exit(1); |
| 191 | } |
| 192 | |
| 193 | let tokens = tokenizer_result.ok().unwrap(); |
| 194 | if tokens.is_empty() { |
| 195 | return; |
| 196 | } |
| 197 | |
| 198 | let parser_result = parser::parse_gql(tokens, env); |
| 199 | if parser_result.is_err() { |
| 200 | let diagnostic = parser_result.err().unwrap(); |
| 201 | reporter.report_diagnostic(query, *diagnostic); |
| 202 | std::process::exit(1); |
| 203 | } |
| 204 | |
| 205 | let query_node = parser_result.ok().unwrap(); |
| 206 | let front_duration = front_start.elapsed(); |
| 207 | |
| 208 | let engine_start = std::time::Instant::now(); |
| 209 | let provider: Box<dyn DataProvider> = Box::new(GitQLDataProvider::new(repos.to_vec())); |
| 210 | let evaluation_result = engine::evaluate(env, &provider, query_node); |
| 211 | let engine_duration = engine_start.elapsed(); |
| 212 | |
| 213 | // Report Runtime exceptions if they exists |
| 214 | if evaluation_result.is_err() { |
| 215 | let exception = Diagnostic::exception(&evaluation_result.err().unwrap()); |
| 216 | reporter.report_diagnostic("", exception); |
| 217 | std::process::exit(1); |
| 218 | } |
| 219 | |
| 220 | let printer: Box<dyn BaseOutputPrinter> = match arguments.output_format { |
| 221 | OutputFormatKind::Table => { |
| 222 | Box::new(TablePrinter::new(arguments.pagination, arguments.page_size)) |
| 223 | } |
| 224 | OutputFormatKind::JSON => Box::new(JSONPrinter), |
| 225 | OutputFormatKind::CSV => Box::new(CSVPrinter), |
| 226 | OutputFormatKind::YAML => Box::new(YAMLPrinter), |
| 227 | }; |
| 228 | |
| 229 | // Render the result only if they are selected groups not any other statement |
| 230 | let evaluations_results = evaluation_result.ok().unwrap(); |
| 231 | for evaluation_result in evaluations_results { |
| 232 | let mut rows_count = 0; |
| 233 | if let SelectedGroups(mut groups) = evaluation_result |
| 234 | && !groups.is_empty() |
| 235 | { |