DatabaseCreation: dml.sql

File dml.sql, 30.1 KB (added by 231511, 27 hours ago)

dml split for easier viewing

Line 
1-- dml.sql
2-- Скрипта за пополнување на табелите со податоци.
3
4SET synchronous_commit = OFF;
5
6INSERT INTO Regions (name) VALUES
7('Скопски'), ('Пелагониски'), ('Вардарски'), ('Источен'),
8('Североисточен'), ('Југозападен'), ('Полошки'), ('Југоисточен');
9
10INSERT INTO Site_Types (name) VALUES
11('Антички локалитет'), ('Опсерваторија'),
12('Средновековен локалитет'), ('Археолошки парк'),('Тумба (Неолитска населба)'),('Наколна населба'),
13('Мегалитска опсерваторија'),('Антички град'),('Некропола'),('Римски терми'),('Аквадукт'),('Вила Рустика'),
14('Тврдина (Кале)'),('Ранохристијанска базилика'),('Средновековен манастир'),('Антички рудник');
15
16INSERT INTO Protection_Status (name) VALUES
17('Заштитен'), ('Делумно заштитен'), ('Незаштитен');
18
19INSERT INTO Roles (role_name) VALUES
20('Admin'), ('Researcher'), ('Conservator'), ('Visitor');
21
22INSERT INTO Status_Types (status_name, type) VALUES
23('Изложен', 'object'),
24('Депониран', 'object'),
25('На конзервација', 'object'),
26('Објавено', 'publication'),
27('Во подготовка', 'publication'),
28('Одобрено', 'access'),
29('Во обработка', 'access'),
30('Одбиено', 'access');
31
32INSERT INTO Materials (name) VALUES
33('Керамика'), ('Бронза'), ('Железо'),
34('Камен'), ('Стакло'), ('Злато'),
35('Сребро'), ('Коска'), ('Дрво');
36
37UPDATE Materials
38SET description_materials = CASE
39 WHEN material_id % 4 = 0 THEN 'Природен материјал со широка употреба во изработка на предмети.'
40 WHEN material_id % 4 = 1 THEN 'Често користен материјал во традиционални и модерни техники.'
41 WHEN material_id % 4 = 2 THEN 'Материјал со специфични физички и хемиски својства.'
42 ELSE 'Историски значаен материјал со културна вредност.'
43END;
44
45INSERT INTO Categories (name, description_category) VALUES
46('Орудија и оружје', 'Предмети користени за работа, лов и војување, изработени од камен, коска или метал.'),
47('Накит', 'Декоративни предмети (фибули, обетки, прстени) изработени од злато, сребро, бронза или стакло.'),
48('Садови и керамика', 'Предмети за секојдневна употреба, складирање храна (амфори, питоси) и обредни цели.'),
49('Монети', 'Метални парични единици од различни периоди (пајонски, македонски, римски, византиски).'),
50('Скулптури и пластика', 'Уметнички дела од мермер, камен или бронза, вклучувајќи статуи, бисти и релјефи.'),
51('Теракотни предмети', 'Предмети од печена земја, вклучувајќи ги уникатните Винички икони и фигурини.'),
52('Епиграфски споменици', 'Камени натписи, надгробни стели и почесни плочи со историски записи.'),
53('Мозаици', 'Подни и ѕидни декорации изработени од мали камчиња (тесери), карактеристични за базиликите.'),
54('Архитектонски елементи', 'Делови од градби како капители, столбови и мермерни прагови.'),
55('Опрема за секојдневие', 'Светилки (луцерни), коскени игли, огледала и други предмети за домаќинството.');
56
57INSERT INTO Municipalities (name) VALUES
58('Скопје'), ('Битола'), ('Охрид'), ('Виница'),('Штип'),('Кавадарци'),('Прилеп'), ('Гевгелија'), ('Струмица'), ('Куманово');
59
60INSERT INTO Institutions (name, address,city) VALUES
61('Археолошки музеј на Македонија', 'Кеј Димитар Влахов бб', 'Скопје'),
62('Музеј на Македонија', 'Куршумли Ан бб', 'Скопје'), -- Ова е националниот музеј во Старата Чаршија
63('Музеј на град Скопје', 'Улица Македонија бб', 'Скопје'),
64('Меморијален центар на Холокаустот на Евреите од Македонија', 'Улица Тетовска бб', 'Скопје'),
65('Природонаучен музеј на Македонија', 'Булевар Илинден 86', 'Скопје'),
66
67('НУ Завод и музеј Битола', 'Улица Климент Охридски бб', 'Битола'),
68('НУ Завод и музеј Прилеп', 'Улица Александар Македонски 142', 'Прилеп'),
69('НУ Завод и музеј Охрид', 'Улица Цар Самоил 62', 'Охрид'), -- Куќата на Робевци
70('Национален парк Галичица - Музејски центар', 'Улица Наум Охридски 124', 'Охрид'),
71('НУ Завод и музеј Струга', 'Улица Партизанска бб', 'Струга'),
72
73('НУ Завод и музеј Струмица', 'Улица 27-ми Март бб', 'Струмица'),
74('НУ Завод и музеј Штип', 'Улица Тошо Арсов 10', 'Штип'),
75('Народен музеј Велес', 'Улица 8-ми Септември бб', 'Велес'),
76('НУ Музеј на град Гевгелија', 'Улица Маршал Тито бб', 'Гевгелија'),
77('НУ Музеј Радовиш', 'Улица 22-ри Октомври бб', 'Радовиш'),
78('НУ Музеј на град Кочани', 'Улица Маршал Тито бб', 'Кочани'),
79
80('НУ Музеј Куманово', 'Улица 11-ти Октомври бб', 'Куманово'),
81('Музеј на Тетовскиот крај', 'Улица Иво Лола Рибар бб', 'Тетово'),
82('Музеј на град Кратово', 'Улица Гоце Делчев бб', 'Кратово'),
83('Музеј "Западна Македонија во НОВ"', 'Улица Ослободување бб', 'Кичево'),
84('Музеј на град Дебар', 'Улица 8-ми Септември бб', 'Дебар');
85
86WITH first_names AS (
87 SELECT ARRAY['Ivan','Ana','Marko','Elena','Stefan','Marija'] AS fn_arr
88),
89last_names AS (
90 SELECT ARRAY['Petrov','Stojanovska','Trajkov','Dimitrova','Nikolov','Ivanova'] AS ln_arr
91)
92INSERT INTO Users (username, full_name, email, password_hash, role_id)
93SELECT
94 'user_' || i,
95 fn_arr[ceil(random()*array_length(fn_arr,1))] || ' ' ||
96 ln_arr[ceil(random()*array_length(ln_arr,1))],
97 'user' || i || '@mail.com',
98 'pass',
99 floor(random()*4 + 1)
100FROM generate_series(1, 2000) s(i), first_names, last_names;
101
102INSERT INTO User_Details (user_id,institution_id,specialization)
103SELECT
104 user_id,
105 floor(random()*21+1),
106 CASE floor(random()*7)
107 WHEN 0 THEN 'Aрхеологија'
108 WHEN 1 THEN 'Конзервација'
109 WHEN 2 THEN 'Нумизматика'
110 WHEN 3 THEN 'Етнологија'
111 WHEN 4 THEN 'Историја на уметност'
112 WHEN 5 THEN 'Подводна археологија'
113 WHEN 6 THEN 'Емиграфика'
114 END
115 FROM Users u
116 JOIN Roles r ON u.role_id=r.role_id
117 WHERE r.role_name != 'Visitor';
118
119INSERT INTO Sites(site_name,site_type_id,region_id,
120 protection_status_id,latitude,longitude,altitude,discovery_year,
121 description,municipality_id,is_active,created_at)
122SELECT
123 s.name || ' - ' || s.loc,
124 s.type_id,
125 floor(random()*8+1),
126 floor(random()*3+1),
127 40.8+(random()*1.5),
128 20.5+(random()*2.5),
129 (150+(random()*1100))::int,
130 1850+(random()*175)::int,
131
132 CASE
133 WHEN s.name IN ('Градиште', 'Кале', 'Кула') THEN
134 'Стратешко утврдување со остатоци од дефанзивни ѕидови и кули, датира од ' ||
135 (ARRAY['антиката', 'доцната антика', 'средниот век'])[floor(random()*3+1)] || '.'
136 WHEN s.name IN ('Тумба', 'Могила') THEN
137 'Повеќеслојна праисториска населба со богат инвентар на керамички наоди и остатоци од ' ||
138 (ARRAY['неолитски', 'енеолитски', 'бронзени'])[floor(random()*2+1)]
139 ELSE
140 'Археолошки комплекс со значајни архитектонски остатоци и фрагментирана подвижна керамика.'
141 END,
142
143 floor(random()*10+1),
144 (random()>0.1),
145 NOW()-(random()*interval '500 days')
146
147 FROM(
148 SELECT
149 s.i,
150 (ARRAY['Градиште', 'Тумба', 'Кале', 'Црквиште', 'Висока', 'Могила', 'Бања', 'Манастир', 'Чука', 'Кула'])
151 [floor(random()*10+1)] as name,
152 (ARRAY['с. Злокуќани', 'с. Моноспитово', 'с. Таор', 'с. Кожле', 'Битола', 'Прилеп', 'с. Возарци', 'с. Радолишта', 'с. Вевчани', 'с. Смолани'])
153 [floor(random()*10+1)] || ' (' || s.i || ')' as loc,
154 floor(random()*4+1) as type_id
155 FROM generate_series(1,6000) s(i)
156 )s;
157
158INSERT INTO Objects (
159 inventory_number, title, current_status_id, site_id,
160 creation_year, acquisition_date, found_by_user_id, description
161)
162SELECT
163 'INV-' || i,
164 CASE
165 WHEN random() < 0.3 THEN 'Керамички сад'
166 WHEN random() < 0.6 THEN 'Бронзен предмет'
167 WHEN random() < 0.8 THEN 'Монета'
168 ELSE 'Фрагмент'
169 END,
170 (SELECT status_id FROM Status_Types WHERE type = 'object' LIMIT 1),
171 floor(random() * 6000 + 1),
172 (random() * 2000 + 1)::int,
173 NOW() - (random() * interval '95 years'),
174 floor(random() * 2000 + 1),
175 (ARRAY[
176 'Одлично зачуван примерок.',
177 'Потребна е итна конзервација.',
178 'Видливи траги од горење.',
179 'Пронајден во станбен објект.',
180 'Специфична декорација.',
181 NULL
182 ])[floor(random() * 6 + 1)]
183FROM generate_series(1, 2000000) AS i;
184
185INSERT INTO Fragments (
186 description, site_id, object_id, status_id, found_by_user_id, discovery_date, parent_fragment_id
187)
188SELECT
189 CASE
190 WHEN random() < 0.15 THEN 'Керамички фрагмент од сад'
191 WHEN random() < 0.30 THEN 'Фрагмент од амфора'
192 WHEN random() < 0.45 THEN 'Бронзен украсен дел'
193 WHEN random() < 0.60 THEN 'Фрагмент од монета'
194 WHEN random() < 0.75 THEN 'Камен архитектонски дел'
195 WHEN random() < 0.90 THEN 'Фрагмент од римска керамика'
196 ELSE 'Фрагмент од алат од железно време'
197 END,
198 st_site.ids[floor(random() * array_length(st_site.ids, 1) + 1)],
199 st_object.ids[floor(random() * array_length(st_object.ids, 1) + 1)],
200 st_status.ids[floor(random() * array_length(st_status.ids, 1) + 1)],
201 st_user.ids[floor(random() * array_length(st_user.ids, 1) + 1)],
202 NOW() - (floor(random() * 2000) * interval '1 day'),
203 NULL
204FROM generate_series(1, 500000)
205CROSS JOIN (SELECT array_agg(site_id) AS ids FROM Sites) st_site
206CROSS JOIN (SELECT array_agg(object_id) AS ids FROM Objects) st_object
207CROSS JOIN (SELECT array_agg(status_id) AS ids FROM Status_Types WHERE type='object') st_status
208CROSS JOIN (SELECT array_agg(user_id) AS ids FROM Users) st_user;
209
210INSERT INTO Fragments (description, site_id, object_id, status_id, found_by_user_id, discovery_date, parent_fragment_id)
211SELECT
212 'Под-фрагмент',
213 st_sites.ids[floor(random()*array_length(st_sites.ids,1)+1)],
214 NULL,
215 st_status.ids[floor(random()*array_length(st_status.ids,1)+1)],
216 st_user.ids[floor(random()*array_length(st_user.ids,1)+1)],
217 NOW() - (random()*500)*interval '1 day',
218 st_parents.ids[floor(random()*array_length(st_parents.ids,1)+1)]
219FROM generate_series(1, 500000)
220CROSS JOIN (SELECT array_agg(fragment_id) as ids FROM (SELECT fragment_id FROM Fragments LIMIT 200000) p) st_parents
221CROSS JOIN (SELECT array_agg(site_id) as ids FROM Sites) st_sites
222CROSS JOIN (SELECT array_agg(status_id) as ids FROM Status_Types) st_status
223CROSS JOIN (SELECT array_agg(user_id) as ids FROM Users) st_user;
224
225INSERT INTO Fragments (description, site_id, object_id, status_id, found_by_user_id, discovery_date, parent_fragment_id)
226SELECT
227 case
228 WHEN random() < 0.15 THEN 'Генерален фрагмент'
229 WHEN random() < 0.30 THEN 'Фрагмент од амфора'
230 WHEN random() < 0.45 THEN 'Генерален фрагмент'
231 WHEN random() < 0.60 THEN 'Фрагмент од монета'
232 WHEN random() < 0.75 THEN 'Генерален фрагмент'
233 WHEN random() < 0.90 THEN 'Фрагмент од римска керамика'
234 end,
235 st_sites.ids[floor(random()*array_length(st_sites.ids,1)+1)],
236 CASE WHEN random() < 0.8 THEN st_objects.ids[floor(random()*array_length(st_objects.ids,1)+1)] ELSE NULL END,
237 st_status.ids[floor(random()*array_length(st_status.ids,1)+1)],
238 st_user.ids[floor(random()*array_length(st_user.ids,1)+1)],
239 NOW() - (random()*1000)*interval '1 day',
240 NULL
241FROM generate_series(1, 500000)
242CROSS JOIN (SELECT array_agg(site_id) as ids FROM Sites) st_sites
243CROSS JOIN (SELECT array_agg(object_id) as ids FROM Objects) st_objects
244CROSS JOIN (SELECT array_agg(status_id) as ids FROM Status_Types) st_status
245CROSS JOIN (SELECT array_agg(user_id) as ids FROM Users) st_user;
246
247INSERT INTO Authors (full_name)
248SELECT
249 first_names.name || ' ' || last_names.surname
250FROM
251 (SELECT unnest(ARRAY[
252 'Иван','Петар','Гоце','Марко','Никола','Александар',
253 'Елена','Марија','Даниела','Снежана','Тамара','Кристина',
254 'Влатко','Бојан','Љупчо','Стефан','Зоран','Кирил'
255 ]) AS name) first_names,
256
257 (SELECT unnest(ARRAY[
258 'Микулчиќ','Кузман','Манев','Алексов','Стојанов','Петров',
259 'Илиев','Георгиев','Марков','Тодоров','Димитров','Павлов',
260 'Костов','Ристов','Наумов','Спасов','Стојков','Цветков'
261 ]) AS surname) last_names,
262
263 generate_series(1, 50000) g(i)
264LIMIT 50000;
265
266INSERT INTO Publications (
267 request_date,
268 main_author_id,
269 title,
270 status_id,
271 publisher_location
272)
273SELECT
274 CURRENT_DATE - (random()*3000)::int,
275
276 st_author.ids[floor(random()*array_length(st_author.ids,1)+1)],
277 CASE
278 WHEN random() < 0.2 THEN 'Археолошки истражувања во Вардарска долина'
279 WHEN random() < 0.4 THEN 'Римски период на Балканот: анализа на наоди'
280 WHEN random() < 0.6 THEN 'Средновековни утврдувања во Македонија'
281 WHEN random() < 0.8 THEN 'Културно наследство на античка Македонија'
282 ELSE 'Конзервација и реставрација на археолошки објекти'
283 END,
284 st_status.ids[floor(random()*array_length(st_status.ids,1)+1)],
285 CASE
286 WHEN random() < 0.3 THEN 'Skopje'
287 WHEN random() < 0.5 THEN 'Bitola'
288 WHEN random() < 0.7 THEN 'Ohrid'
289 ELSE 'Strumica'
290 END
291FROM generate_series(1, 500000)
292CROSS JOIN(SELECT array_agg(author_id) as ids FROM Authors)st_author
293CROSS JOIN(SELECT array_agg(status_id) as ids FROM Status_Types)st_status;
294
295INSERT INTO Culture (name, origin_region_id, description, period_from_year, period_to_year)
296VALUES
297-- PRAISTORIJA
298('Палеолитска култура', 1, 'Рани човечки заедници и ловци-собирачи', -100000, -10000),
299('Неолитска култура', 1, 'Први земјоделски заедници и села', -7000, -3000),
300('Бронзено време', 2, 'Развој на металургија и племенски општества', -3000, -1200),
301('Железно време', 3, 'Племенски култури пред антика', -1200, -500),
302
303-- ANTIKA
304('Пајонска култура', 4, 'Античко племе во регионот на Вардар', -1000, -200),
305('Античка македонска култура', 1, 'Кралството на Македонија', -800, -168),
306('Хеленистичка култура', 1, 'Период по Александар Велики', -323, -31),
307
308-- RIMSKI PERIOD
309('Римска провинциска култура', 2, 'Римска администрација и урбан развој', -168, 300),
310('Доцноримска култура', 3, 'Криза и трансформација на Римската империја', 300, 600),
311
312-- VIZANTIJA
313('Рановизантиска култура', 4, 'Рано христијанство и византиска уметност', 330, 800),
314('Средновизантиска култура', 5, 'Развој на црква и феудализам', 800, 1200),
315('Доцновизантиска култура', 5, 'Ослабување на Византија', 1200, 1453),
316
317-- SREDEN VEK
318('Словенска култура', 6, 'Доаѓање на словенските племиња', 600, 1000),
319('Средновековна балканска култура', 6, 'Феудални држави на Балканот', 1000, 1400),
320
321-- OSMANSKI PERIOD
322('Османлиска култура', 7, 'Османлиско владеење на Балканот', 1400, 1912),
323
324-- MODERNO
325('Современа култура', 8, 'Модерен период по ослободувањето', 1912, 2020);
326
327WITH obj AS (
328 SELECT object_id FROM Objects
329),
330mat AS (
331 SELECT material_id FROM Materials
332),
333pairs AS (
334 SELECT
335 obj.object_id,
336 mat.material_id,
337 row_number() OVER () AS rn
338 FROM obj
339 CROSS JOIN mat
340)
341
342INSERT INTO Materials_Objects (object_id, material_id)
343SELECT
344 st_object_id.ids[floor(random()*array_length(st_object_id.ids,1)+1)],
345 st_material_id.ids[floor(random()*array_length(st_material_id.ids,1)+1)]
346FROM generate_series(1,500000)
347CROSS JOIN(SELECT array_agg(object_id) as ids FROM Objects)st_object_id
348CROSS JOIN(SELECT array_agg(material_id) as ids FROM Materials)st_material_id
349on conflict do nothing;
350
351WITH obj AS (
352 SELECT array_agg(object_id) AS oids FROM Objects
353),
354inst AS (
355 SELECT array_agg(institution_id) AS insts FROM Institutions
356)
357
358INSERT INTO Conservation_Projects (
359 project_name,
360 start_date,
361 end_date,
362 budget,
363 description_project,
364 institution_id,
365 object_id
366)
367SELECT
368 name || ' ' || i,
369 t.start_d,
370 t.start_d + (1 + floor(random()*1000)) * interval '1 day',
371 (1000 + random()*99000)::numeric(10,2),
372 name || ' - детално истражување и конзервација на артефактот.',
373 inst.insts[1 + floor(random()*array_length(inst.insts,1))::int],
374 obj.oids[1 + floor(random()*array_length(obj.oids,1))::int]
375
376FROM generate_series(1, 200000) i,
377 obj, inst,
378 LATERAL (
379 SELECT
380 CASE
381 WHEN random() < 0.25 THEN 'Проект за конзервација на керамика'
382 WHEN random() < 0.50 THEN 'Реставрација на антички објекти'
383 WHEN random() < 0.75 THEN 'Археолошко истражување на локалитет'
384 ELSE 'Дигитализација на културно наследство'
385 END AS name,
386 NOW() - (floor(random()*2000+i*0))*interval '30 days' AS start_d
387 ) t;
388
389WITH obj AS (
390 SELECT array_agg(object_id) AS oids FROM Objects
391)
392INSERT INTO Treatments (object_id, treatment_date,description)
393SELECT
394 obj.oids[1 + floor(random()*array_length(obj.oids,1))::int],
395 CURRENT_DATE - (floor(random()*1000))::int,
396 CASE
397 WHEN random() < 0.25 THEN 'Механичко чистење на површински наслоги и земја'
398 WHEN random() < 0.40 THEN 'Хемиска стабилизација на кородирани метални делови'
399 WHEN random() < 0.55 THEN 'Консолидација на кршлива керамика со паралоид B-72'
400 WHEN random() < 0.70 THEN 'Превентивна десалинизација во дејонизирана вода'
401 WHEN random() < 0.80 THEN 'Лепење на фрагменти со реверзибилен лепак'
402 WHEN random() < 0.90 THEN 'Реставрација на недостатоци со гипс и ретуширање'
403 ELSE 'Нанесување на заштитен микрокристален восок'
404END
405FROM obj, generate_series(1, 500000);
406
407WITH o AS (
408 SELECT array_agg(object_id) AS oids FROM Objects
409),
410s AS (
411 SELECT array_agg(status_id) as ids FROM Status_Types WHERE type='object'
412)
413INSERT INTO Condition_Assessment (
414 assessment_date,
415 notes,
416 object_id,
417 status_id
418)
419SELECT
420 CURRENT_DATE - (floor(random()*2000))::int,
421 'Condition note ' || i,
422 o.oids[i],
423 s.ids[floor(random()*array_length(s.ids,1)+1)]
424FROM o, s,
425generate_series(1, array_length((SELECT array_agg(object_id) FROM Objects),1)) i;
426
427INSERT INTO Treatment_Step_Log (
428 treatment_id, step_number, step_description, observations,
429 timestamp_performed, performed_by_user, researcher_access_id
430)
431SELECT
432 st_treatment.ids[floor(random()*array_length(st_treatment.ids,1)+1)],
433 floor(random()*5+1),
434 (ARRAY['Инспекција', 'Чистење', 'Конзервација', 'Документација', 'Проверка'])[floor(random()*5+1)], -- Сигурен избор без NULL
435 CASE WHEN random() < 0.5 THEN 'Процесот помина во најдобар ред.' ELSE 'Забележани ситни нечистотии.' END,
436 NOW() - (random() * interval '30 days'),
437 u.ids[floor(random() * array_length(u.ids, 1) + 1)],
438 ra.ids[floor(random() * array_length(ra.ids, 1) + 1)]
439FROM generate_series(1, 7000000)
440CROSS JOIN (SELECT array_agg(user_id) AS ids FROM Users) u
441CROSS JOIN (SELECT array_agg(access_id) AS ids FROM Researcher_Access) ra
442CROSS JOIN (SELECT array_agg(treatment_id) AS ids FROM Treatments) st_treatment
443on conflict do nothing;
444
445WITH obj AS (
446 SELECT array_agg(object_id) AS oids FROM Objects
447)
448INSERT INTO Object_Images (
449 image_url,
450 object_id,
451 description,
452 date_taken,
453 is_primary
454)
455SELECT
456 'http://img/object_' || selected_id || '_' || i,
457 selected_id,
458 CASE
459 WHEN i % 3 = 0 THEN 'Поглед од предна страна'
460 WHEN i % 3 = 1 THEN 'Детален приказ на текстура'
461 ELSE 'Профилна снимка на предметот'
462 END,
463 CURRENT_DATE - (random() * 730)::int,
464 (random() < 0.15)
465FROM (
466 SELECT
467 obj.oids[floor(random() * array_length(obj.oids, 1) + 1)] AS selected_id,
468 i
469 FROM obj, generate_series(1, 1000000) i
470) subquery;
471
472INSERT INTO Researcher_Access (
473 access_date,
474 access_status_id,
475 user_id,
476 object_id,
477 institution_id,
478 conservation_project_id
479)
480SELECT
481 CURRENT_DATE - (floor(random()*1200))::int,
482 st_arr.ids[floor(random() * array_length(st_arr.ids, 1) + 1)],
483 u_arr.ids[floor(random() * array_length(u_arr.ids, 1) + 1)],
484 o_arr.ids[floor(random() * array_length(o_arr.ids, 1) + 1)],
485 i_arr.ids[floor(random() * array_length(i_arr.ids, 1) + 1)],
486 CASE
487 WHEN random() < 0.6 THEN p_arr.ids[floor(random() * array_length(p_arr.ids, 1) + 1)]
488 ELSE NULL
489 END
490FROM
491 (SELECT array_agg(status_id) AS ids FROM Status_Types WHERE type = 'access') st_arr,
492 (SELECT array_agg(user_id) AS ids FROM Users) u_arr,
493 (SELECT array_agg(object_id) AS ids FROM Objects) o_arr,
494 (SELECT array_agg(institution_id) AS ids FROM Institutions) i_arr,
495 (SELECT array_agg(project_id) AS ids FROM Conservation_Projects) p_arr,
496 generate_series(1, 500000) AS s;
497
498INSERT INTO Exhibitions (start_date, end_date, name, location_institution_id)
499SELECT
500 base_date,
501 CASE
502 WHEN random() < 0.7
503 THEN base_date + (floor(random()*1500))::int
504 ELSE NULL
505 END,
506 CASE (i % 8)
507 WHEN 0 THEN 'Праисториска Македонија'
508 WHEN 1 THEN 'Античка Македонија'
509 WHEN 2 THEN 'Римски период'
510 WHEN 3 THEN 'Византија'
511 WHEN 4 THEN 'Среден век'
512 WHEN 5 THEN 'Османлиски период'
513 WHEN 6 THEN 'Археологија'
514 ELSE 'Модерна уметност'
515 END || ' - Изложба ' || i,
516 inst_arr.ids[floor(random() * array_length(inst_arr.ids, 1) + 1)]
517FROM generate_series(1, 5000) i
518CROSS JOIN (
519 SELECT array_agg(institution_id) AS ids FROM Institutions
520) inst_arr
521CROSS JOIN LATERAL (
522 SELECT CURRENT_DATE - (floor(random()*4000+i*0))::int AS base_date
523) d;
524
525INSERT INTO Exhibition_Object_Details (
526 display_title,
527 exhibition_description,
528 language,
529 object_id,
530 exhibition_id
531)
532SELECT
533 'Објект во изложба ' || gs,
534
535 CASE
536 WHEN random() < 0.3 THEN 'Археолошки наод'
537 WHEN random() < 0.6 THEN 'Музејски предмет'
538 ELSE 'Културно наследство'
539 END,
540
541 CASE WHEN random() < 0.5 THEN 'mk' ELSE 'en' END,
542
543 o.object_id,
544 e.exhibition_id
545
546FROM generate_series(1, 10000) gs
547
548JOIN LATERAL (
549 SELECT object_id
550 FROM Objects
551 ORDER BY object_id
552 OFFSET (gs % (SELECT COUNT(*) FROM Objects))
553 LIMIT 1
554) o ON true
555
556JOIN LATERAL (
557 SELECT exhibition_id
558 FROM Exhibitions
559 ORDER BY exhibition_id
560 OFFSET (gs % (SELECT COUNT(*) FROM Exhibitions))
561 LIMIT 1
562) e ON true;
563
564INSERT INTO Object_Classification (
565 object_id,
566 category_id,
567 culture_id,
568 period_descr,
569 style,
570 iconography
571)
572SELECT
573 o.object_id,
574 cat.ids[floor(random() * array_length(cat.ids, 1) + 1)],
575 cul.ids[floor(random() * array_length(cul.ids, 1) + 1)],
576 (ARRAY['Ран неолит', 'Доцна антика', 'Среден век', 'Бронзено доба', 'Хеленистички период'])[floor(random() * 5 + 1)],
577 (ARRAY['Доричен', 'Јонски', 'Византиски', 'Локален стил', 'Барок'])[floor(random() * 5 + 1)],
578 (ARRAY['Религиозни мотиви', 'Геометриски фигури', 'Животински приказ', 'Растителни орнаменти'])[floor(random() * 4 + 1)]
579FROM Objects o
580CROSS JOIN (SELECT array_agg(category_id) AS ids FROM Categories) cat
581CROSS JOIN (SELECT array_agg(culture_id) AS ids FROM Culture) cul
582ON CONFLICT DO NOTHING;
583
584INSERT INTO Object_Exhibition (object_id, exhibition_id)
585SELECT
586 o.object_id,
587 ex.ids[floor(random() * array_length(ex.ids, 1) + 1)]
588FROM (
589 SELECT object_id FROM Objects
590 LIMIT 500000
591) o
592CROSS JOIN (
593 SELECT array_agg(exhibition_id) AS ids FROM Exhibitions
594) ex
595ON CONFLICT DO NOTHING;
596
597INSERT INTO Object_Location_History (
598 object_id,
599 institution_id,
600 start_date,
601 end_date
602)
603SELECT
604 o.object_id,
605 inst.ids[floor(random() * array_length(inst.ids, 1) + 1)],
606 start_d,
607 CASE
608 WHEN random() < 0.7
609 THEN start_d + (random() * 500)::int
610 ELSE NULL
611 END
612FROM (
613 SELECT
614 object_id,
615 CURRENT_DATE - (random() * 3000)::int AS start_d
616 FROM Objects
617) o
618CROSS JOIN (
619 SELECT array_agg(institution_id) AS ids FROM Institutions
620) inst
621ON CONFLICT DO NOTHING;
622
623INSERT INTO Object_Publication (
624 object_id,
625 publication_id,
626 page_reference,
627 notes
628)
629SELECT
630 o.object_id,
631 p.ids[floor(random() * array_length(p.ids, 1) + 1)],
632 'p.' || floor(random() * 500 + 1)::text,
633 'Археолошка публикација'
634FROM (
635 SELECT object_id FROM Objects LIMIT 200000
636) o
637CROSS JOIN (
638 SELECT array_agg(publication_id) AS ids FROM Publications
639) p
640ON CONFLICT DO NOTHING;
641
642INSERT INTO Publication_Authors (publication_id, author_id)
643SELECT
644 p.publication_id,
645 a.ids[floor(random()*array_length(a.ids,1)+1)]
646FROM Publications p
647CROSS JOIN(SELECT array_agg(author_id) as ids FROM Authors)a
648LIMIT 200000;
649
650INSERT INTO Treatment_Materials (treatment_id, material_id)
651SELECT
652 t.treatment_id,
653 COALESCE(
654 CASE
655 WHEN o.title ILIKE '%керами%' OR o.title ILIKE '%сад%'
656 THEN (SELECT material_id FROM Materials WHERE name = 'Керамика' LIMIT 1)
657 WHEN o.title ILIKE '%бронз%' OR o.title ILIKE '%фибул%'
658 THEN (SELECT material_id FROM Materials WHERE name = 'Бронза' LIMIT 1)
659 WHEN o.title ILIKE '%желез%' OR o.title ILIKE '%меч%' OR o.title ILIKE '%нож%'
660 THEN (SELECT material_id FROM Materials WHERE name = 'Железо' LIMIT 1)
661 WHEN o.title ILIKE '%монета%' OR o.title ILIKE '%пари%'
662 THEN (SELECT material_id FROM Materials WHERE name IN ('Сребро', 'Злато', 'Бронза') ORDER BY random() LIMIT 1)
663 WHEN o.title ILIKE '%камен%' OR o.title ILIKE '%стату%'
664 THEN (SELECT material_id FROM Materials WHERE name = 'Камен' LIMIT 1)
665 END,
666 m_list.ids[floor(random() * array_length(m_list.ids, 1) + 1)]
667 )
668FROM (
669 SELECT treatment_id, object_id FROM Treatments LIMIT 1000000
670) t
671JOIN Objects o ON o.object_id = t.object_id
672CROSS JOIN (
673 SELECT array_agg(material_id) AS ids FROM Materials
674) m_list
675ON CONFLICT DO NOTHING;