From ce06b1a4f0b2d851fef9d6e315ad3a0bb48d159a Mon Sep 17 00:00:00 2001 From: "Torsten Schulz (local)" Date: Sat, 13 Dec 2025 12:17:00 +0100 Subject: [PATCH] =?UTF-8?q?Verbessere=20SQL-Abfragen=20im=20Produktionswor?= =?UTF-8?q?ker:=20Optimiere=20die=20Abfrage=20f=C3=BCr=20abgeschlossene=20?= =?UTF-8?q?Produktionen=20und=20verbessere=20die=20Lesbarkeit=20der=20Prei?= =?UTF-8?q?sberechnung.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/worker/sql.rs | 113 ++++++++++++++++++++-------------------------- 1 file changed, 49 insertions(+), 64 deletions(-) diff --git a/src/worker/sql.rs b/src/worker/sql.rs index 9a5c827..4a7f5b9 100644 --- a/src/worker/sql.rs +++ b/src/worker/sql.rs @@ -8,6 +8,7 @@ pub const QUERY_GET_MONEY: &str = r#" SELECT money FROM falukant_data.falukant_user WHERE id = $1; "#; + pub const QUERY_GET_RANDOM_USER: &str = r#" SELECT id FROM falukant_data.falukant_user ORDER BY RANDOM() LIMIT 1; "#; @@ -1353,64 +1354,48 @@ WHERE b.falukant_user_id = $1 AND s.stock_type_id = $2; "#; // Produce worker queries pub const QUERY_GET_FINISHED_PRODUCTIONS: &str = r#" - SELECT - p.id AS production_id, - p.branch_id, - p.product_id, - p.quantity, - p.start_timestamp, - pr.production_time, - -- Aggregierte Qualitätsbewertung pro Produktion inkl. Wettereinfluss - MAX( - GREATEST( - 0, - LEAST( - 100, - MAX( + SELECT + p.id AS production_id, + p.branch_id, + p.product_id, + p.quantity, + p.start_timestamp, + pr.production_time, + br.region_id, + br.falukant_user_id, + ROUND( GREATEST( - 0, - LEAST( - 100, - ROUND( - ( - COALESCE(k.knowledge, 0) + COALESCE(k2.knowledge, 0) - )::numeric - + COALESCE(pwe.quality_effect, 0) * 2.5 + 0, + LEAST( + 100, + ( + COALESCE(k.knowledge, 0) * 0.6 + + COALESCE(k2.knowledge, 0) * 0.3 + + COALESCE(pwe.worth_percent, 100) * 0.1 + ) ) - ) - )::int - ) AS quality, - JOIN falukant_type.product pr - ON p.product_id = pr.id - JOIN falukant_data.branch br - ON p.branch_id = br.id - JOIN falukant_data.character c - ON c.user_id = br.falukant_user_id - JOIN falukant_data.knowledge k - ON p.product_id = k.product_id - AND k.character_id = c.id - JOIN falukant_data.stock s - ON s.branch_id = br.id - -- Optionaler Wettereinfluss: pro (Produkt, Wetter) genau ein Datensatz - LEFT JOIN falukant_type.product_weather_effect pwe - ON pwe.product_id = p.product_id - AND pwe.weather_type_id = p.weather_type_id - LEFT JOIN falukant_data.director d - ON d.employer_user_id = c.user_id - LEFT JOIN falukant_data.knowledge k2 - ON k2.character_id = d.director_character_id - AND k2.product_id = p.product_id - WHERE p.start_timestamp + INTERVAL '1 minute' * pr.production_time <= NOW() - GROUP BY - p.id, - p.branch_id, - p.product_id, - p.quantity, - p.start_timestamp, - pr.production_time, - br.region_id, - br.falukant_user_id - ORDER BY p.start_timestamp; + ) + )::int AS quality + FROM falukant_data.production p + JOIN falukant_type.product pr + ON p.product_id = pr.id + JOIN falukant_data.branch br + ON p.branch_id = br.id + JOIN falukant_data.character c + ON c.user_id = br.falukant_user_id + JOIN falukant_data.knowledge k + ON p.product_id = k.product_id + AND k.character_id = c.id + LEFT JOIN falukant_data.director d + ON d.employer_user_id = c.user_id + LEFT JOIN falukant_data.knowledge k2 + ON k2.character_id = d.director_character_id + AND k2.product_id = p.product_id + LEFT JOIN falukant_type.product_weather_effect pwe + ON pwe.product_id = p.product_id + AND pwe.weather_type_id = p.weather_type_id + WHERE p.start_timestamp + INTERVAL '1 minute' * pr.production_time <= NOW() + ORDER BY p.start_timestamp; "#; pub const QUERY_DELETE_PRODUCTION: &str = r#" @@ -1587,10 +1572,10 @@ pub const QUERY_HOURLY_PRICE_RECALCULATION: &str = r#" COALESCE(prs.avg_sold, 0) AS parent_avg, acwp.price_after_world AS current_price, CASE - WHEN acwp.total_sold > COALESCE(prs.avg_sold, 0) * 1.05 - THEN acwp.price_after_world * 1.05 - WHEN acwp.total_sold < COALESCE(prs.avg_sold, 0) * 0.95 - THEN acwp.price_after_world * 0.95 + WHEN acwp.total_sold > COALESCE(prs.avg_sold, 0) * 1.05 + THEN acwp.price_after_world * 1.05 + WHEN acwp.total_sold < COALESCE(prs.avg_sold, 0) * 0.95 + THEN acwp.price_after_world * 0.95 ELSE acwp.price_after_world END AS new_price FROM all_cities_with_prices acwp @@ -1598,10 +1583,10 @@ pub const QUERY_HOURLY_PRICE_RECALCULATION: &str = r#" ON prs.parent_region_id = acwp.parent_region_id AND prs.product_id = acwp.product_id WHERE acwp.parent_region_id IS NOT NULL - AND ( - acwp.total_sold > COALESCE(prs.avg_sold, 0) * 1.05 - OR acwp.total_sold < COALESCE(prs.avg_sold, 0) * 0.95 - ) + AND ( + acwp.total_sold > COALESCE(prs.avg_sold, 0) * 1.05 + OR acwp.total_sold < COALESCE(prs.avg_sold, 0) * 0.95 + ) ), final_price_updates AS ( SELECT