Changes between Version 4 and Version 5 of DmlScript


Ignore:
Timestamp:
05/04/26 14:04:06 (3 weeks ago)
Author:
231141
Comment:

--

Legend:

Unmodified
Added
Removed
Modified
  • DmlScript

    v4 v5  
    857857$$ LANGUAGE plpgsql;
    858858
    859    
     859
     860--++++++++++ notification type +++++++++++
     861 
     862INSERT INTO NotificationType (name, description)
     863VALUES
     864    ('New Task Created',      'Triggered when a new task is created and awaiting offers.'),
     865    ('Task Accepted',         'Triggered when a task is accepted by a worker.'),
     866    ('Task Started',          'Triggered when a worker begins a task.'),
     867    ('Task Completed',        'Triggered when a task is marked complete.'),
     868    ('Task Cancelled',        'Triggered when a task is cancelled.'),
     869    ('Offer Received',        'Triggered when a new offer is submitted on a task.'),
     870    ('Offer Accepted',        'Triggered when an offer is accepted by the client.'),
     871    ('Offer Rejected',        'Triggered when an offer is rejected.'),
     872    ('Offer Expired',         'Triggered when an offer expires without a response.'),
     873    ('Payment Pending',       'Triggered when a payment is being processed.'),
     874    ('Payment Successful',    'Triggered when a payment completes successfully.'),
     875    ('Payment Failed',        'Triggered when a payment attempt fails.'),
     876    ('Review Received',       'Triggered when a user receives a new review.'),
     877    ('Complaint Opened',      'Triggered when a complaint is filed.'),
     878    ('Complaint Resolved',    'Triggered when a complaint is resolved.'),
     879    ('Complaint Dismissed',   'Triggered when a complaint is dismissed.'),
     880    ('Message Received',      'Triggered when a new message is received.'),
     881    ('Badge Earned',          'Triggered when a worker earns a new badge.'),
     882    ('Profile Viewed',        'Triggered when a user profile is viewed.'),
     883    ('System Announcement',   'General system-wide announcements.');
     884
     885
     886
     887
     888
     889DO $$
     890DECLARE
     891    batch_size  INT := 100000;
     892    total_rows  INT := 1000000;
     893    offset_val  INT := 0;
     894
     895    task_ids    INT[];
     896    client_ids  INT[];
     897    worker_ids  INT[];
     898BEGIN
     899    -- Load matched task/client/worker combos from the actual join chain
     900    SELECT
     901        array_agg(t.id),
     902        array_agg(tr.client_id),
     903        array_agg(o.worker_id)
     904    INTO task_ids, client_ids, worker_ids
     905    FROM Task         t
     906    JOIN Offer        o  ON o.id          = t.offer_id
     907    JOIN TaskRequest  tr ON tr.id         = o.task_request_id;
     908
     909    WHILE offset_val < total_rows LOOP
     910        INSERT INTO Complaint
     911            (reason, description, status, created_at, updated_at,
     912             task_id, client_id, worker_id)
     913        SELECT
     914            CASE
     915                WHEN is_worker_complaint THEN
     916                    CASE floor(random() * 6)::INT
     917                        WHEN 0 THEN 'Client: Payment not made as agreed'
     918                        WHEN 1 THEN 'Client: Unsafe or hazardous work conditions'
     919                        WHEN 2 THEN 'Client: Abusive or threatening behaviour'
     920                        WHEN 3 THEN 'Client: Scope creep beyond agreed terms'
     921                        WHEN 4 THEN 'Client: Access denied to work site'
     922                        ELSE        'Client: False damage claim'
     923                    END
     924                ELSE
     925                    CASE floor(random() * 6)::INT
     926                        WHEN 0 THEN 'Worker: Work not completed as agreed'
     927                        WHEN 1 THEN 'Worker: Poor quality of service'
     928                        WHEN 2 THEN 'Worker: No-show or late arrival'
     929                        WHEN 3 THEN 'Worker: Unprofessional behaviour'
     930                        WHEN 4 THEN 'Worker: Overcharged or billing dispute'
     931                        ELSE        'Worker: Damaged property or belongings'
     932                    END
     933            END                                                                  AS reason,
     934
     935            CASE
     936                WHEN is_worker_complaint THEN
     937                    CASE floor(random() * 4)::INT
     938                        WHEN 0 THEN 'The client did not fulfil the agreed payment terms.'
     939                        WHEN 1 THEN 'The client created conditions that made work impossible.'
     940                        WHEN 2 THEN 'The client behaved in an abusive or threatening manner.'
     941                        ELSE        NULL
     942                    END
     943                ELSE
     944                    CASE floor(random() * 4)::INT
     945                        WHEN 0 THEN 'The worker did not follow the agreed specifications.'
     946                        WHEN 1 THEN 'The quality of the delivered work was unsatisfactory.'
     947                        WHEN 2 THEN 'The worker arrived significantly late without notice.'
     948                        ELSE        NULL
     949                    END
     950            END                                                                  AS description,
     951
     952            CASE floor(random() * 3)::INT
     953                WHEN 0 THEN 'OPEN'
     954                WHEN 1 THEN 'RESOLVED'
     955                ELSE        'DISMISSED'
     956            END                                                                  AS status,
     957
     958            created_ts                                                           AS created_at,
     959
     960            CASE WHEN floor(random() * 3)::INT > 0
     961                     THEN created_ts + (random() * INTERVAL '30 days')
     962                 ELSE NULL
     963            END                                                                  AS updated_at,
     964
     965            task_ids  [idx]                                                      AS task_id,
     966            client_ids[idx]                                                      AS client_id,
     967            worker_ids[idx]                                                      AS worker_id
     968
     969        FROM (
     970            SELECT
     971                i,
     972                '2017-01-15 19:44:09.798'::TIMESTAMP
     973                    + random() * ('2026-04-29 23:45:45.249'::TIMESTAMP - '2017-01-15 19:44:09.798'::TIMESTAMP) AS created_ts,
     974                random() < 0.5                                                                                  AS is_worker_complaint,
     975                1 + floor(random() * array_length(task_ids, 1))::INT                                           AS idx
     976            FROM generate_series(offset_val + 1, offset_val + batch_size) AS i
     977        ) sub;
     978
     979        offset_val := offset_val + batch_size;
     980        RAISE NOTICE 'Inserted % / % rows', offset_val, total_rows;
     981    END LOOP;
     982END;
     983$$;
     984
     985
     986--++++++++++ compalaints +++++++++++
     987CREATE TEMP TABLE complaints_ordered AS
     988SELECT
     989    c.id AS cid,
     990    cl.user_id AS client_user_id,
     991    w.user_id AS worker_user_id,
     992    random() AS rnd
     993FROM Complaint c
     994JOIN Task t ON t.id = c.task_id
     995JOIN Offer o ON o.id = t.offer_id
     996JOIN TaskRequest tr ON tr.id = o.task_request_id
     997JOIN Client cl ON cl.id = tr.client_id AND cl.id = c.client_id
     998JOIN Worker w ON w.id = o.worker_id AND w.id = c.worker_id;
     999
     1000CREATE INDEX ON complaints_ordered (rnd);
     1001
     1002INSERT INTO ComplaintAttachment (file_url, description, complaint_id, user_id)
     1003SELECT
     1004    'https://storage.example.com/complaints/'
     1005        || cid || '/'
     1006        || md5(random()::TEXT) || '.'
     1007        || CASE floor(random() * 4)::INT
     1008               WHEN 0 THEN 'jpg'
     1009               WHEN 1 THEN 'png'
     1010               WHEN 2 THEN 'pdf'
     1011               ELSE 'mp4'
     1012           END AS file_url,
     1013    CASE floor(random() * 3)::INT
     1014        WHEN 0 THEN 'Photo evidence of the issue'
     1015        WHEN 1 THEN 'Screenshot of conversation'
     1016        ELSE NULL
     1017    END AS description,
     1018    cid AS complaint_id,
     1019    CASE WHEN random() < 0.5 THEN client_user_id ELSE worker_user_id END AS user_id
     1020FROM complaints_ordered
     1021ORDER BY rnd
     1022LIMIT 2000000;  -- Your total desired rows
     1023
     1024DROP TABLE IF EXISTS complaints_ordered;
     1025
     1026
     1027--++++++++++ payments +++++++++++
     1028CREATE TEMP TABLE payments_base AS
     1029SELECT
     1030    t.id         AS task_id,
     1031    tr.client_id,
     1032    o.worker_id,
     1033    row_number() OVER (ORDER BY random()) AS rn
     1034FROM Task        t
     1035JOIN Offer       o  ON o.id  = t.offer_id
     1036JOIN TaskRequest tr ON tr.id = o.task_request_id
     1037CROSS JOIN generate_series(1, 10) AS multiplier
     1038LIMIT 10000000;
     1039
     1040
     1041truncate table Payment restart identity cascade;
     1042
     1043DO $$
     1044DECLARE
     1045    batch_size INT := 500000;
     1046    max_rn     INT := (SELECT MAX(rn) FROM payments_base);
     1047    curr_rn    INT := 1;
     1048BEGIN
     1049    WHILE curr_rn <= max_rn LOOP
     1050        INSERT INTO Payment
     1051            (amount, payment_method, status,
     1052             task_id, client_id, worker_id, created_at, updated_at)
     1053        SELECT
     1054            (floor(random() * 99000) + 1000)::INT                           AS amount,
     1055
     1056            CASE floor(random() * 3)::INT
     1057                WHEN 0 THEN 'CARD'
     1058                WHEN 1 THEN 'PAYPAL'
     1059                ELSE        'CASH'
     1060            END                                                              AS payment_method,
     1061
     1062            CASE floor(random() * 10)::INT
     1063                WHEN 0 THEN 'FAILED'
     1064                WHEN 1 THEN 'PENDING'
     1065                ELSE        'PAID'
     1066            END                                                              AS status,
     1067
     1068            pb.task_id,
     1069            pb.client_id,
     1070            pb.worker_id,
     1071
     1072            created_ts                                                       AS created_at,
     1073
     1074            CASE WHEN random() > 0.2
     1075                     THEN LEAST(created_ts + (random() * INTERVAL '30 days'), NOW())
     1076                 ELSE NULL
     1077            END                                                              AS updated_at
     1078
     1079        FROM payments_base pb
     1080        CROSS JOIN LATERAL (
     1081            SELECT '2017-01-15 19:44:09.798'::TIMESTAMP
     1082                + random() * ('2026-04-29 23:45:45.249'::TIMESTAMP - '2017-01-15 19:44:09.798'::TIMESTAMP) AS created_ts
     1083        ) ts
     1084        WHERE pb.rn BETWEEN curr_rn AND curr_rn + batch_size - 1;
     1085
     1086        curr_rn := curr_rn + batch_size;
     1087        RAISE NOTICE 'Inserted up to row % / %', curr_rn - 1, max_rn;
     1088    END LOOP;
     1089END;
     1090$$;
     1091
     1092DROP TABLE payments_base;
     1093
    8601094
    8611095}}}