From 833202344ba9ad44feeaba572c1c64cc55c1e25a Mon Sep 17 00:00:00 2001 From: "Torsten Schulz (local)" Date: Sat, 20 Dec 2025 22:20:29 +0100 Subject: [PATCH] Refactor SQL query in Worker to improve distance calculations: Replace the existing LEFT JOIN with a LATERAL join to enhance the selection of region distances based on transport mode, ensuring more accurate results. Update polling frequency in TransportWorker from once per second to once per minute for better resource management. --- src/worker/events.rs | 15 +++++++++++---- src/worker/sql.rs | 18 +++++++++++++++++- src/worker/transport.rs | 4 ++-- 3 files changed, 30 insertions(+), 7 deletions(-) diff --git a/src/worker/events.rs b/src/worker/events.rs index b86f9b3..0727a00 100644 --- a/src/worker/events.rs +++ b/src/worker/events.rs @@ -432,9 +432,15 @@ impl EventsWorker { } } - // Globaler Skalierungsfaktor für Ereignisfrequenz (1.0 = unverändert). - // Setze auf 0.05, um Ereignisse auf 1/20 der ursprünglichen Häufigkeit zu reduzieren. - const EVENT_RATE_SCALE: f64 = 0.05; + // Globaler Skalierungsfaktor für Ereignisfrequenz. + // Default: 1.0 (unverändert). Optional per ENV `EVENT_RATE_SCALE` konfigurierbar. + fn event_rate_scale() -> f64 { + std::env::var("EVENT_RATE_SCALE") + .ok() + .and_then(|v| v.parse::().ok()) + .filter(|v| v.is_finite() && *v >= 0.0) + .unwrap_or(1.0) + } fn check_and_trigger_events_inner( pool: &ConnectionPool, @@ -443,11 +449,12 @@ impl EventsWorker { rng: &mut impl Rng, events: &[RandomEvent], ) -> Result<(), DbError> { + let rate_scale = Self::event_rate_scale(); // Prüfe jedes mögliche Ereignis for event in events { // Zufällige Prüfung basierend auf Wahrscheinlichkeit let roll = rng.gen_range(0.0..=1.0); - let effective_prob = event.probability_per_minute * Self::EVENT_RATE_SCALE; + let effective_prob = event.probability_per_minute * rate_scale; if roll < effective_prob { eprintln!( "[EventsWorker] Ereignis '{}' wurde ausgelöst (Wahrscheinlichkeit: {:.4}% -> skaliert {:.4}%)", diff --git a/src/worker/sql.rs b/src/worker/sql.rs index ae64145..272a4ec 100644 --- a/src/worker/sql.rs +++ b/src/worker/sql.rs @@ -228,7 +228,23 @@ SELECT FROM falukant_data.transport AS t JOIN falukant_data.vehicle AS v ON v.id = t.vehicle_id JOIN falukant_type.vehicle AS vt ON vt.id = v.vehicle_type_id -LEFT JOIN falukant_data.region_distance AS rd ON ((rd.source_region_id = t.source_region_id AND rd.target_region_id = t.target_region_id) OR (rd.source_region_id = t.target_region_id AND rd.target_region_id = t.source_region_id)) AND (rd.transport_mode = vt.transport_mode OR rd.transport_mode IS NULL) +LEFT JOIN LATERAL ( + SELECT rd.distance + FROM falukant_data.region_distance AS rd + WHERE ( + (rd.source_region_id = t.source_region_id AND rd.target_region_id = t.target_region_id) + OR (rd.source_region_id = t.target_region_id AND rd.target_region_id = t.source_region_id) + ) + AND ( + rd.transport_mode = vt.transport_mode + OR rd.transport_mode IS NULL + OR vt.transport_mode IS NULL + ) + ORDER BY + (rd.transport_mode = vt.transport_mode) DESC, + (rd.transport_mode IS NULL) DESC + LIMIT 1 +) AS rd ON TRUE LEFT JOIN falukant_data.branch AS b_target ON b_target.region_id = t.target_region_id AND b_target.falukant_user_id = v.falukant_user_id LEFT JOIN falukant_data.branch AS b_source ON b_source.region_id = t.source_region_id AND b_source.falukant_user_id = v.falukant_user_id WHERE ( diff --git a/src/worker/transport.rs b/src/worker/transport.rs index e0b7e70..c3c7741 100644 --- a/src/worker/transport.rs +++ b/src/worker/transport.rs @@ -51,8 +51,8 @@ impl TransportWorker { eprintln!("[TransportWorker] Fehler in process_arrived_transports: {err}"); } - // Einmal pro Sekunde prüfen - for _ in 0..1 { + // Minütlich prüfen (nicht sekündlich pollen) + for _ in 0..60 { if !state.running_worker.load(Ordering::Relaxed) { break; }