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:
@@ -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}%)",
|
||||
|
||||
@@ -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 (
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user