stabilized app

This commit is contained in:
Torsten Schulz
2025-07-21 14:59:43 +02:00
committed by Torsten (PC)
parent 51fd9fcd13
commit 1451225978
25 changed files with 3590 additions and 228 deletions

View File

@@ -0,0 +1,175 @@
#ifndef VALUERECALCULATIONWORKER_H
#define VALUERECALCULATIONWORKER_H
#include "worker.h"
#include <unordered_map>
#include <functional>
#include <chrono>
class ValueRecalculationWorker : public Worker {
public:
ValueRecalculationWorker(ConnectionPool &pool, MessageBroker &broker);
~ValueRecalculationWorker() override;
protected:
void run() override;
private:
struct Activity {
std::chrono::system_clock::time_point lastRun;
std::function<void()> callMethod;
std::chrono::system_clock::duration scheduledTime;
Activity(std::chrono::system_clock::time_point lr, std::function<void()> cm, std::chrono::system_clock::duration st)
: lastRun(lr), callMethod(std::move(cm)), scheduledTime(st) {}
};
std::unordered_map<std::string, Activity> activities;
void calculateProductKnowledge();
void calculateRegionalSellPrice();
void calculateMarriages();
void calculateStudying();
void calculateStudyingSelf(Database::FieldMap entry);
void caclulateStudyingForAssociatedCharacter(Database::FieldMap entry);
void calculateStudyingCharacter(int characterId, bool all, int productId, int falukantUserId);
bool shouldRunToday(const Activity& activity);
std::chrono::system_clock::time_point getNextScheduledTime(std::chrono::system_clock::duration scheduledDuration);
static constexpr const char *QUERY_UPDATE_PRODUCT_KNOWLEDGE_USER = R"(
UPDATE falukant_data.knowledge k
SET knowledge = LEAST(100, k.knowledge + 1)
FROM falukant_data."character" c
JOIN falukant_log.production p
ON DATE(p.production_timestamp) = CURRENT_DATE - INTERVAL '1 day'
WHERE c.id = k.character_id
AND c.user_id = 18
AND k.product_id = 10
)";
static constexpr const char *QUERY_DELETE_OLD_PRODUCTIONS = R"(
delete from falukant_log.production flp
where date(flp.production_timestamp) < CURRENT_DATE
)";
static constexpr const char *QUERY_GET_PRODUCERS_LAST_DAY = R"(
select p."producer_id"
from falukant_log.production p
where date(p."production_timestamp") = CURRENT_DATE - interval '1 day'
group by producer_id
)";
static constexpr const char *QUERY_UPDATE_REGION_SELL_PRICE = R"(
UPDATE falukant_data.town_product_worth tpw
SET worth_percent =
GREATEST(
0,
LEAST(
CASE
WHEN s.quantity > avg_sells THEN tpw.worth_percent - 1
WHEN s.quantity < avg_sells THEN tpw.worth_percent + 1
ELSE tpw.worth_percent
END,
100
)
)
FROM (
SELECT region_id, product_id, quantity,
(SELECT AVG(quantity)
FROM falukant_log.sell avs
WHERE avs.product_id = s.product_id) AS avg_sells
FROM falukant_log.sell s
WHERE DATE(s.sell_timestamp) = CURRENT_DATE - INTERVAL '1 day'
) s
WHERE tpw.region_id = s.region_id
AND tpw.product_id = s.product_id
)";
static constexpr const char *QUERY_DELETE_REGION_SELL_PRICE = R"(
delete from falukant_log.sell s
where date(s.sell_timestamp) < CURRENT_DATE
)";
static constexpr const char *QUERY_GET_SELL_REGIONS = R"(
select s."region_id"
from falukant_log.sell s
where date(s."sell_timestamp") = CURRENT_DATE - interval '1 day'
group by "region_id"
)";
static constexpr const char * QUERY_SET_MARRIAGES_BY_PARTY = R"(
WITH updated_relations AS (
UPDATE falukant_data.relationship AS rel
SET relationship_type_id = (
SELECT id
FROM falukant_type.relationship AS rt
WHERE rt.tr = 'married'
)
WHERE rel.id IN (
SELECT rel2.id
FROM falukant_data.party AS p
JOIN falukant_type.party AS pt
ON pt.id = p.party_type_id
AND pt.tr = 'wedding'
JOIN falukant_data.falukant_user AS fu
ON fu.id = p.falukant_user_id
JOIN falukant_data."character" AS c
ON c.user_id = fu.id
JOIN falukant_data.relationship AS rel2
ON rel2.character1_id = c.id
OR rel2.character2_id = c.id
JOIN falukant_type.relationship AS rt2
ON rt2.id = rel2.relationship_type_id
AND rt2.tr = 'engaged'
WHERE p.created_at <= NOW() - INTERVAL '1 day'
)
RETURNING character1_id, character2_id
)
SELECT
c1.user_id AS character1_user,
c2.user_id AS character2_user
FROM updated_relations AS ur
JOIN falukant_data."character" AS c1
ON c1.id = ur.character1_id
JOIN falukant_data."character" AS c2
ON c2.id = ur.character2_id;
)";
static constexpr const char * QUERY_GET_STUDYINGS_TO_EXECUTE = R"(
select l.id, l.associated_falukant_user_id, l.associated_learning_character_id, l.learn_all_products, l.learning_recipient_id, l.product_id,
lr.tr
from falukant_data.learning l
join falukant_type.learn_recipient lr
on lr.id = l.learning_recipient_id
where l.learning_is_executed = false
and l.created_at + interval '1 day' < now();
)";
static constexpr const char * QUERY_GET_OWN_CHARACTER_ID = R"(
select id
from falukant_data."character" c
where c.user_id = $1
)";
static constexpr const char *QUERY_INCREASE_ONE_PRODUCT_KNOWLEDGE = R"(
update falukant_data.knowledge k
set knowledge = LEAST(100, k.knowledge + $1)
where k.character_id = $2
and k.product_id = $3
)";
static constexpr const char *QUERY_INCREASE_ALL_PRODUCTS_KNOWLEDGE = R"(
update falukant_data.knowledge k
set knowledge = LEAST(100, k.knowledge + $1)
where k.character_id = $2
)";
static constexpr const char *QUERY_SET_LEARNING_DONE = R"(
update falukant_data.learning
set learning_is_executed = true
where id = $1
)";
};
#endif // VALUERECALCULATIONWORKER_H