Untitled
unknown
pgsql
9 months ago
9.9 kB
5
Indexable
-- Для получения корректных результатов нужно проставить значения в переменных ниже
DO
$$
DECLARE
--Базовые настройки
month_count INTEGER := 4; -- Количество месяцев в прошлом, для которых будут сгенерированы записи
rows_needed INTEGER := 10; -- Количество записей, которые добавятся в месяц
currency_code VARCHAR := 'USD'; -- Валюта, в которой будут записи
ref_hall_id VARCHAR := 'cc65b3f8-e1aa-4eef-9502-1fd3f7435984'; -- ID холла
v_event_payloads JSONB := jsonb_build_object(
'Deposit', '',
'FirstDeposit', '',
'GameSessionEnd', '',
'SbWin', '',
'SbLose', '',
'Withdraw', ''
); --Типы событий. Можно добавлять или исключать ненужные
game_type_ids INTEGER[] := ARRAY [1,2,3]; -- ID типов игр для игровых событий. Могут быть пустыми
--Игровые сессии
min_gs_start_amount FLOAT := 10.0; -- Минимальное стартовое значение для игровой сессии
max_gs_start_amount FLOAT := 1000.0; -- Максимальное стартовое значение для игровой сессии
min_gs_end_amount FLOAT := 0.0; -- Минимальное конечное значение для игровой сессии
max_gs_end_amount FLOAT := 500.0; -- Максимальное конечное значение для игровой сессии
min_rm_tb_amount FLOAT := 10.0; -- Минимальное значение в real_money.total_bet для игровой сессии
max_rm_tb_amount FLOAT := 100.0; -- Максимальное значение в real_money.total_bet для игровой сессии
--Спортсбук
min_sb_amount FLOAT := 10.0; -- Минимальное значение для спортсбука
max_sb_amount FLOAT := 1000.0; -- Максимальное значение для спортсбука
min_sb_total_bet_amount FLOAT := 0.0; -- Минимальное значение total bet для спортсбука
max_sb_total_bet_amount FLOAT := 500.0; -- Максимальное значение total bet для спортсбука
--Вывод
min_wr_amount FLOAT := 10.0; -- Минимальное значение для запроса на вывод
max_wr_amount FLOAT := 200.0; -- Минимальное значение для запроса на вывод
--Служебные переменные. Менять значения не требуется
cur_date TIMESTAMP;
month_iterator INTEGER;
v_event_type VARCHAR;
event_payload JSONB;
row_iterator INTEGER;
BEGIN
FOR month_iterator IN 1..month_count
LOOP
cur_date := NOW() - INTERVAL '1 MONTH' * (month_iterator - 1);
FOR row_iterator IN 1..rows_needed
LOOP
WITH cte AS (SELECT jsonb_object_keys(v_event_payloads) as cte_event_type,
row_number() over () as rn
FROM (SELECT v_event_payloads) AS v(event_payloads))
SELECT cte_event_type INTO v_event_type FROM cte ORDER BY random() LIMIT 1;
event_payload := v_event_payloads -> v_event_type;
IF v_event_type IN ('Deposit', 'FirstDeposit', 'Withdraw') THEN
event_payload := '[]';
END IF;
IF v_event_type = 'GameSessionEnd' THEN
event_payload := jsonb_build_object(
'startAmount',
min_gs_start_amount + (RANDOM() * (max_gs_start_amount - min_gs_start_amount)),
'endAmount',
min_gs_end_amount + (RANDOM() * (max_gs_end_amount - min_gs_end_amount)),
'realMoney',
jsonb_build_object(
'totalBet',
min_rm_tb_amount + (RANDOM() * (max_rm_tb_amount - min_rm_tb_amount))
),
'gameTypeId',
CASE
WHEN game_type_ids IS NOT NULL AND array_length(game_type_ids, 1) > 0
THEN game_type_ids[array_lower(game_type_ids, 1) + floor(random() *
(array_upper(game_type_ids, 1) - array_lower(game_type_ids, 1) + 1))]
ELSE NULL END
);
END IF;
IF v_event_type = 'SbWin' THEN
event_payload := jsonb_build_object(
'betslipId',
ceil(RANDOM() * 1000),
'playerId',
md5(random()::text || clock_timestamp()::text)::uuid,
'type',
'SbWin',
'amount',
min_sb_amount + (RANDOM() * (max_sb_amount - min_sb_amount)),
'totalBetAmount', min_sb_total_bet_amount +
(RANDOM() * (max_sb_total_bet_amount - min_sb_total_bet_amount))
);
END IF;
IF v_event_type = 'SbLose' THEN
event_payload := jsonb_build_object(
'betslipId',
ceil(RANDOM() * 1000),
'playerId',
md5(random()::text || clock_timestamp()::text)::uuid,
'type',
'SbLose',
'amount',
min_sb_amount + (RANDOM() * (max_sb_amount - min_sb_amount)),
'totalBetAmount', min_sb_total_bet_amount +
(RANDOM() * (max_sb_total_bet_amount - min_sb_total_bet_amount))
);
END IF;
INSERT INTO event_2(id, hall_id, player_id, created_at, event_type, event_id, amount,
currency_code,
payload,
event_date_time, updated_at)
SELECT md5(random()::text || clock_timestamp()::text)::uuid,
ref_hall_id::uuid,
(SELECT player_id FROM referral_player
WHERE referral_player.parent IS NOT NULL
AND referral_player.hall_id = ref_hall_id::uuid
ORDER BY RANDOM()
LIMIT 1),
cur_date,
v_event_type,
SUBSTRING(
MD5(RANDOM()::text) || MD5(RANDOM()::text) || MD5(RANDOM()::text) ||
MD5(RANDOM()::text)
FROM 1 FOR 64),
(RANDOM() * 1000):: float,
currency_code,
event_payload,
cur_date - ((random() * 30) * interval '1 day'),
cur_date;
INSERT INTO withdraw_request_2 (id, affiliate_player_id, hall_id, amount, status, updated_at, created_at, currency)
SELECT md5(random()::text || clock_timestamp()::text)::uuid,
(SELECT id FROM referral_player
WHERE referral_player.parent IS NULL
AND referral_player.hall_id = ref_hall_id::uuid
ORDER BY RANDOM()
LIMIT 1),
ref_hall_id::uuid,
ABS(min_wr_amount + (RANDOM() * (max_wr_amount - min_wr_amount))),
(ARRAY ['success', 'error', 'error'])[ceil(random() * 3)],
cur_date - ((random() * 30) * interval '1 day'),
cur_date - ((random() * 30) * interval '1 day'),
currency_code;
END LOOP;
END LOOP;
END
$$;
(SELECT player_id FROM referral_player
WHERE referral_player.parent IS NULL
AND referral_player.hall_id = 'cc65b3f8-e1aa-4eef-9502-1fd3f7435984'
ORDER BY RANDOM()
LIMIT 1)Editor is loading...
Leave a Comment