Untitled

 avatar
unknown
pgsql
25 days ago
9.9 kB
3
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