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