DatabaseCreation: seeder.sql

File seeder.sql, 36.4 KB (added by 231133, 5 days ago)
Line 
1INSERT INTO public.event_status (status_name)
2VALUES
3 ('Draft'),
4 ('Scheduled'),
5 ('On Sale'),
6 ('Sold Out'),
7 ('Completed'),
8 ('Cancelled');
9
10INSERT INTO public.order_status (status_name)
11VALUES
12 ('Open'),
13 ('Pending Payment'),
14 ('Paid'),
15 ('Partially Refunded'),
16 ('Refunded'),
17 ('Expired'),
18 ('Cancelled');
19
20INSERT INTO public.payment_method (method_name)
21VALUES
22 ('Card'),
23 ('Bank Transfer'),
24 ('Cash'),
25 ('Digital Wallet');
26
27INSERT INTO public.location_type (type_name)
28VALUES
29 ('Arena'),
30 ('Stadium'),
31 ('Theater'),
32 ('Concert Hall'),
33 ('Conference Center'),
34 ('Exhibition Hall'),
35 ('Club'),
36 ('Outdoor Venue');
37
38INSERT INTO public.category (name)
39VALUES
40 ('Concert'),
41 ('Festival'),
42 ('Conference'),
43 ('Workshop'),
44 ('Seminar'),
45 ('Sports'),
46 ('Theater'),
47 ('Exhibition'),
48 ('Networking'),
49 ('Comedy');
50
51INSERT INTO public.field (field_name)
52VALUES
53 ('Technology'),
54 ('Education'),
55 ('Healthcare'),
56 ('Finance'),
57 ('Art'),
58 ('Gaming'),
59 ('Science'),
60 ('Business'),
61 ('Sports'),
62 ('Media');
63
64INSERT INTO public.staff_role (description)
65VALUES
66 ('Security'),
67 ('Usher'),
68 ('Ticketing'),
69 ('Technical Support'),
70 ('Stage Crew'),
71 ('Guest Relations'),
72 ('Operations'),
73 ('Cleaning');
74
75INSERT INTO public.staff_team (team_name)
76VALUES
77 ('Front Gate Team'),
78 ('Hall Operations Team'),
79 ('Backstage Team'),
80 ('Technical Team'),
81 ('Guest Support Team'),
82 ('Security Team');
83
84INSERT INTO public.attribute (name, data_type, description, is_required)
85VALUES
86 ('Age Restriction', 'integer', 'Minimum attendee age', false),
87 ('Dress Code', 'string', 'Required dress code for the event', false),
88 ('Has Parking', 'boolean', 'Whether parking is available', false),
89 ('Language', 'string', 'Primary event language', false),
90 ('Doors Open', 'datetime', 'Venue doors opening time', true),
91 ('Requires ID', 'boolean', 'Whether ID is required at entry', false);
92
93INSERT INTO public.sponsor_type (sponsor_amount_paid, type)
94VALUES
95 (100.00, 'Bronze'),
96 (250.00, 'Silver'),
97 (500.00, 'Gold'),
98 (999.99, 'Platinum');
99
100-- 1M users
101INSERT INTO public.user_app (username, email, contact_phone)
102SELECT
103 lower(
104 substr(fn.first_name, 1, 1) ||
105 substr(ln.last_name, 1, 8) ||
106 gs::text
107 ) AS username,
108 lower(
109 fn.first_name || '.' || ln.last_name || '.' || gs::text || '@' || dm.domain
110 ) AS email,
111 CASE
112 WHEN gs % 11 = 0 THEN NULL
113 ELSE '+389' || ph.prefix || lpad((gs % 1000000)::text, 6, '0')
114 END AS contact_phone
115FROM generate_series(1, 1000000) AS gs
116 CROSS JOIN LATERAL (
117 SELECT CASE (gs % 20)
118 WHEN 0 THEN 'Andrej'
119 WHEN 1 THEN 'Stefan'
120 WHEN 2 THEN 'Martin'
121 WHEN 3 THEN 'Filip'
122 WHEN 4 THEN 'Nikola'
123 WHEN 5 THEN 'Aleksandar'
124 WHEN 6 THEN 'David'
125 WHEN 7 THEN 'Matej'
126 WHEN 8 THEN 'Petar'
127 WHEN 9 THEN 'Bojan'
128 WHEN 10 THEN 'Marija'
129 WHEN 11 THEN 'Ana'
130 WHEN 12 THEN 'Elena'
131 WHEN 13 THEN 'Ivana'
132 WHEN 14 THEN 'Sara'
133 WHEN 15 THEN 'Teodora'
134 WHEN 16 THEN 'Mila'
135 WHEN 17 THEN 'Jovana'
136 WHEN 18 THEN 'Tamara'
137 ELSE 'Kristina'
138 END AS first_name
139 ) fn
140 CROSS JOIN LATERAL (
141 SELECT CASE ((gs / 20) % 20)
142 WHEN 0 THEN 'Stojanov'
143 WHEN 1 THEN 'Nikolov'
144 WHEN 2 THEN 'Petrovski'
145 WHEN 3 THEN 'Jovanov'
146 WHEN 4 THEN 'Trajkovski'
147 WHEN 5 THEN 'Mitrevski'
148 WHEN 6 THEN 'Ristov'
149 WHEN 7 THEN 'Iliev'
150 WHEN 8 THEN 'Kostov'
151 WHEN 9 THEN 'Georgiev'
152 WHEN 10 THEN 'Ivanova'
153 WHEN 11 THEN 'Stefanova'
154 WHEN 12 THEN 'Petrova'
155 WHEN 13 THEN 'Jovanova'
156 WHEN 14 THEN 'Trajkovska'
157 WHEN 15 THEN 'Mitrevska'
158 WHEN 16 THEN 'Ristova'
159 WHEN 17 THEN 'Ilieva'
160 WHEN 18 THEN 'Kostova'
161 ELSE 'Georgieva'
162 END AS last_name
163 ) ln
164 CROSS JOIN LATERAL (
165 SELECT CASE (gs % 6)
166 WHEN 0 THEN 'gmail.com'
167 WHEN 1 THEN 'yahoo.com'
168 WHEN 2 THEN 'outlook.com'
169 WHEN 3 THEN 'hotmail.com'
170 WHEN 4 THEN 'live.com'
171 ELSE 'icloud.com'
172 END AS domain
173 ) dm
174 CROSS JOIN LATERAL (
175 SELECT CASE (gs % 10)
176 WHEN 0 THEN '70'
177 WHEN 1 THEN '71'
178 WHEN 2 THEN '72'
179 WHEN 3 THEN '73'
180 WHEN 4 THEN '74'
181 WHEN 5 THEN '75'
182 WHEN 6 THEN '76'
183 WHEN 7 THEN '77'
184 WHEN 8 THEN '78'
185 ELSE '79'
186 END AS prefix
187 ) ph;
188
189-- 10000 organisers
190INSERT INTO public.organiser (company_name, contact_phone, website_url)
191SELECT
192 org.company_name,
193 '+389' || ph.prefix || lpad(gs::text, 6, '0') AS contact_phone,
194 'https://www.' ||
195 lower(regexp_replace(org.company_name, '[^a-zA-Z0-9]', '', 'g')) ||
196 '.mk' AS website_url
197FROM generate_series(1, 10000) AS gs
198 CROSS JOIN LATERAL (
199 SELECT CASE (gs % 12)
200 WHEN 0 THEN 'EventLab ' || gs
201 WHEN 1 THEN 'Pulse Events ' || gs
202 WHEN 2 THEN 'SummitWorks ' || gs
203 WHEN 3 THEN 'LiveNation Hub ' || gs
204 WHEN 4 THEN 'ArenaFlow ' || gs
205 WHEN 5 THEN 'UrbanStage ' || gs
206 WHEN 6 THEN 'BluePeak Events ' || gs
207 WHEN 7 THEN 'NextWave Productions ' || gs
208 WHEN 8 THEN 'Vision Expo Group ' || gs
209 WHEN 9 THEN 'Prime Ticketing ' || gs
210 WHEN 10 THEN 'Cultural Connect ' || gs
211 ELSE 'Mosaic Events ' || gs
212 END AS company_name
213 ) org
214 CROSS JOIN LATERAL (
215 SELECT CASE (gs % 10)
216 WHEN 0 THEN '70'
217 WHEN 1 THEN '71'
218 WHEN 2 THEN '72'
219 WHEN 3 THEN '73'
220 WHEN 4 THEN '74'
221 WHEN 5 THEN '75'
222 WHEN 6 THEN '76'
223 WHEN 7 THEN '77'
224 WHEN 8 THEN '78'
225 ELSE '79'
226 END AS prefix
227 ) ph;
228
229-- 5000 locations
230INSERT INTO public.location (name, type_id, address, city, capacity)
231SELECT
232 CASE lt.type_id
233 WHEN 1 THEN 'Arena ' || gs
234 WHEN 2 THEN 'Stadium ' || gs
235 WHEN 3 THEN 'Theater ' || gs
236 WHEN 4 THEN 'Concert Hall ' || gs
237 WHEN 5 THEN 'Conference Center ' || gs
238 WHEN 6 THEN 'Exhibition Hall ' || gs
239 WHEN 7 THEN 'Club ' || gs
240 ELSE 'Outdoor Venue ' || gs
241 END AS name,
242 lt.type_id,
243 (100 + (gs % 900))::text || ' ' ||
244 CASE (gs % 14)
245 WHEN 0 THEN 'Ilindenska'
246 WHEN 1 THEN 'Partizanska'
247 WHEN 2 THEN 'Makedonija'
248 WHEN 3 THEN 'Goce Delcev'
249 WHEN 4 THEN 'Jane Sandanski'
250 WHEN 5 THEN 'Boris Trajkovski'
251 WHEN 6 THEN 'Industriska'
252 WHEN 7 THEN 'Marshal Tito'
253 WHEN 8 THEN 'Dimitar Vlahov'
254 WHEN 9 THEN '11 Oktomvri'
255 WHEN 10 THEN 'Kej 13 Noemvri'
256 WHEN 11 THEN 'Nikola Vapcarov'
257 WHEN 12 THEN 'Koco Racin'
258 ELSE 'Vodno'
259 END || ' Ul.' AS address,
260 CASE (gs % 12)
261 WHEN 0 THEN 'Skopje'
262 WHEN 1 THEN 'Bitola'
263 WHEN 2 THEN 'Ohrid'
264 WHEN 3 THEN 'Tetovo'
265 WHEN 4 THEN 'Kumanovo'
266 WHEN 5 THEN 'Prilep'
267 WHEN 6 THEN 'Stip'
268 WHEN 7 THEN 'Strumica'
269 WHEN 8 THEN 'Veles'
270 WHEN 9 THEN 'Gostivar'
271 WHEN 10 THEN 'Belgrad'
272 ELSE 'Struga'
273 END AS city,
274 CASE lt.type_id
275 WHEN 1 THEN 5000 + (gs % 15001) -- arena
276 WHEN 2 THEN 8000 + (gs % 32001) -- stadium
277 WHEN 3 THEN 150 + (gs % 1851) -- theater
278 WHEN 4 THEN 300 + (gs % 3701) -- concert hall
279 WHEN 5 THEN 200 + (gs % 4801) -- conference center
280 WHEN 6 THEN 500 + (gs % 9501) -- exhibition hall
281 WHEN 7 THEN 80 + (gs % 1121) -- club
282 ELSE 1000 + (gs % 19001) -- outdoor venue
283 END AS capacity
284FROM generate_series(1, 5000) AS gs
285 JOIN LATERAL (
286 SELECT ((gs - 1) % 8) + 1 AS type_id
287 ) AS lt ON true;
288
289-- 3000 sponsors
290INSERT INTO public.sponsor (name)
291SELECT
292 CASE (gs % 15)
293 WHEN 0 THEN 'Coca-Cola Partner ' || gs
294 WHEN 1 THEN 'Telekom Sponsor ' || gs
295 WHEN 2 THEN 'Visa Event Sponsor ' || gs
296 WHEN 3 THEN 'Sparkasse Partner ' || gs
297 WHEN 4 THEN 'Nike Activation ' || gs
298 WHEN 5 THEN 'Red Bull Stage Sponsor ' || gs
299 WHEN 6 THEN 'Samsung Experience ' || gs
300 WHEN 7 THEN 'Alkaloid Support ' || gs
301 WHEN 8 THEN 'Tikves Partner ' || gs
302 WHEN 9 THEN 'NLB Sponsor ' || gs
303 WHEN 10 THEN 'Setec Tech Sponsor ' || gs
304 WHEN 11 THEN 'Neptun Partner ' || gs
305 WHEN 12 THEN 'Makedonski Telekom Business ' || gs
306 WHEN 13 THEN 'Sava Insurance Sponsor ' || gs
307 ELSE 'General Sponsor ' || gs
308 END
309FROM generate_series(1, 3000) AS gs;
310
311-- 100000 sections
312INSERT INTO public.section (section_name, capacity, location_id)
313SELECT
314 CASE (gs % 12)
315 WHEN 0 THEN 'Main Floor'
316 WHEN 1 THEN 'Balcony'
317 WHEN 2 THEN 'VIP Zone'
318 WHEN 3 THEN 'Standing Area'
319 WHEN 4 THEN 'Parter'
320 WHEN 5 THEN 'Tribina A'
321 WHEN 6 THEN 'Tribina B'
322 WHEN 7 THEN 'East Wing'
323 WHEN 8 THEN 'West Wing'
324 WHEN 9 THEN 'Gallery'
325 WHEN 10 THEN 'Expo Hall'
326 ELSE 'General Admission'
327 END || ' ' || ((gs - 1) % 20 + 1) AS section_name,
328
329 GREATEST(
330 30,
331 LEAST(
332 2500,
333 (l.capacity / (8 + (gs % 18)))::integer
334 )
335 ) AS capacity,
336
337 l.location_id
338FROM generate_series(1, 100000) AS gs
339 JOIN LATERAL (
340 SELECT location_id, capacity
341 FROM public.location
342 ORDER BY location_id
343 OFFSET ((gs - 1) % (SELECT count(*) FROM public.location))
344 LIMIT 1
345 ) l ON true;
346
347-- 500000 events
348INSERT INTO public.event (
349 organiser_id,
350 event_status_id,
351 title,
352 start_datetime,
353 end_datetime
354)
355SELECT
356 o.organiser_id,
357
358 CASE
359 WHEN gs % 100 < 4 THEN (SELECT event_status_id FROM public.event_status WHERE status_name = 'Cancelled')
360 WHEN gs % 100 < 12 THEN (SELECT event_status_id FROM public.event_status WHERE status_name = 'Completed')
361 WHEN gs % 100 < 20 THEN (SELECT event_status_id FROM public.event_status WHERE status_name = 'Draft')
362 WHEN gs % 100 < 32 THEN (SELECT event_status_id FROM public.event_status WHERE status_name = 'Scheduled')
363 WHEN gs % 100 < 92 THEN (SELECT event_status_id FROM public.event_status WHERE status_name = 'On Sale')
364 ELSE (SELECT event_status_id FROM public.event_status WHERE status_name = 'Sold Out')
365 END AS event_status_id,
366
367 left(
368 CASE (gs % 30)
369 WHEN 0 THEN 'Skopje Summer Festival'
370 WHEN 1 THEN 'Ohrid Cultural Night'
371 WHEN 2 THEN 'Balkan Tech Summit'
372 WHEN 3 THEN 'Bitola Film Evening'
373 WHEN 4 THEN 'Urban Music Fest'
374 WHEN 5 THEN 'Stand Up Balkan'
375 WHEN 6 THEN 'Wine and Jazz Night'
376 WHEN 7 THEN 'Startup Networking Forum'
377 WHEN 8 THEN 'Electronic Beats Skopje'
378 WHEN 9 THEN 'Traditional Food Festival'
379 WHEN 10 THEN 'Gaming Weekend'
380 WHEN 11 THEN 'Design and Figma Workshop'
381 WHEN 12 THEN 'AI and Data Conference'
382 WHEN 13 THEN 'Football Fan Zone'
383 WHEN 14 THEN 'Theater Premiere Night'
384 WHEN 15 THEN 'Student Career Fair'
385 WHEN 16 THEN 'Hip Hop Live Session'
386 WHEN 17 THEN 'Business Leadership Forum'
387 WHEN 18 THEN 'Photography Exhibition'
388 WHEN 19 THEN 'Macedonian Rock Night'
389 WHEN 20 THEN 'Regional Book Fair'
390 WHEN 21 THEN 'Coding Bootcamp Day'
391 WHEN 22 THEN 'Coffee and Tech Talks'
392 WHEN 23 THEN 'Ohrid Open Air Concert'
393 WHEN 24 THEN 'Skopje Fashion Weekend'
394 WHEN 25 THEN 'Jazz Under the Stars'
395 WHEN 26 THEN 'Balkan Startup Pitch'
396 WHEN 27 THEN 'Museum Night'
397 WHEN 28 THEN 'Local Craft Expo'
398 ELSE 'International Culture Forum'
399 END || ' ' || gs,
400 64
401 ) AS title,
402
403 timestamp '2023-01-01 18:00:00'
404 + ((gs % 1460) * interval '1 day')
405 + ((gs % 6) * interval '1 hour') AS start_datetime,
406
407 timestamp '2023-01-01 18:00:00'
408 + ((gs % 1460) * interval '1 day')
409 + ((gs % 6) * interval '1 hour')
410 + (
411 CASE
412 WHEN gs % 10 IN (0, 1) THEN interval '2 hours'
413 WHEN gs % 10 IN (2, 3, 4) THEN interval '3 hours'
414 WHEN gs % 10 IN (5, 6) THEN interval '4 hours'
415 WHEN gs % 10 = 7 THEN interval '1 day'
416 ELSE interval '2 days'
417 END
418 ) AS end_datetime
419
420FROM generate_series(1, 500000) AS gs
421 JOIN LATERAL (
422 SELECT organiser_id
423 FROM public.organiser
424 ORDER BY organiser_id
425 OFFSET ((gs - 1) % (SELECT count(*) FROM public.organiser))
426 LIMIT 1
427 ) o ON true;
428
429-- 700,000 rows total
430INSERT INTO public.event_category (event_id, category_id)
431SELECT
432 e.event_id,
433 ((e.event_id - 1) % (SELECT count(*) FROM public.category)) + 1 AS category_id
434FROM public.event e;
435
436INSERT INTO public.event_category (event_id, category_id)
437SELECT
438 e.event_id,
439 ((e.event_id + 2) % (SELECT count(*) FROM public.category)) + 1 AS category_id
440FROM public.event e
441WHERE e.event_id % 10 IN (0, 1, 2);
442
443INSERT INTO public.event_category (event_id, category_id)
444SELECT
445 e.event_id,
446 ((e.event_id + 5) % (SELECT count(*) FROM public.category)) + 1 AS category_id
447FROM public.event e
448WHERE e.event_id % 10 = 0;
449
450-- 1.25M sessions for 500,000 events
451WITH numbered_sections AS (
452 SELECT
453 section_id,
454 row_number() OVER (ORDER BY section_id) AS rn
455 FROM public.section
456),
457 section_count AS (
458 SELECT count(*) AS cnt
459 FROM public.section
460 )
461INSERT INTO public.event_schedule_session (
462 event_id,
463 session_title,
464 start_time,
465 end_time,
466 section_id
467)
468SELECT
469 e.event_id,
470
471 CASE gs.session_no
472 WHEN 1 THEN 'Opening Session'
473 WHEN 2 THEN 'Main Program'
474 WHEN 3 THEN 'Evening Program'
475 ELSE 'Final Session'
476 END,
477
478 e.start_datetime + ((gs.session_no - 1) * interval '2 hours'),
479
480 LEAST(
481 e.start_datetime + (gs.session_no * interval '2 hours'),
482 e.end_datetime
483 ),
484
485 ns.section_id
486
487FROM public.event e
488
489 JOIN LATERAL generate_series(
490 1,
491 CASE
492 WHEN e.event_id % 10 = 0 THEN 4
493 WHEN e.event_id % 10 IN (1,2,3) THEN 3
494 ELSE 2
495 END
496 ) AS gs(session_no) ON true
497
498 CROSS JOIN section_count sc
499
500 JOIN numbered_sections ns
501 ON ns.rn = ((e.event_id + gs.session_no - 2) % sc.cnt) + 1
502
503WHERE e.end_datetime >
504 e.start_datetime + ((gs.session_no - 1) * interval '2 hours');
505
506-- at least 500000 rows for 3 ticket types.
507INSERT INTO public.ticket_type (
508 event_id,
509 tier_name,
510 total_allocated,
511 presale_start,
512 presale_end
513)
514SELECT
515 e.event_id,
516
517 tt.tier_name,
518
519 CASE tt.tier_name
520 WHEN 'General Admission' THEN 200 + (e.event_id % 1800)
521 WHEN 'VIP' THEN 20 + (e.event_id % 180)
522 WHEN 'Student' THEN 50 + (e.event_id % 450)
523 ELSE 100 + (e.event_id % 700)
524 END AS total_allocated,
525
526 CASE
527 WHEN tt.tier_name = 'General Admission' THEN e.start_datetime - interval '45 days'
528 WHEN tt.tier_name = 'VIP' AND e.event_id % 4 <> 0 THEN e.start_datetime - interval '60 days'
529 WHEN tt.tier_name = 'Student' AND e.event_id % 3 <> 0 THEN e.start_datetime - interval '30 days'
530 ELSE NULL
531 END AS presale_start,
532
533 CASE
534 WHEN tt.tier_name = 'General Admission' THEN e.start_datetime - interval '7 days'
535 WHEN tt.tier_name = 'VIP' AND e.event_id % 4 <> 0 THEN e.start_datetime - interval '10 days'
536 WHEN tt.tier_name = 'Student' AND e.event_id % 3 <> 0 THEN e.start_datetime - interval '5 days'
537 ELSE NULL
538 END AS presale_end
539
540FROM public.event e
541 JOIN LATERAL (
542 SELECT *
543 FROM (
544 VALUES
545 (1, 'General Admission'),
546 (2, 'VIP'),
547 (3, 'Student')
548 ) AS x(type_no, tier_name)
549 WHERE x.type_no <= CASE
550 WHEN e.event_id % 10 IN (0, 1, 2, 3, 4, 5, 6) THEN 3
551 ELSE 2
552 END
553 ) tt ON true
554WHERE e.start_datetime > timestamp '2023-02-20';
555
556-- at least 500000 rows, one row per event for required/event-common attributes, fewer for optional ones.
557-- Language: string
558INSERT INTO public.value (
559 attribute_id,
560 value_string,
561 value_int,
562 value_datetime,
563 value_bool,
564 event_id
565)
566SELECT
567 a.attribute_id,
568 CASE (e.event_id % 7)
569 WHEN 0 THEN 'Macedonian'
570 WHEN 1 THEN 'English'
571 WHEN 2 THEN 'Albanian'
572 WHEN 3 THEN 'Serbian'
573 WHEN 4 THEN 'Macedonian and English'
574 WHEN 5 THEN 'Macedonian and Albanian'
575 ELSE 'English and Serbian'
576 END AS value_string,
577 NULL,
578 NULL,
579 NULL,
580 e.event_id
581FROM public.event e
582 JOIN public.attribute a ON a.name = 'Language';
583
584-- Doors Open: datetime
585INSERT INTO public.value (
586 attribute_id,
587 value_string,
588 value_int,
589 value_datetime,
590 value_bool,
591 event_id
592)
593SELECT
594 a.attribute_id,
595 NULL,
596 NULL,
597 e.start_datetime - interval '1 hour',
598 NULL,
599 e.event_id
600FROM public.event e
601 JOIN public.attribute a ON a.name = 'Doors Open';
602
603-- Has Parking: boolean
604INSERT INTO public.value (
605 attribute_id,
606 value_string,
607 value_int,
608 value_datetime,
609 value_bool,
610 event_id
611)
612SELECT
613 a.attribute_id,
614 NULL,
615 NULL,
616 NULL,
617 CASE
618 WHEN e.event_id % 10 IN (0, 1, 2, 3, 4, 5) THEN true
619 ELSE false
620 END,
621 e.event_id
622FROM public.event e
623 JOIN public.attribute a ON a.name = 'Has Parking'
624WHERE e.event_id % 100 < 80;
625
626-- Requires ID: boolean
627INSERT INTO public.value (
628 attribute_id,
629 value_string,
630 value_int,
631 value_datetime,
632 value_bool,
633 event_id
634)
635SELECT
636 a.attribute_id,
637 NULL,
638 NULL,
639 NULL,
640 CASE
641 WHEN e.event_id % 10 IN (0, 1, 2, 3) THEN true
642 ELSE false
643 END,
644 e.event_id
645FROM public.event e
646 JOIN public.attribute a ON a.name = 'Requires ID'
647WHERE e.event_id % 100 < 70;
648
649-- Age Restriction: integer
650INSERT INTO public.value (
651 attribute_id,
652 value_string,
653 value_int,
654 value_datetime,
655 value_bool,
656 event_id
657)
658SELECT
659 a.attribute_id,
660 NULL,
661 CASE
662 WHEN e.event_id % 20 IN (0, 1, 2) THEN 18
663 WHEN e.event_id % 20 = 3 THEN 21
664 ELSE 12
665 END,
666 NULL,
667 NULL,
668 e.event_id
669FROM public.event e
670 JOIN public.attribute a ON a.name = 'Age Restriction'
671WHERE e.event_id % 100 < 45;
672
673-- Dress Code: string
674INSERT INTO public.value (
675 attribute_id,
676 value_string,
677 value_int,
678 value_datetime,
679 value_bool,
680 event_id
681)
682SELECT
683 a.attribute_id,
684 CASE (e.event_id % 6)
685 WHEN 0 THEN 'Casual'
686 WHEN 1 THEN 'Smart Casual'
687 WHEN 2 THEN 'Formal'
688 WHEN 3 THEN 'Business Casual'
689 WHEN 4 THEN 'Festival Outfit'
690 ELSE 'No Dress Code'
691 END,
692 NULL,
693 NULL,
694 NULL,
695 e.event_id
696FROM public.event e
697 JOIN public.attribute a ON a.name = 'Dress Code'
698WHERE e.event_id % 100 < 35;
699
700-- at least 500000 rows for 3 ticket types.
701INSERT INTO public.price_tier (
702 ticket_type_id,
703 price,
704 valid_from,
705 valid_to
706)
707SELECT
708 tt.ticket_type_id,
709 CASE tt.tier_name
710 WHEN 'General Admission' THEN 500 + (tt.event_id % 2500)
711 WHEN 'Student' THEN 300 + (tt.event_id % 1200)
712 WHEN 'VIP' THEN 1500 + (tt.event_id % 6000)
713 ELSE 700 + (tt.event_id % 2000)
714 END::numeric(10,2),
715 tt.presale_start,
716 tt.presale_end
717FROM public.ticket_type tt
718WHERE tt.presale_start IS NOT NULL
719 AND tt.presale_end IS NOT NULL;
720
721-- some are promo
722INSERT INTO public.price_tier (
723 ticket_type_id,
724 price,
725 valid_from,
726 valid_to
727)
728SELECT
729 tt.ticket_type_id,
730 CASE tt.tier_name
731 WHEN 'General Admission' THEN 800 + (tt.event_id % 3000)
732 WHEN 'Student' THEN 500 + (tt.event_id % 1500)
733 WHEN 'VIP' THEN 2500 + (tt.event_id % 9000)
734 ELSE 1000 + (tt.event_id % 2500)
735 END::numeric(10,2),
736 tt.presale_end,
737 e.start_datetime
738FROM public.ticket_type tt
739 JOIN public.event e ON e.event_id = tt.event_id
740WHERE tt.presale_end IS NOT NULL
741 AND e.start_datetime > tt.presale_end;
742
743-- 100000 promo codes
744INSERT INTO public.promo_code (code)
745SELECT
746 upper(
747 CASE (gs % 12)
748 WHEN 0 THEN 'SKOPJE'
749 WHEN 1 THEN 'OHRID'
750 WHEN 2 THEN 'BALKAN'
751 WHEN 3 THEN 'STUDENT'
752 WHEN 4 THEN 'EARLY'
753 WHEN 5 THEN 'SUMMER'
754 WHEN 6 THEN 'VIP'
755 WHEN 7 THEN 'FEST'
756 WHEN 8 THEN 'TECH'
757 WHEN 9 THEN 'MUSIC'
758 WHEN 10 THEN 'CULTURE'
759 ELSE 'EVENT'
760 END || gs
761 )
762FROM generate_series(1, 100000) AS gs;
763
764-- some events have discounts
765INSERT INTO public.discount (
766 event_id,
767 discount_percent,
768 promo_code_id
769)
770SELECT
771 e.event_id,
772 CASE (e.event_id % 6)
773 WHEN 0 THEN 5.00
774 WHEN 1 THEN 10.00
775 WHEN 2 THEN 15.00
776 WHEN 3 THEN 20.00
777 WHEN 4 THEN 25.00
778 ELSE 30.00
779 END AS discount_percent,
780 CASE
781 WHEN e.event_id % 3 = 0 THEN pc.promo_code_id
782 ELSE NULL
783 END AS promo_code_id
784FROM public.event e
785 LEFT JOIN public.promo_code pc
786 ON pc.promo_code_id = ((e.event_id - 1) % 100000) + 1
787WHERE e.event_id % 100 < 35;
788
789-- 10M rows
790INSERT INTO public.seat (
791 row_identifier,
792 section_id,
793 seat_number,
794 is_accessible,
795 is_available
796)
797SELECT
798 chr(65 + ((gs.seat_no - 1) / 20)::int),
799 s.section_id,
800 (((gs.seat_no - 1) % 20) + 1)::text,
801 (gs.seat_no % 50 = 0),
802 NOT (gs.seat_no % 20 IN (0, 1))
803FROM public.section s
804 CROSS JOIN generate_series(1, 100) AS gs(seat_no);
805
806-- at least sponsor number of rows
807INSERT INTO public.sponsor_type_sponsor (
808 sponsor_id,
809 sponsor_type_id
810)
811SELECT
812 s.sponsor_id,
813 ((s.sponsor_id - 1) % (SELECT count(*) FROM public.sponsor_type)) + 1
814FROM public.sponsor s;
815
816-- at least event number of rows
817INSERT INTO public.sponsor_event (
818 event_id,
819 sponsor_id,
820 sponsor_type,
821 sponsor_amount_paid
822)
823SELECT
824 e.event_id,
825 ((e.event_id - 1) % (SELECT count(*) FROM public.sponsor)) + 1,
826 CASE (e.event_id % 4)
827 WHEN 0 THEN 'Bronze'
828 WHEN 1 THEN 'Silver'
829 WHEN 2 THEN 'Gold'
830 ELSE 'Platinum'
831 END,
832 CASE (e.event_id % 4)
833 WHEN 0 THEN 100.00
834 WHEN 1 THEN 250.00
835 WHEN 2 THEN 500.00
836 ELSE 999.99
837 END
838FROM public.event e
839WHERE e.event_id % 100 < 20;
840
841-- 60000 rows
842INSERT INTO public.staff_member (
843 assigned_role,
844 name,
845 surname,
846 contact_phone,
847 staff_team_id
848)
849SELECT
850 ((gs - 1) % (SELECT count(*) FROM public.staff_role)) + 1,
851
852 CASE (gs % 20)
853 WHEN 0 THEN 'Andrej'
854 WHEN 1 THEN 'Stefan'
855 WHEN 2 THEN 'Martin'
856 WHEN 3 THEN 'Filip'
857 WHEN 4 THEN 'Nikola'
858 WHEN 5 THEN 'David'
859 WHEN 6 THEN 'Matej'
860 WHEN 7 THEN 'Bojan'
861 WHEN 8 THEN 'Petar'
862 WHEN 9 THEN 'Viktor'
863 WHEN 10 THEN 'Marija'
864 WHEN 11 THEN 'Ana'
865 WHEN 12 THEN 'Elena'
866 WHEN 13 THEN 'Ivana'
867 WHEN 14 THEN 'Sara'
868 WHEN 15 THEN 'Teodora'
869 WHEN 16 THEN 'Mila'
870 WHEN 17 THEN 'Jovana'
871 WHEN 18 THEN 'Tamara'
872 ELSE 'Kristina'
873 END,
874
875 CASE ((gs / 20) % 20)
876 WHEN 0 THEN 'Stojanov'
877 WHEN 1 THEN 'Nikolov'
878 WHEN 2 THEN 'Petrovski'
879 WHEN 3 THEN 'Jovanov'
880 WHEN 4 THEN 'Trajkovski'
881 WHEN 5 THEN 'Mitrevski'
882 WHEN 6 THEN 'Ristov'
883 WHEN 7 THEN 'Iliev'
884 WHEN 8 THEN 'Kostov'
885 WHEN 9 THEN 'Georgiev'
886 WHEN 10 THEN 'Ivanova'
887 WHEN 11 THEN 'Stefanova'
888 WHEN 12 THEN 'Petrova'
889 WHEN 13 THEN 'Jovanova'
890 WHEN 14 THEN 'Trajkovska'
891 WHEN 15 THEN 'Mitrevska'
892 WHEN 16 THEN 'Ristova'
893 WHEN 17 THEN 'Ilieva'
894 WHEN 18 THEN 'Kostova'
895 ELSE 'Georgieva'
896 END,
897
898 '+389' ||
899 CASE (gs % 10)
900 WHEN 0 THEN '70'
901 WHEN 1 THEN '71'
902 WHEN 2 THEN '72'
903 WHEN 3 THEN '73'
904 WHEN 4 THEN '74'
905 WHEN 5 THEN '75'
906 WHEN 6 THEN '76'
907 WHEN 7 THEN '77'
908 WHEN 8 THEN '78'
909 ELSE '79'
910 END ||
911 lpad((gs % 1000000)::text, 6, '0'),
912
913 ((gs - 1) % (SELECT count(*) FROM public.staff_team)) + 1
914
915FROM generate_series(1, 60000) AS gs;
916
917-- about 30% of events
918INSERT INTO public.staff_team_event_schedule (
919 shift_start,
920 shift_end,
921 is_available,
922 staff_team_id,
923 event_id
924)
925SELECT
926 e.start_datetime - interval '2 hours',
927 e.end_datetime + interval '1 hour',
928 CASE WHEN e.event_id % 20 = 0 THEN false ELSE true END,
929 ((e.event_id - 1) % (SELECT count(*) FROM public.staff_team)) + 1,
930 e.event_id
931FROM public.event e
932WHERE e.event_id % 100 < 30;
933
934-- 100000 exhibitors
935INSERT INTO public.exhibitor (
936 name,
937 surname,
938 field_id
939)
940SELECT
941 CASE (gs % 20)
942 WHEN 0 THEN 'Andrej'
943 WHEN 1 THEN 'Stefan'
944 WHEN 2 THEN 'Martin'
945 WHEN 3 THEN 'Filip'
946 WHEN 4 THEN 'Nikola'
947 WHEN 5 THEN 'Aleksandar'
948 WHEN 6 THEN 'David'
949 WHEN 7 THEN 'Matej'
950 WHEN 8 THEN 'Petar'
951 WHEN 9 THEN 'Bojan'
952 WHEN 10 THEN 'Marija'
953 WHEN 11 THEN 'Ana'
954 WHEN 12 THEN 'Elena'
955 WHEN 13 THEN 'Ivana'
956 WHEN 14 THEN 'Sara'
957 WHEN 15 THEN 'Teodora'
958 WHEN 16 THEN 'Mila'
959 WHEN 17 THEN 'Jovana'
960 WHEN 18 THEN 'Tamara'
961 ELSE 'Kristina'
962 END,
963
964 CASE ((gs / 20) % 20)
965 WHEN 0 THEN 'Stojanov'
966 WHEN 1 THEN 'Nikolov'
967 WHEN 2 THEN 'Petrovski'
968 WHEN 3 THEN 'Jovanov'
969 WHEN 4 THEN 'Trajkovski'
970 WHEN 5 THEN 'Mitrevski'
971 WHEN 6 THEN 'Ristov'
972 WHEN 7 THEN 'Iliev'
973 WHEN 8 THEN 'Kostov'
974 WHEN 9 THEN 'Georgiev'
975 WHEN 10 THEN 'Ivanova'
976 WHEN 11 THEN 'Stefanova'
977 WHEN 12 THEN 'Petrova'
978 WHEN 13 THEN 'Jovanova'
979 WHEN 14 THEN 'Trajkovska'
980 WHEN 15 THEN 'Mitrevska'
981 WHEN 16 THEN 'Ristova'
982 WHEN 17 THEN 'Ilieva'
983 WHEN 18 THEN 'Kostova'
984 ELSE 'Georgieva'
985 END,
986
987 ((gs - 1) % (SELECT count(*) FROM public.field)) + 1
988
989FROM generate_series(1, 100000) AS gs;
990
991-- 500000 rows
992INSERT INTO public.subscription_organiser (
993 user_id,
994 organiser_id,
995 created_at
996)
997SELECT
998 ((gs - 1) % 1000000) + 1,
999 ((gs - 1) % (SELECT count(*) FROM public.organiser)) + 1,
1000 timestamp '2023-01-01' + ((gs % 900) * interval '1 day')
1001FROM generate_series(1, 500000) AS gs;
1002
1003-- 500000 rows
1004INSERT INTO public.subscription_location (
1005 user_id,
1006 location_id,
1007 created_at
1008)
1009SELECT
1010 ((gs - 1) % 1000000) + 1,
1011 ((gs - 1) % (SELECT count(*) FROM public.location)) + 1,
1012 timestamp '2023-01-01' + ((gs % 900) * interval '1 day')
1013FROM generate_series(1, 500000) AS gs;
1014
1015-- multi-pass so some events have more than 1 exhibitor per session.
1016INSERT INTO public.exhibitor_event_schedule_session (
1017 exhibitor_id,
1018 event_schedule_session_id,
1019 start_time,
1020 end_time
1021)
1022SELECT
1023 ex.exhibitor_id,
1024 ess.schedule_id,
1025 ess.start_time,
1026 ess.end_time
1027FROM public.exhibitor ex
1028 JOIN (
1029 SELECT
1030 schedule_id,
1031 start_time,
1032 end_time,
1033 row_number() OVER (ORDER BY schedule_id) AS rn
1034 FROM public.event_schedule_session
1035) ess
1036 ON ess.rn = ((ex.exhibitor_id - 1) % (
1037 SELECT count(*) FROM public.event_schedule_session
1038 )) + 1;
1039
1040INSERT INTO public.exhibitor_event_schedule_session (
1041 exhibitor_id,
1042 event_schedule_session_id,
1043 start_time,
1044 end_time
1045)
1046SELECT
1047 ex.exhibitor_id,
1048 ess.schedule_id,
1049 ess.start_time,
1050 ess.end_time
1051FROM public.exhibitor ex
1052 JOIN (
1053 SELECT
1054 schedule_id,
1055 start_time,
1056 end_time,
1057 row_number() OVER (ORDER BY schedule_id) AS rn
1058 FROM public.event_schedule_session
1059) ess
1060 ON ess.rn = ((ex.exhibitor_id + 50000) % (
1061 SELECT count(*) FROM public.event_schedule_session
1062 )) + 1
1063WHERE ex.exhibitor_id % 3 = 0
1064ON CONFLICT (exhibitor_id, event_schedule_session_id) DO NOTHING;
1065
1066-- 10M order_cart rows, run in 1M batches
1067-- This is done so that if the script fails, the data is not lost, and the script can be rerun.
1068INSERT INTO public.order_cart (
1069 user_id,
1070 discount_id,
1071 status_id,
1072 created_at,
1073 total_price
1074)
1075SELECT
1076 ((gs - 1) % 1000000) + 1,
1077
1078 CASE
1079 WHEN gs % 100 < 35
1080 THEN ((gs - 1) % (SELECT COUNT(*) FROM public.discount)) + 1
1081 ELSE NULL
1082 END,
1083
1084 CASE
1085 WHEN gs % 100 < 72 THEN (SELECT status_id FROM public.order_status WHERE status_name = 'Paid')
1086 WHEN gs % 100 < 82 THEN (SELECT status_id FROM public.order_status WHERE status_name = 'Pending Payment')
1087 WHEN gs % 100 < 89 THEN (SELECT status_id FROM public.order_status WHERE status_name = 'Cancelled')
1088 WHEN gs % 100 < 94 THEN (SELECT status_id FROM public.order_status WHERE status_name = 'Refunded')
1089 WHEN gs % 100 < 98 THEN (SELECT status_id FROM public.order_status WHERE status_name = 'Expired')
1090 ELSE (SELECT status_id FROM public.order_status WHERE status_name = 'Open')
1091 END,
1092
1093 timestamp '2023-01-01 10:00:00'
1094 + ((gs % 1100) * interval '1 day')
1095 + ((gs % 86400) * interval '1 second'),
1096
1097 CASE
1098 WHEN gs % 10 IN (0,1,2,3) THEN 800 + (gs % 2200)
1099 WHEN gs % 10 IN (4,5,6) THEN 1500 + (gs % 4500)
1100 WHEN gs % 10 IN (7,8) THEN 3000 + (gs % 7000)
1101 ELSE 6000 + (gs % 12000)
1102 END::numeric(12,2)
1103
1104FROM generate_series(9000001, 10000000) gs;
1105
1106-- 10M payments, run in 1M batches
1107-- This is done so that if the script fails, the data is not lost, and the script can be rerun.
1108INSERT INTO public.payment (
1109 order_id,
1110 method_id,
1111 amount_paid,
1112 processed_at,
1113 transaction_id,
1114 is_refunded
1115)
1116SELECT
1117 o.order_id,
1118
1119 ((o.order_id - 1) % (SELECT count(*) FROM public.payment_method)) + 1 AS method_id,
1120
1121 o.total_price AS amount_paid,
1122
1123 o.created_at + ((o.order_id % 3600) * interval '1 second') AS processed_at,
1124
1125 'TXN-' || lpad(o.order_id::text, 12, '0') AS transaction_id,
1126
1127 CASE
1128 WHEN o.order_id % 100 IN (0, 1, 2, 3, 4) THEN true
1129 ELSE false
1130 END AS is_refunded
1131
1132FROM public.order_cart o
1133WHERE o.order_id BETWEEN 9000001 AND 10000000;
1134
1135-- 10M payments, run in 1M batches
1136-- This is done so that if the script fails, the data is not lost, and the script can be rerun.
1137-- Paid/refunded orders get 1-4 tickets.
1138-- Pending/cancelled/expired/open orders get 0 tickets.
1139INSERT INTO public.ticket (
1140 order_id,
1141 ticket_type_id,
1142 lock_expires_at,
1143 status,
1144 barcode_hash,
1145 seat_id,
1146 is_scanned,
1147 scanned_at,
1148 is_presale
1149)
1150SELECT
1151 o.order_id,
1152 -- from select count(*) from public.ticket_type;
1153 ((o.order_id + gs.ticket_no - 2) % 1303698) + 1 AS ticket_type_id,
1154
1155 o.created_at + interval '15 minutes' AS lock_expires_at,
1156
1157 CASE
1158 WHEN o.status_id IN (3, 4) THEN 'VALID'
1159 WHEN o.status_id = 5 THEN 'REFUNDED'
1160 ELSE 'EXPIRED'
1161 END AS status,
1162
1163 md5(o.order_id::text || '-' || gs.ticket_no::text) AS barcode_hash,
1164
1165 -- from select count(*) from public.seat;
1166 (((o.order_id - 1) * 4 + gs.ticket_no - 1) % 10000000) + 1 AS seat_id,
1167
1168 o.status_id IN (3, 4) AND o.order_id % 100 < 45 AS is_scanned,
1169
1170 CASE
1171 WHEN o.status_id IN (3, 4) AND o.order_id % 100 < 45
1172 THEN o.created_at + interval '7 days'
1173 ELSE NULL
1174 END AS scanned_at,
1175
1176 o.order_id % 100 < 55 AS is_presale
1177
1178FROM public.order_cart o
1179 JOIN LATERAL generate_series(
1180 1,
1181 CASE
1182 WHEN o.status_id IN (1, 2, 6, 7) THEN 0
1183 WHEN o.order_id % 100 < 65 THEN 1
1184 WHEN o.order_id % 100 < 90 THEN 2
1185 WHEN o.order_id % 100 < 98 THEN 3
1186 ELSE 4
1187 END
1188 ) gs(ticket_no) ON true
1189WHERE o.order_id BETWEEN 9000001 AND 10000000;
1190
1191-- 1M reviews
1192-- Some events get 0 reviews, some get many reviews
1193-- Review dates are after the event ends
1194INSERT INTO public.review (
1195 user_id,
1196 event_id,
1197 star_rating,
1198 review_text,
1199 created_at
1200)
1201SELECT
1202 1 + ((gs::bigint * 15485863) % 1000000) AS user_id,
1203
1204 e.event_id,
1205
1206 CASE
1207 WHEN gs % 100 < 6 THEN 1
1208 WHEN gs % 100 < 15 THEN 2
1209 WHEN gs % 100 < 34 THEN 3
1210 WHEN gs % 100 < 68 THEN 4
1211 ELSE 5
1212 END AS star_rating,
1213
1214 CASE (gs % 12)
1215 WHEN 0 THEN 'Great organization and smooth entry.'
1216 WHEN 1 THEN 'Good event, but the venue was crowded.'
1217 WHEN 2 THEN 'The program was interesting and useful.'
1218 WHEN 3 THEN 'Sound and lighting could have been better.'
1219 WHEN 4 THEN 'Excellent atmosphere and friendly staff.'
1220 WHEN 5 THEN 'Ticket scanning was fast and simple.'
1221 WHEN 6 THEN 'The location was easy to find.'
1222 WHEN 7 THEN 'Nice experience, would attend again.'
1223 WHEN 8 THEN 'The event started a bit late.'
1224 WHEN 9 THEN 'Good value for the ticket price.'
1225 WHEN 10 THEN 'Very well organized Balkan-style event.'
1226 ELSE 'Solid event overall.'
1227 END AS review_text,
1228
1229 e.end_datetime
1230 + ((gs % 45) * interval '1 day')
1231 + ((gs % 86400) * interval '1 second') AS created_at
1232
1233FROM generate_series(1, 1000000) AS gs
1234 JOIN public.event e
1235 ON e.event_id = 1 + ((gs::bigint * gs::bigint * 7919) % 500000);
1236
1237-- 1M waitlist entries
1238-- Uneven distribution: most sessions get 0, popular sessions get many
1239-- Dates are based on the actual session start_time
1240INSERT INTO public.waitlist_entry (
1241 user_id,
1242 event_schedule_session_id,
1243 joined_at,
1244 status,
1245 notified_at,
1246 expires_at
1247)
1248SELECT
1249 1 + ((gs::bigint * 15485863) % 1000000) AS user_id,
1250
1251 ns.schedule_id AS event_schedule_session_id,
1252
1253 joined_at_value AS joined_at,
1254
1255 status_value AS status,
1256
1257 CASE
1258 WHEN status_value IN ('NOTIFIED', 'EXPIRED', 'CONVERTED')
1259 THEN joined_at_value + interval '2 days'
1260 ELSE NULL
1261 END AS notified_at,
1262
1263 CASE
1264 WHEN status_value = 'EXPIRED'
1265 THEN joined_at_value + interval '7 days'
1266 ELSE NULL
1267 END AS expires_at
1268
1269FROM generate_series(1, 1000000) AS gs
1270 JOIN public.event_schedule_session ns
1271 ON ns.schedule_id =
1272 1 + (
1273 (gs::bigint * gs::bigint * 7919)
1274 % (SELECT max(schedule_id)::bigint FROM public.event_schedule_session)
1275 )
1276
1277 CROSS JOIN LATERAL (
1278 SELECT
1279 ns.start_time
1280 - ((1 + (gs % 60)) * interval '1 day')
1281 + ((gs % 86400) * interval '1 second') AS joined_at_value
1282 ) j
1283
1284 CROSS JOIN LATERAL (
1285 SELECT
1286 CASE
1287 WHEN gs % 100 < 60 THEN 'ACTIVE'
1288 WHEN gs % 100 < 78 THEN 'NOTIFIED'
1289 WHEN gs % 100 < 90 THEN 'EXPIRED'
1290 ELSE 'CONVERTED'
1291 END AS status_value
1292 ) s;
1293
1294-- fewer refunds than payments
1295INSERT INTO public.refund_request (
1296 reason,
1297 requested_at,
1298 accepted_at,
1299 user_id,
1300 payment_id
1301)
1302SELECT
1303 CASE (p.payment_id % 8)
1304 WHEN 0 THEN 'Event cancelled'
1305 WHEN 1 THEN 'User could not attend'
1306 WHEN 2 THEN 'Duplicate payment'
1307 WHEN 3 THEN 'Wrong ticket type selected'
1308 WHEN 4 THEN 'Schedule conflict'
1309 WHEN 5 THEN 'Payment issue'
1310 WHEN 6 THEN 'Venue changed'
1311 ELSE 'Other reason'
1312 END AS reason,
1313
1314 p.processed_at + interval '1 day' AS requested_at,
1315
1316 p.processed_at + interval '3 days' AS accepted_at,
1317
1318 o.user_id,
1319 p.payment_id
1320
1321FROM public.payment p
1322 JOIN public.order_cart o
1323 ON o.order_id = p.order_id
1324WHERE p.is_refunded = true;