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:
@@ -97,7 +97,6 @@ impl BaseWorker {
|
||||
}
|
||||
|
||||
let state = Arc::clone(&self.state);
|
||||
let name = self.name.clone();
|
||||
|
||||
self.watchdog_thread = Some(thread::spawn(move || {
|
||||
while state.running_watchdog.load(Ordering::Relaxed) {
|
||||
|
||||
@@ -257,11 +257,6 @@ pub const QUERY_DELETE_TRANSPORT: &str = r#"
|
||||
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#"
|
||||
UPDATE falukant_data.transport
|
||||
SET size = $2,
|
||||
|
||||
@@ -5,13 +5,38 @@ use std::sync::Arc;
|
||||
use std::time::{Duration, Instant};
|
||||
|
||||
use super::base::{BaseWorker, Worker, WorkerState};
|
||||
use crate::worker::sql::QUERY_UPDATE_WEATHER;
|
||||
|
||||
pub struct WeatherWorker {
|
||||
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 {
|
||||
pub fn new(pool: ConnectionPool, broker: MessageBroker) -> Self {
|
||||
@@ -63,17 +88,17 @@ impl WeatherWorker {
|
||||
.get()
|
||||
.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)?;
|
||||
let updated_rows = conn.execute("update_weather", &[])?;
|
||||
|
||||
eprintln!(
|
||||
"[WeatherWorker] Wetter aktualisiert (per-row random). {} Regionen betroffen.",
|
||||
"[WeatherWorker] Wetter aktualisiert. {} Regionen betroffen.",
|
||||
updated_rows.len()
|
||||
);
|
||||
|
||||
// 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(())
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user