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.

This commit is contained in:
Torsten Schulz (local)
2025-12-20 22:20:29 +01:00
parent cd1b33a474
commit 833202344b
3 changed files with 30 additions and 7 deletions

View File

@@ -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::<f64>().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}%)",

View File

@@ -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 (

View File

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