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; }