OtherTopics: perf_test_data.sql

File perf_test_data.sql, 5.0 KB (added by 183164, 12 days ago)
Line 
1-- =============================================================
2-- CityFix - perf_test_data.sql (фаза P9)
3-- Посебна шема perf со голем број синтетички податоци, само за
4-- анализа на перформансите. Шемата project не се менува.
5-- Табелите имаат иста структура, примарни клучеви и единствени
6-- ограничувања како во project (без тригери и надворешни клучеви,
7-- за побрзо генерирање).
8-- =============================================================
9SET client_min_messages TO warning;
10DROP SCHEMA IF EXISTS perf CASCADE;
11CREATE SCHEMA perf;
12SET search_path TO perf, project;
13
14CREATE TABLE admins (LIKE project.admins INCLUDING ALL);
15CREATE TABLE workers (LIKE project.workers INCLUDING ALL);
16CREATE TABLE citizens (LIKE project.citizens INCLUDING ALL);
17CREATE TABLE categories (LIKE project.categories INCLUDING ALL);
18CREATE TABLE reports (LIKE project.reports INCLUDING ALL);
19CREATE TABLE photos (LIKE project.photos INCLUDING ALL);
20CREATE TABLE status_logs (LIKE project.status_logs INCLUDING ALL);
21CREATE TABLE comments (LIKE project.comments INCLUDING ALL);
22CREATE TABLE assignments (LIKE project.assignments INCLUDING ALL);
23
24SELECT setseed(0.2026);
25
26INSERT INTO admins SELECT * FROM project.admins;
27INSERT INTO categories SELECT * FROM project.categories;
28
29INSERT INTO workers (worker_id, full_name, email, password)
30SELECT g, 'Работник ' || g, 'worker' || g || '@skopje.gov.mk', md5(g::text)
31FROM generate_series(1, 40) g;
32
33INSERT INTO citizens (citizen_id, full_name, email, phone, password)
34SELECT 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)
36FROM generate_series(1, 5000) g;
37
38-- 100 000 пријави од 2021 до 2026; околу 4 % се сè уште отворени
39INSERT INTO reports (report_id, description, location_text, latitude, longitude,
40 status, priority, created_at, citizen_id, category_id)
41SELECT 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
55FROM (SELECT g, random() AS x FROM generate_series(1, 100000) g) s;
56
57-- доделување за секоја пријава која не е само поднесена
58INSERT INTO assignments (assignment_id, assigned_at, note, admin_id, report_id, worker_id)
59SELECT 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)
61FROM reports r
62WHERE r.status <> 'submitted';
63
64-- историја на статуси според конечниот статус
65INSERT INTO status_logs (status, changed_at, note, report_id, worker_id)
66SELECT s.status, r.created_at + s.offs, NULL, r.report_id,
67 CASE WHEN s.status = 'submitted' THEN NULL ELSE a.worker_id END
68FROM reports r
69LEFT JOIN assignments a ON a.report_id = r.report_id
70CROSS 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)
76WHERE 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
82INSERT INTO comments (content, created_at, report_id, worker_id)
83SELECT 'Коментар за напредокот', a.assigned_at + interval '6 hours', a.report_id, a.worker_id
84FROM assignments a
85WHERE a.report_id % 2 = 0;
86
87INSERT INTO photos (image_url, report_id)
88SELECT '/uploads/reports/' || r.report_id || '/photo_' || n || '.jpg', r.report_id
89FROM reports r
90CROSS JOIN generate_series(1, 2) n
91WHERE n <= r.report_id % 3;
92
93SELECT setval(pg_get_serial_sequence('perf.status_logs', 'log_id'), (SELECT MAX(log_id) FROM perf.status_logs));
94SELECT setval(pg_get_serial_sequence('perf.comments', 'comment_id'), (SELECT MAX(comment_id) FROM perf.comments));
95SELECT setval(pg_get_serial_sequence('perf.photos', 'photo_id'), (SELECT MAX(photo_id) FROM perf.photos));
96
97ANALYZE admins, workers, citizens, categories, reports, photos, status_logs, comments, assignments;