From ef374723b223752a9217a0e7fd816b7ba30c5ccd Mon Sep 17 00:00:00 2001 From: Marco De Araujo Date: Thu, 25 Dec 2025 19:19:32 -0400 Subject: [PATCH] HasMap optimizationa --- src/core/data.rs | 32 ++++++++++++++++++++++---------- src/data/heartbeat/model.rs | 6 ------ 2 files changed, 22 insertions(+), 16 deletions(-) diff --git a/src/core/data.rs b/src/core/data.rs index e77ce93..2d38fd5 100644 --- a/src/core/data.rs +++ b/src/core/data.rs @@ -1,21 +1,33 @@ +use std::collections::HashMap; + use crate::core::models::{UnifiedData, UnifiedGroupData, UnifiedMonitorData}; -use crate::data::heartbeat::model::HeartbeatResponse; -use crate::data::status_page::model::StatusPageResponse; +use crate::data::{ + heartbeat::model::{HeartbeatEntry, HeartbeatResponse, UptimeData}, + status_page::model::StatusPageResponse, +}; pub fn unify_data(status_page: &StatusPageResponse, heartbeat: &HeartbeatResponse) -> UnifiedData { let mut groups = Vec::new(); + let heartbeat_map: HashMap> = heartbeat + .monitors + .iter() + .map(|m| (m.monitor_id, m.heartbeats.clone())) + .collect(); + + let uptime_map: HashMap<(u64, u32), UptimeData> = heartbeat + .uptime_data + .iter() + .map(|u| ((u.monitor_id, u.period_hours), u.clone())) + .collect(); for group in &status_page.public_group_list { let mut monitors = Vec::new(); for monitor_info in &group.monitor_list { - let uptime_data = heartbeat.get_uptime(monitor_info.id, 24).cloned(); - - let heartbeats = heartbeat - .monitors - .iter() - .find(|m| m.monitor_id == monitor_info.id) - .map(|m| m.heartbeats.clone()) - .unwrap_or_else(Vec::new); + let uptime_data = uptime_map.get(&(monitor_info.id, 24)).cloned(); + let heartbeats = heartbeat_map + .get(&monitor_info.id) + .cloned() + .unwrap_or_default(); monitors.push(UnifiedMonitorData { monitor_info: monitor_info.clone(), diff --git a/src/data/heartbeat/model.rs b/src/data/heartbeat/model.rs index 379f939..ff40b43 100644 --- a/src/data/heartbeat/model.rs +++ b/src/data/heartbeat/model.rs @@ -93,10 +93,4 @@ impl HeartbeatResponse { .sort_by_key(|u| (u.monitor_id, u.period_hours)); Ok(()) } - - pub fn get_uptime(&self, monitor_id: u64, period_hours: u32) -> Option<&UptimeData> { - self.uptime_data - .iter() - .find(|u| u.monitor_id == monitor_id && u.period_hours == period_hours) - } }