| 1 | -- =============================================================
|
|---|
| 2 | -- CityFix - perf_test_data.sql (фаза P9)
|
|---|
| 3 | -- Посебна шема perf со голем број синтетички податоци, само за
|
|---|
| 4 | -- анализа на перформансите. Шемата project не се менува.
|
|---|
| 5 | -- Табелите имаат иста структура, примарни клучеви и единствени
|
|---|
| 6 | -- ограничувања како во project (без тригери и надворешни клучеви,
|
|---|
| 7 | -- за побрзо генерирање).
|
|---|
| 8 | -- =============================================================
|
|---|
| 9 | SET client_min_messages TO warning;
|
|---|
| 10 | DROP SCHEMA IF EXISTS perf CASCADE;
|
|---|
| 11 | CREATE SCHEMA perf;
|
|---|
| 12 | SET search_path TO perf, project;
|
|---|
| 13 |
|
|---|
| 14 | CREATE TABLE admins (LIKE project.admins INCLUDING ALL);
|
|---|
| 15 | CREATE TABLE workers (LIKE project.workers INCLUDING ALL);
|
|---|
| 16 | CREATE TABLE citizens (LIKE project.citizens INCLUDING ALL);
|
|---|
| 17 | CREATE TABLE categories (LIKE project.categories INCLUDING ALL);
|
|---|
| 18 | CREATE TABLE reports (LIKE project.reports INCLUDING ALL);
|
|---|
| 19 | CREATE TABLE photos (LIKE project.photos INCLUDING ALL);
|
|---|
| 20 | CREATE TABLE status_logs (LIKE project.status_logs INCLUDING ALL);
|
|---|
| 21 | CREATE TABLE comments (LIKE project.comments INCLUDING ALL);
|
|---|
| 22 | CREATE TABLE assignments (LIKE project.assignments INCLUDING ALL);
|
|---|
| 23 |
|
|---|
| 24 | SELECT setseed(0.2026);
|
|---|
| 25 |
|
|---|
| 26 | INSERT INTO admins SELECT * FROM project.admins;
|
|---|
| 27 | INSERT INTO categories SELECT * FROM project.categories;
|
|---|
| 28 |
|
|---|
| 29 | INSERT INTO workers (worker_id, full_name, email, password)
|
|---|
| 30 | SELECT g, 'Работник ' || g, 'worker' || g || '@skopje.gov.mk', md5(g::text)
|
|---|
| 31 | FROM generate_series(1, 40) g;
|
|---|
| 32 |
|
|---|
| 33 | INSERT INTO citizens (citizen_id, full_name, email, phone, password)
|
|---|
| 34 | SELECT g, 'Граѓанин ' || g, 'citizen' || g || '@example.mk',
|
|---|
| 35 | CASE WHEN g % 3 = 0 THEN NULL ELSE '+3897' || lpad(g::text, 7, '0') END, md5(g::text)
|
|---|
| 36 | FROM generate_series(1, 5000) g;
|
|---|
| 37 |
|
|---|
| 38 | -- 100 000 пријави од 2021 до 2026; околу 4 % се сè уште отворени
|
|---|
| 39 | INSERT INTO reports (report_id, description, location_text, latitude, longitude,
|
|---|
| 40 | status, priority, created_at, citizen_id, category_id)
|
|---|
| 41 | SELECT g,
|
|---|
| 42 | 'Синтетичка пријава ' || g,
|
|---|
| 43 | CASE WHEN random() < 0.8 THEN 'Адреса ' || (g % 900) END,
|
|---|
| 44 | round((41.970 + random() * 0.050)::numeric, 6),
|
|---|
| 45 | round((21.350 + random() * 0.150)::numeric, 6),
|
|---|
| 46 | CASE WHEN x < 0.010 THEN 'submitted'
|
|---|
| 47 | WHEN x < 0.025 THEN 'received'
|
|---|
| 48 | WHEN x < 0.040 THEN 'in_progress'
|
|---|
| 49 | WHEN x < 0.110 THEN 'rejected'
|
|---|
| 50 | ELSE 'resolved' END,
|
|---|
| 51 | (ARRAY['low', 'medium', 'high', 'urgent'])[1 + floor(random() * 4)::int],
|
|---|
| 52 | TIMESTAMP '2021-01-01' + random() * (TIMESTAMP '2026-09-01' - TIMESTAMP '2021-01-01'),
|
|---|
| 53 | 1 + floor(random() * 5000)::int,
|
|---|
| 54 | 1 + floor(random() * 6)::int
|
|---|
| 55 | FROM (SELECT g, random() AS x FROM generate_series(1, 100000) g) s;
|
|---|
| 56 |
|
|---|
| 57 | -- доделување за секоја пријава која не е само поднесена
|
|---|
| 58 | INSERT INTO assignments (assignment_id, assigned_at, note, admin_id, report_id, worker_id)
|
|---|
| 59 | SELECT r.report_id, r.created_at + interval '2 hours', NULL,
|
|---|
| 60 | 1 + (r.report_id % 2), r.report_id, 1 + ((r.category_id * 7 + r.report_id) % 40)
|
|---|
| 61 | FROM reports r
|
|---|
| 62 | WHERE r.status <> 'submitted';
|
|---|
| 63 |
|
|---|
| 64 | -- историја на статуси според конечниот статус
|
|---|
| 65 | INSERT INTO status_logs (status, changed_at, note, report_id, worker_id)
|
|---|
| 66 | SELECT s.status, r.created_at + s.offs, NULL, r.report_id,
|
|---|
| 67 | CASE WHEN s.status = 'submitted' THEN NULL ELSE a.worker_id END
|
|---|
| 68 | FROM reports r
|
|---|
| 69 | LEFT JOIN assignments a ON a.report_id = r.report_id
|
|---|
| 70 | CROSS JOIN LATERAL (VALUES
|
|---|
| 71 | ('submitted', interval '0', 0),
|
|---|
| 72 | ('received', interval '3 hours', 1),
|
|---|
| 73 | ('in_progress', interval '1 day', 2),
|
|---|
| 74 | ('resolved', interval '1 day' * (2 + r.report_id % 9), 3),
|
|---|
| 75 | ('rejected', interval '5 hours', 9)) AS s(status, offs, step)
|
|---|
| 76 | WHERE s.step = 0
|
|---|
| 77 | OR (r.status = 'received' AND s.step <= 1)
|
|---|
| 78 | OR (r.status = 'in_progress' AND s.step <= 2)
|
|---|
| 79 | OR (r.status = 'resolved' AND s.step <= 3)
|
|---|
| 80 | OR (r.status = 'rejected' AND (s.step <= 1 OR s.step = 9));
|
|---|
| 81 |
|
|---|
| 82 | INSERT INTO comments (content, created_at, report_id, worker_id)
|
|---|
| 83 | SELECT 'Коментар за напредокот', a.assigned_at + interval '6 hours', a.report_id, a.worker_id
|
|---|
| 84 | FROM assignments a
|
|---|
| 85 | WHERE a.report_id % 2 = 0;
|
|---|
| 86 |
|
|---|
| 87 | INSERT INTO photos (image_url, report_id)
|
|---|
| 88 | SELECT '/uploads/reports/' || r.report_id || '/photo_' || n || '.jpg', r.report_id
|
|---|
| 89 | FROM reports r
|
|---|
| 90 | CROSS JOIN generate_series(1, 2) n
|
|---|
| 91 | WHERE n <= r.report_id % 3;
|
|---|
| 92 |
|
|---|
| 93 | SELECT setval(pg_get_serial_sequence('perf.status_logs', 'log_id'), (SELECT MAX(log_id) FROM perf.status_logs));
|
|---|
| 94 | SELECT setval(pg_get_serial_sequence('perf.comments', 'comment_id'), (SELECT MAX(comment_id) FROM perf.comments));
|
|---|
| 95 | SELECT setval(pg_get_serial_sequence('perf.photos', 'photo_id'), (SELECT MAX(photo_id) FROM perf.photos));
|
|---|
| 96 |
|
|---|
| 97 | ANALYZE admins, workers, citizens, categories, reports, photos, status_logs, comments, assignments;
|
|---|