routee_compass/plugin/output/default/summary/
plugin.rs1use crate::app::{compass::CompassAppError, search::SearchAppResult};
2use crate::plugin::output::default::summary::SummaryConfig;
3use crate::plugin::output::output_plugin::OutputPlugin;
4use crate::plugin::output::OutputPluginError;
5use routee_compass_core::algorithm::search::SearchInstance;
6use routee_compass_core::util::duration_extension::DurationExtension;
7use serde_json::json;
8
9pub struct SummaryOutputPlugin {
11 pub estimate_memory_consumption: bool,
12}
13
14impl OutputPlugin for SummaryOutputPlugin {
15 fn process(
17 &self,
18 output: &mut serde_json::Value,
19 search_result: &Result<(SearchAppResult, SearchInstance), CompassAppError>,
20 ) -> Result<(), OutputPluginError> {
21 match search_result {
22 Err(_e) => Ok(()),
23 Ok((result, _)) => {
24 let route_edges = result.routes.iter().map(|r| r.len()).sum::<usize>();
25 let tree_edges = result.trees.iter().map(|t| t.len()).sum::<usize>();
26 let terminated = result
27 .terminated
28 .clone()
29 .unwrap_or_else(|| "false".to_string());
30
31 output["search_executed_time"] = json![result.search_executed_time.clone()];
32 output["search_runtime"] = json![result.search_runtime.hhmmss()];
33 output["route_edges"] = json![route_edges];
34 output["tree_size_count"] = json![tree_edges];
35 output["iterations"] = json![result.iterations];
36 output["terminated"] = json![terminated];
37
38 if self.estimate_memory_consumption {
39 let memory_bytes = allocative::size_of_unique(result) as f64;
40 let memory_mib = memory_bytes / 1_048_576.0;
41 output["search_result_size_mib"] = json![memory_mib];
42 }
43
44 Ok(())
45 }
46 }
47 }
48}
49
50impl SummaryOutputPlugin {
51 pub fn new(conf: SummaryConfig) -> SummaryOutputPlugin {
52 SummaryOutputPlugin {
53 estimate_memory_consumption: conf.estimate_memory_consumption.unwrap_or_default(),
54 }
55 }
56}