Refactor WeatherWorker SQL query: Replace the existing weather update logic with a new query that assigns random weather types to each region, ensuring individual updates. Clean up logging messages for clarity.

This commit is contained in:
Torsten Schulz (local)
2025-12-18 15:34:16 +01:00
parent 6d12c70d84
commit f7710b64c9
3 changed files with 30 additions and 11 deletions

View File

@@ -97,7 +97,6 @@ impl BaseWorker {
} }
let state = Arc::clone(&self.state); let state = Arc::clone(&self.state);
let name = self.name.clone();
self.watchdog_thread = Some(thread::spawn(move || { self.watchdog_thread = Some(thread::spawn(move || {
while state.running_watchdog.load(Ordering::Relaxed) { while state.running_watchdog.load(Ordering::Relaxed) {

View File

@@ -257,11 +257,6 @@ pub const QUERY_DELETE_TRANSPORT: &str = r#"
DELETE FROM falukant_data.transport WHERE id = $1; DELETE FROM falukant_data.transport WHERE id = $1;
"#; "#;
pub const QUERY_ADD_TRANSPORT_WAITING_NOTIFICATION: &str = r#"
INSERT INTO falukant_log.notification (user_id, tr, shown, created_at, updated_at)
VALUES ((SELECT c.user_id FROM falukant_data.character c WHERE c.user_id = $1 LIMIT 1), $2, FALSE, NOW(), NOW());
"#;
pub const QUERY_UPDATE_TRANSPORT_SIZE: &str = r#" pub const QUERY_UPDATE_TRANSPORT_SIZE: &str = r#"
UPDATE falukant_data.transport UPDATE falukant_data.transport
SET size = $2, SET size = $2,

View File

@@ -5,13 +5,38 @@ use std::sync::Arc;
use std::time::{Duration, Instant}; use std::time::{Duration, Instant};
use super::base::{BaseWorker, Worker, WorkerState}; use super::base::{BaseWorker, Worker, WorkerState};
use crate::worker::sql::QUERY_UPDATE_WEATHER;
pub struct WeatherWorker { pub struct WeatherWorker {
base: BaseWorker, base: BaseWorker,
} }
// Reuse QUERY_UPDATE_WEATHER from centralized SQL module // Query zum Aktualisieren des Wetters für alle Regionen
// Wählt für jede Region ein zufälliges Wetter aus allen verfügbaren Wettertypen aus
// Wichtig: Jede Region bekommt ein individuelles, zufälliges Wetter
const QUERY_UPDATE_WEATHER: &str = r#"
WITH all_regions AS (
SELECT DISTINCT r.id AS region_id
FROM falukant_data.region r
JOIN falukant_type.region tr ON r.region_type_id = tr.id
WHERE tr.label_tr = 'city'
),
random_weather AS (
SELECT
ar.region_id,
(
SELECT wt.id
FROM falukant_type.weather wt
ORDER BY RANDOM()
LIMIT 1
) AS weather_type_id
FROM all_regions ar
)
INSERT INTO falukant_data.weather (region_id, weather_type_id)
SELECT rw.region_id, rw.weather_type_id
FROM random_weather rw
ON CONFLICT (region_id)
DO UPDATE SET weather_type_id = EXCLUDED.weather_type_id;
"#;
impl WeatherWorker { impl WeatherWorker {
pub fn new(pool: ConnectionPool, broker: MessageBroker) -> Self { pub fn new(pool: ConnectionPool, broker: MessageBroker) -> Self {
@@ -63,17 +88,17 @@ impl WeatherWorker {
.get() .get()
.map_err(|e| DbError::new(format!("DB-Verbindung fehlgeschlagen: {e}")))?; .map_err(|e| DbError::new(format!("DB-Verbindung fehlgeschlagen: {e}")))?;
// Run the prepared SQL that uses per-row RANDOM() trick
conn.prepare("update_weather", QUERY_UPDATE_WEATHER)?; conn.prepare("update_weather", QUERY_UPDATE_WEATHER)?;
let updated_rows = conn.execute("update_weather", &[])?; let updated_rows = conn.execute("update_weather", &[])?;
eprintln!( eprintln!(
"[WeatherWorker] Wetter aktualisiert (per-row random). {} Regionen betroffen.", "[WeatherWorker] Wetter aktualisiert. {} Regionen betroffen.",
updated_rows.len() updated_rows.len()
); );
// Benachrichtige alle Clients über Wetteränderungen // Benachrichtige alle Clients über Wetteränderungen
broker.publish("{\"event\":\"weather_updated\"}".to_string()); let message = r#"{"event":"weather_updated"}"#;
broker.publish(message.to_string());
Ok(()) Ok(())
} }