Verbessere SQL-Abfragen im Produktionsworker: Optimiere die Abfrage für abgeschlossene Produktionen und verbessere die Lesbarkeit der Preisberechnung.
This commit is contained in:
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user