Skip to content
Snippets Groups Projects
schema-191.sql 110 KiB
Newer Older
SET statement_timeout = 0;
SET standard_conforming_strings = on;
SET check_function_bodies = false;
SET client_min_messages = warning;
SET row_security = off;
SET search_path = public, pg_catalog;
CREATE DOMAIN archiving_status AS character varying(100)
	CONSTRAINT archiving_status_check CHECK (((VALUE)::text = ANY (ARRAY[('LOCKED'::character varying)::text, ('AVAILABLE'::character varying)::text, ('ARCHIVED'::character varying)::text, ('ARCHIVE_PENDING'::character varying)::text, ('UNARCHIVE_PENDING'::character varying)::text, ('BACKUP_PENDING'::character varying)::text])));
CREATE DOMAIN authorization_role AS character varying(40)
	CONSTRAINT authorization_role_check CHECK (((VALUE)::text = ANY (ARRAY[('ADMIN'::character varying)::text, ('POWER_USER'::character varying)::text, ('USER'::character varying)::text, ('OBSERVER'::character varying)::text, ('ETL_SERVER'::character varying)::text])));
CREATE DOMAIN boolean_char AS boolean DEFAULT false;
CREATE DOMAIN boolean_char_or_unknown AS character(1) DEFAULT 'U'::bpchar
	CONSTRAINT boolean_char_or_unknown_check CHECK ((VALUE = ANY (ARRAY['F'::bpchar, 'T'::bpchar, 'U'::bpchar])));
CREATE DOMAIN code AS character varying(100);
CREATE DOMAIN column_label AS character varying(128);
CREATE DOMAIN data_set_kind AS character varying(40)
	CONSTRAINT data_set_kind_check CHECK (((VALUE)::text = ANY (ARRAY[('PHYSICAL'::character varying)::text, ('LINK'::character varying)::text, ('CONTAINER'::character varying)::text])));
CREATE DOMAIN data_store_service_kind AS character varying(40)
	CONSTRAINT data_store_service_kind_check CHECK (((VALUE)::text = ANY (ARRAY[('PROCESSING'::character varying)::text, ('QUERIES'::character varying)::text])));
CREATE DOMAIN data_store_service_reporting_plugin_type AS character varying(40)
	CONSTRAINT data_store_service_reporting_plugin_type_check CHECK (((VALUE)::text = ANY (ARRAY[('TABLE_MODEL'::character varying)::text, ('DSS_LINK'::character varying)::text, ('AGGREGATION_TABLE_MODEL'::character varying)::text])));
CREATE DOMAIN description_2000 AS character varying(2000);
CREATE DOMAIN edms_address_type AS text
	CONSTRAINT edms_address_type_check CHECK ((VALUE = ANY (ARRAY['OPENBIS'::text, 'URL'::text, 'FILE_SYSTEM'::text])));
CREATE DOMAIN entity_kind AS character varying(40)
	CONSTRAINT entity_kind_check CHECK (((VALUE)::text = ANY (ARRAY[('SAMPLE'::character varying)::text, ('EXPERIMENT'::character varying)::text, ('DATA_SET'::character varying)::text, ('MATERIAL'::character varying)::text])));
CREATE DOMAIN event_type AS character varying(40)
	CONSTRAINT event_type_check CHECK (((VALUE)::text = ANY (ARRAY[('DELETION'::character varying)::text, ('MOVEMENT'::character varying)::text, ('FREEZING'::character varying)::text])));
CREATE DOMAIN file AS bytea;
CREATE DOMAIN file_name AS character varying(255);
CREATE DOMAIN grid_expression AS character varying(2000);
CREATE DOMAIN grid_id AS character varying(200);
CREATE DOMAIN identifier AS character varying(200);
CREATE DOMAIN location_type AS text
	CONSTRAINT location_type_check CHECK ((VALUE = ANY (ARRAY['OPENBIS'::text, 'URL'::text, 'FILE_SYSTEM_PLAIN'::text, 'FILE_SYSTEM_GIT'::text])));
CREATE DOMAIN object_name AS character varying(50);
CREATE DOMAIN operation_execution_availability AS character varying(40)
	CONSTRAINT operation_execution_availability_check CHECK (((VALUE)::text = ANY (ARRAY[('AVAILABLE'::character varying)::text, ('DELETE_PENDING'::character varying)::text, ('DELETED'::character varying)::text, ('TIME_OUT_PENDING'::character varying)::text, ('TIMED_OUT'::character varying)::text])));
CREATE DOMAIN operation_execution_state AS character varying(40)
	CONSTRAINT operation_execution_state_check CHECK (((VALUE)::text = ANY (ARRAY[('NEW'::character varying)::text, ('SCHEDULED'::character varying)::text, ('RUNNING'::character varying)::text, ('FINISHED'::character varying)::text, ('FAILED'::character varying)::text])));
CREATE DOMAIN ordinal_int AS bigint
	CONSTRAINT ordinal_int_check CHECK ((VALUE > 0));
CREATE DOMAIN plugin_type AS character varying(40)
	CONSTRAINT plugin_type_check CHECK (((VALUE)::text = ANY (ARRAY[('JYTHON'::character varying)::text, ('PREDEPLOYED'::character varying)::text])));
CREATE DOMAIN query_type AS character varying(40)
	CONSTRAINT query_type_check CHECK (((VALUE)::text = ANY (ARRAY[('GENERIC'::character varying)::text, ('EXPERIMENT'::character varying)::text, ('SAMPLE'::character varying)::text, ('DATA_SET'::character varying)::text, ('MATERIAL'::character varying)::text])));
CREATE DOMAIN real_value AS real;
CREATE DOMAIN sample_identifier AS character varying(404);
CREATE DOMAIN script_type AS character varying(40)
	CONSTRAINT script_type_check CHECK (((VALUE)::text = ANY (ARRAY[('DYNAMIC_PROPERTY'::character varying)::text, ('MANAGED_PROPERTY'::character varying)::text, ('ENTITY_VALIDATION'::character varying)::text])));
CREATE DOMAIN tech_id AS bigint;
CREATE DOMAIN text_value AS text;
CREATE DOMAIN time_stamp AS timestamp with time zone;
CREATE DOMAIN time_stamp_dfl AS timestamp with time zone NOT NULL DEFAULT now();
CREATE DOMAIN title_100 AS character varying(100);
CREATE DOMAIN user_id AS character varying(50);
CREATE DOMAIN long_value AS bigint;
CREATE DOMAIN double_value AS double precision;
CREATE FUNCTION check_created_or_modified_data_set_owner_is_alive() RETURNS trigger
    LANGUAGE plpgsql
    AS $$
DECLARE
  owner_code  CODE;
  owner_del_id  TECH_ID;
BEGIN
  IF (NEW.del_id IS NOT NULL) THEN
    RETURN NEW;
  END IF;
  -- check sample
  IF (NEW.samp_id IS NOT NULL) THEN
    SELECT del_id, code INTO owner_del_id, owner_code
      FROM samples 
      WHERE id = NEW.samp_id;
    IF (owner_del_id IS NOT NULL) THEN 
      RAISE EXCEPTION 'Data Set (Code: %) cannot be connected to a Sample (Code: %) %.', 
                      NEW.code, owner_code, deletion_description(owner_del_id);
    END IF;
  END IF;
  -- check experiment
  IF (NEW.expe_id IS NOT NULL) THEN
    SELECT del_id, code INTO owner_del_id, owner_code
      FROM experiments 
      WHERE id = NEW.expe_id;
    IF (owner_del_id IS NOT NULL) THEN 
      RAISE EXCEPTION 'Data Set (Code: %) cannot be connected to an Experiment (Code: %) %.', 
                      NEW.code, owner_code, deletion_description(owner_del_id);
    END IF; 
  END IF; 
  RETURN NEW;
END;
$$;
CREATE FUNCTION check_created_or_modified_sample_owner_is_alive() RETURNS trigger
    LANGUAGE plpgsql
    AS $$
DECLARE
	owner_code	CODE;
	owner_del_id	TECH_ID;
BEGIN
	IF (NEW.del_id IS NOT NULL) THEN
		RETURN NEW;
	END IF;
  -- check experiment (can't be deleted)
  IF (NEW.expe_id IS NOT NULL) THEN
  	SELECT del_id, code INTO owner_del_id, owner_code
  	  FROM experiments 
  	  WHERE id = NEW.expe_id;
  	IF (owner_del_id IS NOT NULL) THEN 
			RAISE EXCEPTION 'Sample (Code: %) cannot be connected to an Experiment (Code: %) %.', 
   		                NEW.code, owner_code, deletion_description(owner_del_id);
		END IF;
	END IF;
	RETURN NEW;
END;
$$;
CREATE FUNCTION check_data_set_kind_link() RETURNS trigger
    LANGUAGE plpgsql
    AS $$
DECLARE
    kind DATA_SET_KIND;
BEGIN
    SELECT data_set_kind INTO kind
        FROM data_all 
        WHERE id = NEW.id;
        IF (kind <> 'LINK') THEN 
            RAISE EXCEPTION 'Link data (Data Set Code: %) must reference a data set of kind LINK (is %).', 
                            NEW.id, kind;
        END IF;
    RETURN NEW;
END;
$$;
CREATE FUNCTION check_data_set_kind_physical() RETURNS trigger
    LANGUAGE plpgsql
    AS $$
DECLARE
    kind DATA_SET_KIND;
BEGIN
    SELECT data_set_kind INTO kind
        FROM data_all 
        WHERE id = NEW.id;
        IF (kind <> 'PHYSICAL') THEN 
            RAISE EXCEPTION 'External data (Data Set Code: %) must reference a data set of kind PHYSICAL (is %).', 
                            NEW.id, kind;
        END IF;
    RETURN NEW;
END;
$$;
CREATE FUNCTION check_deletion_consistency_on_experiment_deletion() RETURNS trigger
    LANGUAGE plpgsql
    AS $$
DECLARE
  counter  INTEGER;
BEGIN
	IF (OLD.del_id IS NOT NULL OR NEW.del_id IS NULL) THEN
		RETURN NEW;
	END IF;
	
  -- check datasets
	SELECT count(*) INTO counter 
	  FROM data
	  WHERE data.expe_id = NEW.id AND data.del_id IS NULL;
	IF (counter > 0) THEN
	  RAISE EXCEPTION 'Experiment (Code: %) deletion failed because at least one of its data sets was not deleted.', NEW.code;
	END IF;
	-- check samples
	SELECT count(*) INTO counter 
	  FROM samples 
	  WHERE samples.expe_id = NEW.id AND samples.del_id IS NULL;
	IF (counter > 0) THEN
	  RAISE EXCEPTION 'Experiment (Code: %) deletion failed because at least one of its samples was not deleted.', NEW.code;
	END IF;
	RETURN NEW;
END;
$$;
CREATE FUNCTION check_deletion_consistency_on_sample_deletion() RETURNS trigger
    LANGUAGE plpgsql
    AS $$
DECLARE
  counter  INTEGER;
BEGIN
	IF (OLD.del_id IS NOT NULL OR NEW.del_id IS NULL) THEN
		RETURN NEW;
	END IF;
  -- all directly connected data sets need to be deleted
  -- check datasets
	SELECT count(*) INTO counter 
	  FROM data
	  WHERE data.samp_id = NEW.id AND data.del_id IS NULL;
	IF (counter > 0) THEN
	  RAISE EXCEPTION 'Sample (Code: %) deletion failed because at least one of its data sets was not deleted.', NEW.code;
	END IF;
  -- all components need to be deleted
	SELECT count(*) INTO counter 
	  FROM samples 
	  WHERE samples.samp_id_part_of = NEW.id AND samples.del_id IS NULL;
	IF (counter > 0) THEN
	  RAISE EXCEPTION 'Sample (Code: %) deletion failed because at least one of its component samples was not deleted.', NEW.code;
	END IF;
	RETURN NEW;
END;
$$;
201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 338 339 340 341 342 343 344 345 346 347 348 349 350 351 352 353 354 355 356 357 358 359 360 361 362 363 364 365 366 367 368 369 370 371 372 373 374 375 376 377 378 379 380 381 382 383 384 385 386 387 388 389 390 391 392 393 394 395 396 397 398 399 400 401 402 403 404 405 406 407 408 409 410 411 412 413 414 415 416 417 418 419 420 421 422 423 424 425 426 427 428 429 430 431 432 433 434 435 436 437 438 439 440 441 442 443 444 445 446 447 448 449 450 451 452 453 454 455 456 457 458 459 460 461 462 463 464 465 466 467 468 469 470 471 472 473 474 475 476 477 478 479 480 481 482 483 484 485 486 487 488 489 490 491 492 493 494 495 496 497 498 499 500 501 502 503 504 505 506 507 508 509 510 511 512 513 514 515 516 517 518 519 520 521 522 523 524 525 526 527 528 529 530 531 532 533 534 535 536 537 538 539 540 541 542 543 544 545 546 547 548 549 550 551 552 553 554 555 556 557 558 559 560 561 562 563 564 565 566 567 568 569 570 571 572 573 574 575 576 577 578 579 580 581 582 583 584 585 586 587 588 589 590 591 592 593 594 595 596 597 598 599 600 601 602 603 604 605 606 607 608 609 610 611 612 613 614 615 616 617 618 619 620 621 622 623 624 625 626 627 628 629 630 631 632 633 634 635 636 637 638 639 640 641 642 643 644 645 646 647 648 649 650 651 652 653 654 655 656 657 658 659 660 661 662 663 664 665 666 667 668 669 670 671 672 673 674 675 676 677 678 679 680 681 682 683 684 685 686 687 688 689 690 691 692 693 694 695 696 697 698 699 700 701 702 703 704 705 706 707 708 709 710 711 712 713 714 715 716 717 718 719 720 721 722 723 724 725 726 727 728 729 730 731 732 733 734 735 736 737 738 739 740 741 742 743 744 745 746 747 748 749 750 751 752 753 754 755 756 757 758 759 760 761 762 763 764 765 766 767 768 769 770 771 772 773 774 775 776 777 778 779 780 781 782 783 784 785 786 787 788 789 790 791 792 793 794 795 796 797 798 799 800 801 802 803 804 805 806 807 808 809 810 811 812 813 814 815 816 817 818 819 820 821 822 823 824 825 826 827 828 829 830 831 832 833 834 835 836 837 838 839 840 841 842 843 844 845 846 847 848 849 850 851 852 853 854 855 856 857 858 859 860 861 862 863 864 865 866 867 868 869 870 871 872 873 874 875 876 877 878 879 880 881 882 883 884 885 886 887 888 889 890 891 892 893 894 895 896 897 898 899 900 901 902 903 904 905 906 907 908 909 910 911 912 913 914 915 916 917 918 919 920 921 922 923 924 925 926 927 928 929 930 931 932 933 934 935 936 937 938 939 940 941 942 943 944 945 946 947 948 949 950 951 952 953 954 955 956 957 958 959 960 961 962 963 964 965 966 967 968 969 970 971 972 973 974 975 976 977 978 979 980 981 982 983 984 985 986 987 988 989 990 991 992 993 994 995 996 997 998 999 1000 1001 1002 1003 1004 1005 1006 1007 1008 1009 1010 1011 1012 1013 1014 1015 1016 1017 1018 1019 1020 1021 1022 1023 1024 1025 1026 1027 1028 1029 1030 1031 1032 1033 1034 1035 1036 1037 1038 1039 1040 1041 1042 1043 1044 1045 1046 1047 1048 1049 1050 1051 1052 1053 1054 1055 1056 1057 1058 1059 1060 1061 1062 1063 1064 1065 1066 1067 1068 1069 1070 1071 1072 1073 1074 1075 1076 1077 1078 1079 1080 1081 1082 1083 1084 1085 1086 1087 1088 1089 1090 1091 1092 1093 1094 1095 1096 1097 1098 1099 1100 1101 1102 1103 1104 1105 1106 1107 1108 1109 1110 1111 1112 1113 1114 1115 1116 1117 1118 1119 1120 1121 1122 1123 1124 1125 1126 1127 1128 1129 1130 1131 1132 1133 1134 1135 1136 1137 1138 1139 1140 1141 1142 1143 1144 1145 1146 1147 1148 1149 1150 1151 1152 1153 1154 1155 1156 1157 1158 1159 1160 1161 1162 1163 1164 1165 1166 1167 1168 1169 1170 1171 1172 1173 1174 1175 1176 1177 1178 1179 1180 1181 1182 1183 1184 1185 1186 1187 1188 1189 1190 1191 1192 1193 1194 1195 1196 1197 1198 1199 1200 1201 1202 1203 1204 1205 1206 1207 1208 1209 1210 1211 1212 1213 1214 1215 1216 1217 1218 1219 1220 1221 1222 1223 1224 1225 1226 1227 1228 1229 1230 1231 1232 1233 1234 1235 1236 1237 1238 1239 1240 1241 1242 1243 1244 1245 1246 1247 1248 1249 1250 1251 1252 1253 1254 1255 1256 1257 1258 1259 1260 1261 1262 1263 1264 1265 1266 1267 1268 1269 1270 1271 1272 1273 1274 1275 1276 1277 1278 1279 1280 1281 1282 1283 1284 1285 1286 1287 1288 1289 1290 1291 1292 1293 1294 1295 1296 1297 1298 1299 1300 1301 1302 1303 1304 1305 1306 1307 1308 1309 1310 1311 1312 1313 1314 1315 1316 1317 1318 1319 1320 1321 1322 1323 1324 1325 1326 1327 1328 1329 1330 1331 1332 1333 1334 1335 1336 1337 1338 1339 1340 1341 1342 1343 1344 1345 1346 1347 1348 1349 1350 1351 1352 1353 1354 1355 1356 1357 1358 1359 1360 1361 1362 1363 1364 1365 1366 1367 1368 1369 1370 1371 1372 1373 1374 1375 1376 1377 1378 1379 1380 1381 1382 1383 1384 1385 1386 1387 1388 1389 1390 1391 1392 1393 1394 1395 1396 1397 1398 1399 1400 1401 1402 1403 1404 1405 1406 1407 1408 1409 1410 1411 1412 1413 1414 1415 1416 1417 1418 1419 1420 1421 1422 1423 1424 1425 1426 1427 1428 1429 1430 1431 1432 1433 1434 1435 1436 1437 1438 1439 1440 1441 1442 1443 1444 1445 1446 1447 1448 1449 1450 1451 1452 1453 1454 1455 1456 1457 1458 1459 1460 1461 1462 1463 1464 1465 1466 1467 1468 1469 1470 1471 1472 1473 1474 1475 1476 1477 1478 1479 1480 1481 1482 1483 1484 1485 1486 1487 1488 1489 1490 1491 1492 1493 1494 1495 1496 1497 1498 1499 1500 1501 1502 1503 1504 1505 1506 1507 1508 1509 1510 1511 1512 1513 1514 1515 1516 1517 1518 1519 1520 1521 1522 1523 1524 1525 1526 1527 1528 1529 1530 1531 1532 1533 1534 1535 1536 1537 1538 1539 1540 1541 1542 1543 1544 1545 1546 1547 1548 1549 1550 1551 1552 1553 1554 1555 1556 1557 1558 1559 1560 1561 1562 1563 1564 1565 1566 1567 1568 1569 1570 1571 1572 1573 1574 1575 1576 1577 1578 1579 1580 1581 1582 1583 1584 1585 1586 1587 1588 1589 1590 1591 1592 1593 1594 1595 1596 1597 1598 1599 1600 1601 1602 1603 1604 1605 1606 1607 1608 1609 1610 1611 1612 1613 1614 1615 1616 1617 1618 1619 1620 1621 1622 1623 1624 1625 1626 1627 1628 1629 1630 1631 1632 1633 1634 1635 1636 1637 1638 1639 1640 1641 1642 1643 1644 1645 1646 1647 1648 1649 1650 1651 1652 1653 1654 1655 1656 1657 1658 1659 1660 1661 1662 1663 1664 1665 1666 1667 1668 1669 1670 1671 1672 1673 1674 1675 1676 1677 1678 1679 1680 1681 1682 1683 1684 1685 1686 1687 1688 1689 1690 1691 1692 1693 1694 1695 1696 1697 1698 1699 1700 1701 1702 1703 1704 1705 1706 1707 1708 1709 1710 1711 1712 1713 1714 1715 1716 1717 1718 1719 1720 1721 1722 1723 1724 1725 1726 1727 1728 1729 1730 1731 1732 1733 1734 1735 1736 1737 1738 1739 1740 1741 1742 1743 1744 1745 1746 1747 1748 1749 1750 1751 1752 1753 1754 1755 1756 1757 1758 1759 1760 1761 1762 1763 1764 1765 1766 1767 1768 1769 1770 1771 1772 1773 1774 1775 1776 1777 1778 1779 1780 1781 1782 1783 1784 1785 1786 1787 1788 1789 1790 1791 1792 1793 1794 1795 1796 1797 1798 1799 1800 1801 1802 1803 1804 1805 1806 1807 1808 1809 1810 1811 1812 1813 1814 1815 1816 1817 1818 1819 1820 1821 1822 1823 1824 1825 1826 1827 1828 1829 1830 1831 1832 1833 1834 1835 1836 1837 1838 1839 1840 1841 1842 1843 1844 1845 1846 1847 1848 1849 1850 1851 1852 1853 1854 1855 1856 1857 1858 1859 1860 1861 1862 1863 1864 1865 1866 1867 1868 1869 1870 1871 1872 1873 1874 1875 1876 1877 1878 1879 1880 1881 1882 1883 1884 1885 1886 1887 1888 1889 1890 1891 1892 1893 1894 1895 1896 1897 1898 1899 1900 1901 1902 1903 1904 1905 1906 1907 1908 1909 1910 1911 1912 1913 1914 1915 1916 1917 1918 1919 1920 1921 1922 1923 1924 1925 1926 1927 1928 1929 1930 1931 1932 1933 1934 1935 1936 1937 1938 1939 1940 1941 1942 1943 1944 1945 1946 1947 1948 1949 1950 1951 1952 1953 1954 1955 1956 1957 1958 1959 1960 1961 1962 1963 1964 1965 1966 1967 1968 1969 1970 1971
CREATE FUNCTION content_copies_location_type_check() RETURNS trigger
    LANGUAGE plpgsql
    AS $$
DECLARE
   edms_address_type EDMS_ADDRESS_TYPE;
   index integer;
BEGIN
   select position(address_type in NEW.location_type), address_type into index, edms_address_type from external_data_management_systems
      where id = NEW.edms_id;
   if index != 1 then
      RAISE EXCEPTION 'Insert/Update to content_copies failed. Location type %, but edms.address_type %', NEW.location_type, edms_address_type;
   end if;
   RETURN NEW;
END;
$$;
CREATE FUNCTION content_copies_uniqueness_check() RETURNS trigger
    LANGUAGE plpgsql
    AS $$
BEGIN
  NEW.location_unique_check = NEW.data_id || ',' ||
                              NEW.edms_id || ',' ||
                              coalesce(NEW.path, '') || ',' || 
                              coalesce(NEW.git_commit_hash, '') || ',' || 
                              coalesce(NEW.git_repository_id, '') || ',' || 
                              coalesce(NEW.external_code, '');
  RETURN NEW;
END;
$$;
CREATE FUNCTION controlled_vocabulary_check() RETURNS trigger
    LANGUAGE plpgsql
    AS $$
DECLARE
   v_code  CODE;
BEGIN
   select code into v_code from data_types where id = NEW.daty_id;
   -- Check if the data is of type "CONTROLLEDVOCABULARY"
   if v_code = 'CONTROLLEDVOCABULARY' then
      if NEW.covo_id IS NULL then
         RAISE EXCEPTION 'Insert/Update of Property Type (Code: %) failed, as its Data Type is CONTROLLEDVOCABULARY, but it is not linked to a Controlled Vocabulary.', NEW.code;
      end if;
   end if;
   RETURN NEW;
END;
$$;
CREATE FUNCTION data_all_tsvector_document_trigger() RETURNS trigger
    LANGUAGE plpgsql
    AS $$
BEGIN
    NEW.tsvector_document := setweight(('/' || escape_tsvector_string(NEW.code) || ':1')::tsvector, 'A') ||
            setweight((escape_tsvector_string(NEW.code) || ':1')::tsvector, 'B');
    RETURN NEW;
END
$$;
CREATE FUNCTION data_exp_or_sample_link_check() RETURNS trigger
    LANGUAGE plpgsql
    AS $$
DECLARE
  space_id CODE;
  sample_code CODE;
BEGIN
  if NEW.expe_id IS NOT NULL then
    RETURN NEW;
  end if;
  if NEW.samp_id IS NULL then
    RAISE EXCEPTION 'Neither experiment nor sample is specified for data set %', NEW.code;
  end if;
  select s.id, s.code into space_id, sample_code from samples_all s where s.id = NEW.samp_id;
  if space_id is NULL then
    RAISE EXCEPTION 'Sample % is a shared sample.', sample_code;
  end if;
  RETURN NEW;
END;
$$;
CREATE FUNCTION data_set_property_with_material_data_type_check() RETURNS trigger
    LANGUAGE plpgsql
    AS $$
DECLARE
   v_type_id  CODE;
   v_type_id_prop  CODE;
BEGIN
   if NEW.mate_prop_id IS NOT NULL then
			-- find material type id of the property type 
			select pt.maty_prop_id into v_type_id_prop 
			  from data_set_type_property_types dstpt, property_types pt 
			 where NEW.dstpt_id = dstpt.id AND dstpt.prty_id = pt.id;
		
			if v_type_id_prop IS NOT NULL then
				-- find material type id of the material which consists the entity's property value
				select entity.maty_id into v_type_id 
				  from materials entity
				 where NEW.mate_prop_id = entity.id;
				if v_type_id != v_type_id_prop then
					RAISE EXCEPTION 'Insert/Update of property value referencing material (id: %) failed, as referenced material type is different than expected (id %, expected id: %).', 
												 NEW.mate_prop_id, v_type_id, v_type_id_prop;
				end if;
			end if;
   end if;
   RETURN NEW;
END;
$$;
CREATE FUNCTION deletion_description(del_id tech_id) RETURNS character varying
    LANGUAGE plpgsql
    AS $$
DECLARE
  del_person VARCHAR;
  del_date VARCHAR;
  del_reason VARCHAR;
BEGIN
  SELECT p.last_name || ' ' || p.first_name || ' (' || p.email || ')', 
         to_char(d.registration_timestamp, 'YYYY-MM-DD HH:MM:SS'), d.reason 
    INTO del_person, del_date, del_reason FROM deletions d, persons p 
    WHERE d.pers_id_registerer = p.id AND d.id = del_id;
  RETURN 'deleted by ' || del_person || ' on ' || del_date || ' with reason: "' || del_reason || '"';
END;
$$;
CREATE FUNCTION disable_project_level_samples() RETURNS trigger
    LANGUAGE plpgsql
    AS $$
BEGIN
    IF (NEW.proj_id IS NOT NULL) THEN
    RAISE EXCEPTION 'Project level samples are disabled';
  END IF;
  
  RETURN NEW;
END;
$$;
CREATE FUNCTION escape_tsvector_string(value character varying) RETURNS character varying
    LANGUAGE plpgsql
    AS $$
BEGIN
    RETURN REPLACE(
            REPLACE(
                    REPLACE(
                            REPLACE(
                                    REPLACE(
                                            REPLACE(
                                                    REPLACE(
                                                            REPLACE(
                                                                    REPLACE(LOWER(value), '<', '\<'),
                                                                    '!', '\!'),
                                                            '*', '\*'),
                                                    '&', '\&'),
                                            '|', '\|'),
                                    ')', '\)'),
                            '(', '\('),
                    ':', '\:'),
            ' ', '\ ');
END
$$;
CREATE FUNCTION experiment_property_with_material_data_type_check() RETURNS trigger
    LANGUAGE plpgsql
    AS $$
DECLARE
   v_type_id  CODE;
   v_type_id_prop  CODE;
BEGIN
   if NEW.mate_prop_id IS NOT NULL then
			-- find material type id of the property type 
			select pt.maty_prop_id into v_type_id_prop 
			  from experiment_type_property_types etpt, property_types pt 
			 where NEW.etpt_id = etpt.id AND etpt.prty_id = pt.id;
		
			if v_type_id_prop IS NOT NULL then
				-- find material type id of the material which consists the entity's property value
				select entity.maty_id into v_type_id 
				  from materials entity
				 where NEW.mate_prop_id = entity.id;
				if v_type_id != v_type_id_prop then
					RAISE EXCEPTION 'Insert/Update of property value referencing material (id: %) failed, as referenced material type is different than expected (id %, expected id: %).', 
												 NEW.mate_prop_id, v_type_id, v_type_id_prop;
				end if;
			end if;
   end if;
   RETURN NEW;
END;
$$;
CREATE FUNCTION experiments_all_in_project_tsvector_document_trigger() RETURNS trigger
    LANGUAGE plpgsql
    AS $$
DECLARE new_space_code VARCHAR;
        tsv tsvector;
        exp RECORD;
BEGIN
    IF TG_OP = 'UPDATE' AND NEW.space_id IS DISTINCT FROM OLD.space_id THEN
        SELECT code
        INTO new_space_code
        FROM spaces
        WHERE id = NEW.space_id;
        FOR exp IN
            SELECT id, code, perm_id
            FROM experiments_all
            WHERE proj_id = NEW.id
            LOOP
                tsv := setweight((escape_tsvector_string(exp.perm_id) || ':1')::tsvector, 'A') ||
                       setweight((escape_tsvector_string('/' || new_space_code || '/' || NEW.code || '/' || exp.code)
                           || ':1')::tsvector, 'A') ||
                       setweight((escape_tsvector_string(exp.code) || ':1')::tsvector, 'B');
                UPDATE experiments_all
                SET tsvector_document = tsv
                WHERE id = exp.id;
            END LOOP;
    END IF;
    RETURN NEW;
END
$$;
CREATE FUNCTION experiments_all_tsvector_document_trigger() RETURNS trigger
    LANGUAGE plpgsql
    AS $$
DECLARE proj_code VARCHAR;
        space_code VARCHAR;
BEGIN
    SELECT p.code, s.code INTO STRICT proj_code, space_code FROM projects p
            INNER JOIN spaces s ON p.space_id = s.id WHERE p.id = NEW.proj_id;
    NEW.tsvector_document := setweight((escape_tsvector_string(NEW.perm_id) || ':1')::tsvector, 'A') ||
            setweight((escape_tsvector_string('/' || space_code || '/' || proj_code || '/' || NEW.code)
                    || ':1')::tsvector, 'A') ||
            setweight((escape_tsvector_string(NEW.code) || ':1')::tsvector, 'B');
    RETURN NEW;
END
$$;
CREATE FUNCTION external_data_storage_format_check() RETURNS trigger
    LANGUAGE plpgsql
    AS $$
DECLARE
   v_covo_code  CODE;
   data_code CODE;
BEGIN
   select code into v_covo_code from controlled_vocabularies
      where is_managed_internally = true and 
         id = (select covo_id from controlled_vocabulary_terms where id = NEW.cvte_id_stor_fmt);
   -- Check if the data storage format is a term of the controlled vocabulary "STORAGE_FORMAT"
   if v_covo_code != 'STORAGE_FORMAT' then
      select code into data_code from data_all where id = NEW.id; 
      RAISE EXCEPTION 'Insert/Update of Data (Code: %) failed, as its Storage Format is %, but is required to be STORAGE_FORMAT.', data_code, v_covo_code;
   end if;
   RETURN NEW;
END;
$$;
CREATE FUNCTION material_property_with_material_data_type_check() RETURNS trigger
    LANGUAGE plpgsql
    AS $$
DECLARE
   v_type_id  CODE;
   v_type_id_prop  CODE;
BEGIN
   if NEW.mate_prop_id IS NOT NULL then
			-- find material type id of the property type 
			select pt.maty_prop_id into v_type_id_prop 
			  from material_type_property_types etpt, property_types pt 
			 where NEW.mtpt_id = etpt.id AND etpt.prty_id = pt.id;
		
			if v_type_id_prop IS NOT NULL then
				-- find material type id of the material which consists the entity's property value
				select entity.maty_id into v_type_id 
				  from materials entity
				 where NEW.mate_prop_id = entity.id;
				if v_type_id != v_type_id_prop then
					RAISE EXCEPTION 'Insert/Update of property value referencing material (id: %) failed, as referenced material type is different than expected (id %, expected id: %).', 
							 NEW.mate_prop_id, v_type_id, v_type_id_prop;
				end if;
			end if;
   end if;
   RETURN NEW;
END;
$$;
CREATE FUNCTION materials_tsvector_document_trigger() RETURNS trigger
    LANGUAGE plpgsql
    AS $$
DECLARE material_type_code VARCHAR;
BEGIN
    SELECT code INTO STRICT material_type_code FROM material_types WHERE id = NEW.maty_id;
    NEW.tsvector_document := setweight((escape_tsvector_string(
            NEW.code || ' (' || material_type_code || ')') || ':1')::tsvector, 'A') ||
            setweight((escape_tsvector_string(NEW.code) || ':1')::tsvector, 'B');
    RETURN NEW;
END
$$;
CREATE FUNCTION melt_data_set_for() RETURNS trigger
    LANGUAGE plpgsql
    AS $$
BEGIN
    NEW.FROZEN_FOR_CHILDREN = 'f';
    NEW.FROZEN_FOR_PARENTS = 'f';
    NEW.FROZEN_FOR_COMPS = 'f';
    NEW.FROZEN_FOR_CONTS = 'f';
    return NEW;
end;
$$;
CREATE FUNCTION melt_experiment_for() RETURNS trigger
    LANGUAGE plpgsql
    AS $$
BEGIN
    NEW.FROZEN_FOR_SAMP = 'f';
    NEW.FROZEN_FOR_DATA = 'f';
    return NEW;
end;
$$;
CREATE FUNCTION melt_project_for() RETURNS trigger
    LANGUAGE plpgsql
    AS $$
BEGIN
    NEW.FROZEN_FOR_EXP = 'f';
    NEW.FROZEN_FOR_SAMP = 'f';
    return NEW;
end;
$$;
CREATE FUNCTION melt_sample_for() RETURNS trigger
    LANGUAGE plpgsql
    AS $$
BEGIN
    NEW.FROZEN_FOR_COMP = 'f';
    NEW.FROZEN_FOR_CHILDREN = 'f';
    NEW.FROZEN_FOR_PARENTS = 'f';
    NEW.FROZEN_FOR_DATA = 'f';
    return NEW;
end;
$$;
CREATE FUNCTION melt_space_for() RETURNS trigger
    LANGUAGE plpgsql
    AS $$
BEGIN
    NEW.FROZEN_FOR_PROJ = 'f';
    NEW.FROZEN_FOR_SAMP = 'f';
    return NEW;
end;
$$;
CREATE FUNCTION preserve_deletion_consistency_on_data_set_relationships() RETURNS trigger
    LANGUAGE plpgsql
    AS $$
DECLARE
  delid  TECH_ID;
BEGIN
	IF (NEW.del_id IS NOT NULL OR OLD.del_id IS NULL) THEN
		RETURN NEW;
	END IF;
	SELECT del_id INTO delid
		FROM DATA_ALL where id = NEW.data_id_parent;
	IF (delid IS NOT NULL) THEN
		NEW.del_id = delid;
	END IF;
	SELECT del_id INTO delid
		FROM DATA_ALL where id = NEW.data_id_child;
	IF (delid IS NOT NULL) THEN
		NEW.del_id = delid;
	END IF;
	RETURN NEW;
END;
$$;
CREATE FUNCTION preserve_deletion_consistency_on_sample_relationships() RETURNS trigger
    LANGUAGE plpgsql
    AS $$
DECLARE
  delid  TECH_ID;
BEGIN
	IF (NEW.del_id IS NOT NULL OR OLD.del_id IS NULL) THEN
		RETURN NEW;
	END IF;
	SELECT del_id INTO delid
		FROM SAMPLES_ALL where id = NEW.sample_id_parent;
	IF (delid IS NOT NULL) THEN
		NEW.del_id = delid;
	END IF;
	SELECT del_id INTO delid
		FROM SAMPLES_ALL where id = NEW.sample_id_child;
	IF (delid IS NOT NULL) THEN
		NEW.del_id = delid;
	END IF;
	RETURN NEW;
END;
$$;
CREATE FUNCTION properties_tsvector_document_trigger() RETURNS trigger
    LANGUAGE plpgsql
    AS $$
DECLARE cvt RECORD;
BEGIN
    IF NEW.cvte_id IS NOT NULL THEN
        SELECT code, label INTO STRICT cvt FROM controlled_vocabulary_terms WHERE id = NEW.cvte_id;
        NEW.tsvector_document := text_to_ts_vector(cvt.code, 'C') || text_to_ts_vector(cvt.label, 'C');
    ELSE
        NEW.tsvector_document := text_to_ts_vector(NEW.value, 'D');
    END IF;
    RETURN NEW;
END $$;
CREATE FUNCTION raise_delete_from_data_set_exception() RETURNS trigger
    LANGUAGE plpgsql
    AS $$
DECLARE
    data_id TECH_ID;
BEGIN
    IF (TG_ARGV[0] = 'DATA SET CHILD') THEN
        data_id = old.data_id_parent;
    ELSEIF (TG_ARGV[0] = 'DATA SET PARENT') THEN
        data_id = old.data_id_child;
    ELSEIF (TG_ARGV[0] = 'DATA SET COMPONENT') THEN
        data_id = old.data_id_parent;
    ELSEIF (TG_ARGV[0] = 'DATA SET CONTAINER') THEN
        data_id = old.data_id_child;
    END IF;
    RAISE EXCEPTION 'Operation DELETE % is not allowed because data set % is frozen.', TG_ARGV[0], 
        (select code from data_all where id = data_id);
END;
$$;
CREATE FUNCTION raise_delete_from_experiment_exception() RETURNS trigger
    LANGUAGE plpgsql
    AS $$
BEGIN
    RAISE EXCEPTION 'Operation DELETE % is not allowed because experiment % is frozen.', TG_ARGV[0], 
        (select code from experiments_all where id = old.expe_id);
END;
$$;
CREATE FUNCTION raise_delete_from_project_exception() RETURNS trigger
    LANGUAGE plpgsql
    AS $$
BEGIN
    RAISE EXCEPTION 'Operation DELETE % is not allowed because project % is frozen.', TG_ARGV[0], 
        (select code from projects where id = old.proj_id);
END;
$$;
CREATE FUNCTION raise_delete_from_sample_exception() RETURNS trigger
    LANGUAGE plpgsql
    AS $$
DECLARE
    samp_id TECH_ID;
BEGIN
    IF (TG_ARGV[0] = 'SAMPLE CHILD') THEN
        samp_id = old.sample_id_parent;
    ELSEIF (TG_ARGV[0] = 'SAMPLE PARENT') THEN
        samp_id = old.sample_id_child;
    ELSEIF (TG_ARGV[0] = 'SAMPLE COMPONENT') THEN
        samp_id = old.samp_id_part_of;
    ELSE
        samp_id = old.samp_id;
    END IF;
    RAISE EXCEPTION 'Operation DELETE % is not allowed because sample % is frozen.', TG_ARGV[0], 
        (select code from samples_all where id = samp_id);
END;
$$;
CREATE FUNCTION raise_delete_from_space_exception() RETURNS trigger
    LANGUAGE plpgsql
    AS $$
BEGIN
    RAISE EXCEPTION 'Operation DELETE % is not allowed because space % is frozen.', TG_ARGV[0], 
        (select code from spaces where id = old.space_id);
END;
$$;
CREATE FUNCTION raise_exception_frozen_data_set() RETURNS trigger
    LANGUAGE plpgsql
    AS $$
DECLARE
    ds_id   TECH_ID;
BEGIN
    IF (TG_OP = 'DELETE') THEN
        ds_id = OLD.ds_id;
    ELSEIF (TG_OP = 'INSERT' OR TG_OP = 'UPDATE') THEN
        ds_id = NEW.ds_id;
    END IF;
    RAISE EXCEPTION 'Operation % % is not allowed because data set % is frozen.', TG_OP, TG_ARGV[0],
        (select code from data_all where id = ds_id);
END;
$$;
CREATE FUNCTION raise_exception_frozen_data_set_relationship() RETURNS trigger
    LANGUAGE plpgsql
    AS $$
DECLARE
    parent_id           TECH_ID;
    child_id            TECH_ID;
    relationship_id     TECH_ID;
    relationship        CODE;
    parent_child_frozen BOOLEAN_CHAR;
    cont_comp_frozen    BOOLEAN_CHAR;
BEGIN
    IF (TG_OP = 'DELETE') THEN
        parent_id = OLD.data_id_parent;
        child_id = OLD.data_id_child;
        relationship_id = OLD.relationship_id;
        parent_child_frozen = OLD.parent_frozen OR OLD.child_frozen;
        cont_comp_frozen = OLD.cont_frozen OR OLD.comp_frozen;
    ELSEIF (TG_OP = 'INSERT') THEN
        parent_id = NEW.data_id_parent;
        child_id = NEW.data_id_child;
        relationship_id = NEW.relationship_id;
        parent_child_frozen = NEW.parent_frozen OR NEW.child_frozen;
        cont_comp_frozen = NEW.cont_frozen OR NEW.comp_frozen;
    END IF;
    SELECT code INTO relationship FROM relationship_types WHERE id = relationship_id;
    IF (relationship = 'PARENT_CHILD' AND parent_child_frozen) OR (relationship = 'CONTAINER_COMPONENT' AND cont_comp_frozen) THEN
       RAISE EXCEPTION 'Operation % % is not allowed because data set % or % is frozen.', TG_OP, relationship,
            (select code from data_all where id = parent_id),
            (select code from data_all where id = child_id);
    END IF;
    IF (TG_OP = 'DELETE') THEN
        RETURN OLD;
    ELSEIF (TG_OP = 'INSERT') THEN
        RETURN NEW;
    END IF;
END;
$$;
CREATE FUNCTION raise_exception_frozen_data_set_sample_relationship() RETURNS trigger
    LANGUAGE plpgsql
    AS $$
DECLARE
    sample_id   TECH_ID;
    operation   TEXT;
BEGIN
    IF (NEW.samp_id IS NOT NULL AND NEW.samp_frozen) THEN
        sample_id = NEW.samp_id;
        operation = 'SET SAMPLE';
    ELSEIF (OLD.samp_id IS NOT NULL AND OLD.samp_frozen) THEN
        sample_id = OLD.samp_id;
        operation = 'REMOVE SAMPLE';
    END IF;
    RAISE EXCEPTION 'Operation % is not allowed because sample % is frozen for data set %.', operation,
        (select code from samples_all where id = sample_id), NEW.code;
END;
$$;
CREATE FUNCTION raise_exception_frozen_entity_by_code() RETURNS trigger
    LANGUAGE plpgsql
    AS $$
BEGIN
    RAISE EXCEPTION 'Operation % is not allowed because % % is frozen.', TG_ARGV[0], TG_ARGV[1], OLD.code;
END;
$$;
CREATE FUNCTION raise_exception_frozen_experiment() RETURNS trigger
    LANGUAGE plpgsql
    AS $$
DECLARE
    experiment_id   TECH_ID;
BEGIN
    IF (TG_OP = 'DELETE') THEN
        experiment_id = OLD.expe_id;
    ELSEIF (TG_OP = 'INSERT' OR TG_OP = 'UPDATE') THEN
        experiment_id = NEW.expe_id;
    END IF;
    RAISE EXCEPTION 'Operation % % is not allowed because experiment % is frozen.', TG_OP, TG_ARGV[0],
        (select code from experiments_all where id = experiment_id);
END;
$$;
CREATE FUNCTION raise_exception_frozen_experiment_relationship() RETURNS trigger
    LANGUAGE plpgsql
    AS $$
DECLARE
    experiment_id   TECH_ID;
    operation       TEXT;
BEGIN
    IF (NEW.expe_id IS NOT NULL AND NEW.expe_frozen) THEN
        experiment_id = NEW.expe_id;
        operation = 'SET EXPERIMENT';
    ELSEIF (OLD.expe_id IS NOT NULL AND OLD.expe_frozen) THEN
        experiment_id = OLD.expe_id;
        operation = 'REMOVE EXPERIMENT';
    END IF;
    RAISE EXCEPTION 'Operation % is not allowed because experiment % is frozen for % %.', operation,
        (select code from experiments_all where id = experiment_id), TG_ARGV[0], NEW.code;
END;
$$;
CREATE FUNCTION raise_exception_frozen_project() RETURNS trigger
    LANGUAGE plpgsql
    AS $$
DECLARE
    project_id   TECH_ID;
BEGIN
    IF (TG_OP = 'DELETE') THEN
        project_id = OLD.proj_id;
    ELSEIF (TG_OP = 'INSERT' OR TG_OP = 'UPDATE') THEN
        project_id = NEW.proj_id;
    END IF;
    RAISE EXCEPTION 'Operation % % is not allowed because project % is frozen.', TG_OP, TG_ARGV[0],
        (select code from projects where id = project_id);
END;
$$;
CREATE FUNCTION raise_exception_frozen_project_relationship() RETURNS trigger
    LANGUAGE plpgsql
    AS $$
DECLARE
    project_id   TECH_ID;
    operation    TEXT;
BEGIN
    IF (NEW.proj_id IS NOT NULL AND NEW.proj_frozen) THEN
        project_id = NEW.proj_id;
        operation = 'SET PROJECT';
    ELSEIF (OLD.proj_id IS NOT NULL AND OLD.proj_frozen) THEN
        project_id = OLD.proj_id;
        operation = 'REMOVE PROJECT';
    END IF;
    RAISE EXCEPTION 'Operation % is not allowed because project % is frozen for % %.', operation,
        (select code from projects where id = project_id), TG_ARGV[0], NEW.code;
END;
$$;
CREATE FUNCTION raise_exception_frozen_sample() RETURNS trigger
    LANGUAGE plpgsql
    AS $$
DECLARE
    sample_id   TECH_ID;
BEGIN
    IF (TG_OP = 'DELETE') THEN
        sample_id = OLD.samp_id;
    ELSEIF (TG_OP = 'INSERT' OR TG_OP = 'UPDATE') THEN
        sample_id = NEW.samp_id;
    END IF;
    RAISE EXCEPTION 'Operation % % is not allowed because sample % is frozen.', TG_OP, TG_ARGV[0],
        (select code from samples_all where id = sample_id);
END;
$$;
CREATE FUNCTION raise_exception_frozen_sample_container_relationship() RETURNS trigger
    LANGUAGE plpgsql
    AS $$
DECLARE
    sample_id   TECH_ID;
    operation   TEXT;
BEGIN
    IF (NEW.samp_id_part_of IS NOT NULL AND NEW.CONT_FROZEN) THEN
        sample_id = NEW.samp_id_part_of;
        operation = 'SET CONTAINER';
    ELSEIF (OLD.samp_id_part_of IS NOT NULL AND OLD.CONT_FROZEN) THEN
        sample_id = OLD.samp_id_part_of;
        operation = 'REMOVE CONTAINER';
    END IF;
    RAISE EXCEPTION 'Operation % is not allowed because sample % is frozen for sample %.', operation,
        (select code from samples_all where id = sample_id), NEW.code;
END;
$$;
CREATE FUNCTION raise_exception_frozen_sample_relationship() RETURNS trigger
    LANGUAGE plpgsql
    AS $$
DECLARE
    parent_id   TECH_ID;
    child_id    TECH_ID;
BEGIN
    IF (TG_OP = 'DELETE') THEN
        parent_id = OLD.sample_id_parent;
        child_id = OLD.sample_id_child;
    ELSEIF (TG_OP = 'INSERT') THEN
        parent_id = NEW.sample_id_parent;
        child_id = NEW.sample_id_child;
    END IF;
    RAISE EXCEPTION 'Operation % is not allowed because sample % or % is frozen.', TG_OP, 
        (select code from samples_all where id = parent_id),
        (select code from samples_all where id = child_id);
END;
$$;
CREATE FUNCTION raise_exception_frozen_space_relationship() RETURNS trigger
    LANGUAGE plpgsql
    AS $$
DECLARE
    space_id   TECH_ID;
    operation  TEXT;
BEGIN
    IF (NEW.space_id IS NOT NULL AND NEW.space_frozen) THEN
        space_id = NEW.space_id;
        operation = 'SET SPACE';
    ELSEIF (OLD.space_id IS NOT NULL AND OLD.space_frozen) THEN
        space_id = OLD.space_id;
        operation = 'REMOVE SPACE';
    END IF;
    RAISE EXCEPTION 'Operation % is not allowed because space % is frozen for % %.', operation,
        (select code from spaces where id = space_id), TG_ARGV[0], NEW.code;
END;
$$;
CREATE FUNCTION rename_sequence(old_name character varying, new_name character varying) RETURNS integer
    LANGUAGE plpgsql
    AS $$
DECLARE
  CURR_SEQ_VAL   INTEGER;
BEGIN
  SELECT INTO CURR_SEQ_VAL NEXTVAL(OLD_NAME);
  EXECUTE 'CREATE SEQUENCE ' || NEW_NAME || ' START WITH ' || CURR_SEQ_VAL;
  EXECUTE 'DROP SEQUENCE ' || OLD_NAME;
  RETURN CURR_SEQ_VAL;
END;
$$;
CREATE FUNCTION safe_double(s text) RETURNS double precision
    LANGUAGE plpgsql STRICT
    AS $$
BEGIN
    RETURN s::double precision;
    EXCEPTION WHEN OTHERS THEN
        RETURN NULL;
END; $$;
CREATE FUNCTION safe_timestamp(s text) RETURNS timestamp with time zone
    LANGUAGE plpgsql STRICT
    AS $$
BEGIN
    RETURN s::timestamp with time zone;
    EXCEPTION WHEN OTHERS THEN
        RETURN NULL;
END; $$;
CREATE FUNCTION sample_fill_code_unique_check() RETURNS trigger
    LANGUAGE plpgsql
    AS $$
BEGIN
  NEW.code_unique_check = NEW.code || ',' || coalesce(NEW.samp_id_part_of, -1) || ',' || coalesce(NEW.proj_id, -1) || ',' || coalesce(NEW.space_id, -1);
  RETURN NEW;
END;
$$;
CREATE FUNCTION sample_fill_subcode_unique_check() RETURNS trigger
    LANGUAGE plpgsql
    AS $$
DECLARE
    unique_subcode  BOOLEAN_CHAR;
BEGIN
    SELECT is_subcode_unique into unique_subcode FROM sample_types WHERE id = NEW.saty_id;
    
    IF (unique_subcode) THEN
    NEW.subcode_unique_check = NEW.code || ',' || coalesce(NEW.saty_id, -1) || ',' || coalesce(NEW.proj_id, -1) || ',' || coalesce(NEW.space_id, -1);
    ELSE
    NEW.subcode_unique_check = NULL;
  END IF;
  
  RETURN NEW;
END;
$$;
CREATE FUNCTION sample_property_with_material_data_type_check() RETURNS trigger
    LANGUAGE plpgsql
    AS $$
DECLARE
   v_type_id  CODE;
   v_type_id_prop  CODE;
BEGIN
   if NEW.mate_prop_id IS NOT NULL then
			-- find material type id of the property type 
			select pt.maty_prop_id into v_type_id_prop 
			  from sample_type_property_types etpt, property_types pt 
			 where NEW.stpt_id = etpt.id AND etpt.prty_id = pt.id;
		
			if v_type_id_prop IS NOT NULL then
				-- find material type id of the material which consists the entity's property value
				select entity.maty_id into v_type_id 
				  from materials entity
				 where NEW.mate_prop_id = entity.id;
				if v_type_id != v_type_id_prop then
					RAISE EXCEPTION 'Insert/Update of property value referencing material (id: %) failed, as referenced material type is different than expected (id %, expected id: %).', 
												 NEW.mate_prop_id, v_type_id, v_type_id_prop;
				end if;
			end if;
   end if;
   RETURN NEW;
END;
$$;
CREATE FUNCTION sample_type_fill_subcode_unique_check() RETURNS trigger
    LANGUAGE plpgsql
    AS $$
BEGIN
    IF (NEW.is_subcode_unique::boolean <> OLD.is_subcode_unique::boolean) THEN
      UPDATE samples_all SET subcode_unique_check = subcode_unique_check WHERE saty_id = NEW.id;
  END IF;
    RETURN NEW;
END;
$$;
CREATE FUNCTION samples_all_tsvector_document_trigger() RETURNS trigger
    LANGUAGE plpgsql
    AS $$
DECLARE proj_code VARCHAR;
        space_code VARCHAR;
        container_code VARCHAR;
        sample_code VARCHAR;
        identifier VARCHAR := '/';
BEGIN
    IF TG_OP != 'DELETE' THEN
        IF NEW.space_id IS NOT NULL THEN
            SELECT code INTO STRICT space_code FROM spaces WHERE id = NEW.space_id;
            identifier := identifier || space_code || '/';
        END IF;
        IF NEW.proj_id IS NOT NULL THEN
            SELECT code INTO STRICT proj_code FROM projects WHERE id = NEW.proj_id;
            identifier := identifier || proj_code || '/';
        END IF;
        IF NEW.samp_id_part_of IS NOT NULL THEN
            SELECT code INTO STRICT container_code FROM samples_all WHERE id = NEW.samp_id_part_of;
            sample_code := container_code || ':' || NEW.code;
            NEW.sample_identifier := identifier || sample_code;
            NEW.tsvector_document := setweight((escape_tsvector_string(NEW.perm_id) || ':1')::tsvector, 'A') ||
                                     setweight((escape_tsvector_string(NEW.sample_identifier) || ':1')::tsvector,
                                         'A') ||
                                     setweight((escape_tsvector_string(sample_code) || ':1')::tsvector, 'B') ||
                                     setweight((escape_tsvector_string(container_code) || ':1')::tsvector, 'B') ||
                                     setweight((escape_tsvector_string(NEW.code) || ':1')::tsvector, 'B');
        ELSE
            NEW.sample_identifier := identifier || NEW.code;
            NEW.tsvector_document := setweight((escape_tsvector_string(NEW.perm_id) || ':1')::tsvector, 'A') ||
                                     setweight((escape_tsvector_string(NEW.sample_identifier) || ':1')::tsvector,
                                         'A') ||
                                     setweight((escape_tsvector_string(NEW.code) || ':1')::tsvector, 'B');
        END IF;
    END IF;
    RETURN NEW;
END
$$;
CREATE FUNCTION text_to_ts_vector(text_to_index text, weight "char") RETURNS tsvector
    LANGUAGE plpgsql
    AS $$
DECLARE indexed BOOLEAN;
    DECLARE result tsvector;
BEGIN
    indexed := FALSE;
    text_to_index := regexp_replace(coalesce(text_to_index, ''), E'<[^>]+>', '', 'gi'); -- Remove XML Tags
    text_to_index := escape_tsvector_string(text_to_index); -- Escape characters used by ts_vector
    WHILE NOT INDEXED LOOP
            BEGIN
                result = setweight(to_tsvector('english', text_to_index), weight)::TEXT;
                indexed := TRUE;
            EXCEPTION WHEN sqlstate '54000' THEN
                text_to_index := left(text_to_index, LENGTH(text_to_index) / 2); -- If the index is too big reduce the size of the text to half
            END;
        END LOOP;
    RETURN result;
END $$;
CREATE SEQUENCE attachment_content_id_seq
    START WITH 1
    INCREMENT BY 1
    NO MINVALUE
    NO MAXVALUE
    CACHE 1;
SET default_tablespace = '';
CREATE TABLE attachment_contents (
    id tech_id NOT NULL,
    value file NOT NULL
);
CREATE SEQUENCE attachment_id_seq
    START WITH 1
    INCREMENT BY 1
    NO MINVALUE
    NO MAXVALUE
    CACHE 1;
CREATE TABLE attachments (
    id tech_id NOT NULL,
    expe_id tech_id,
    file_name file_name NOT NULL,
    registration_timestamp time_stamp_dfl DEFAULT now() NOT NULL,
    version integer NOT NULL,
    pers_id_registerer tech_id NOT NULL,
    exac_id tech_id NOT NULL,
    samp_id tech_id,
    proj_id tech_id,
    title title_100,
    description description_2000,
    proj_frozen boolean_char DEFAULT false NOT NULL,
    expe_frozen boolean_char DEFAULT false NOT NULL,
    samp_frozen boolean_char DEFAULT false NOT NULL,
    CONSTRAINT atta_arc_ck CHECK ((((expe_id IS NOT NULL) AND (proj_id IS NULL) AND (samp_id IS NULL)) OR ((expe_id IS NULL) AND (proj_id IS NOT NULL) AND (samp_id IS NULL)) OR ((expe_id IS NULL) AND (proj_id IS NULL) AND (samp_id IS NOT NULL))))
);
CREATE SEQUENCE authorization_group_id_seq
    START WITH 1
    INCREMENT BY 1
    NO MINVALUE
    NO MAXVALUE
    CACHE 1;
CREATE TABLE authorization_group_persons (
    ag_id tech_id NOT NULL,
    pers_id tech_id NOT NULL
);
CREATE TABLE authorization_groups (
    id tech_id NOT NULL,
    code code NOT NULL,
    description description_2000,
    registration_timestamp time_stamp_dfl DEFAULT now() NOT NULL,
    pers_id_registerer tech_id NOT NULL,
    modification_timestamp time_stamp DEFAULT now()
);
CREATE SEQUENCE code_seq
    START WITH 1
    INCREMENT BY 1
    NO MINVALUE
    NO MAXVALUE
    CACHE 1;
CREATE TABLE content_copies (
    data_id tech_id NOT NULL,
    edms_id tech_id NOT NULL,
    external_code text_value,
    id tech_id NOT NULL,
    location_type location_type NOT NULL,
    path text_value,
    git_commit_hash text_value,
    git_repository_id text_value,
    location_unique_check text_value NOT NULL,
    pers_id_registerer tech_id,
    registration_timestamp time_stamp_dfl DEFAULT now() NOT NULL,
    data_frozen boolean_char DEFAULT false NOT NULL
);
CREATE SEQUENCE content_copies_id_seq
    START WITH 1
    INCREMENT BY 1
    NO MINVALUE
    NO MAXVALUE
    CACHE 1;
CREATE TABLE controlled_vocabularies (
    id tech_id NOT NULL,
    code code NOT NULL,
    description description_2000,
    registration_timestamp time_stamp_dfl DEFAULT now() NOT NULL,
    pers_id_registerer tech_id NOT NULL,
    is_managed_internally boolean_char DEFAULT false NOT NULL,
    modification_timestamp time_stamp DEFAULT now(),
    is_chosen_from_list boolean_char DEFAULT true NOT NULL,
    source_uri character varying(250)
);
CREATE SEQUENCE controlled_vocabulary_id_seq
    START WITH 1
    INCREMENT BY 1
    NO MINVALUE
    NO MAXVALUE
    CACHE 1;
CREATE TABLE controlled_vocabulary_terms (
    id tech_id NOT NULL,
    code object_name NOT NULL,
    registration_timestamp time_stamp_dfl DEFAULT now() NOT NULL,
    covo_id tech_id NOT NULL,
    pers_id_registerer tech_id NOT NULL,
    label column_label,
    description description_2000,
    ordinal ordinal_int NOT NULL,
    is_official boolean_char DEFAULT true NOT NULL,
    CONSTRAINT cvte_ck CHECK (((ordinal)::bigint > 0))
);
CREATE SEQUENCE core_plugin_id_seq
    START WITH 1
    INCREMENT BY 1
    NO MINVALUE
    NO MAXVALUE
    CACHE 1;
CREATE TABLE core_plugins (
    id tech_id NOT NULL,
    name character varying(200) NOT NULL,
    version integer NOT NULL,
    registration_timestamp time_stamp_dfl DEFAULT now() NOT NULL,
    master_reg_script text_value
);
CREATE SEQUENCE cvte_id_seq
    START WITH 1
    INCREMENT BY 1
    NO MINVALUE
    NO MAXVALUE
    CACHE 1;
CREATE TABLE data_all (
    id tech_id NOT NULL,
    code code,
    dsty_id tech_id NOT NULL,
    data_producer_code code,
    production_timestamp time_stamp,
    registration_timestamp time_stamp_dfl DEFAULT now() NOT NULL,
    is_valid boolean_char DEFAULT true,
    modification_timestamp time_stamp DEFAULT now(),
    expe_id tech_id,
    dast_id tech_id NOT NULL,
    is_derived boolean_char NOT NULL,
    samp_id tech_id,
    pers_id_registerer tech_id,
    del_id tech_id,
    pers_id_modifier tech_id,
    version integer DEFAULT 0,
    orig_del tech_id,
    access_timestamp time_stamp DEFAULT now(),
    data_set_kind data_set_kind DEFAULT 'PHYSICAL'::character varying NOT NULL,
    frozen boolean_char DEFAULT false NOT NULL,
    expe_frozen boolean_char DEFAULT false NOT NULL,
    samp_frozen boolean_char DEFAULT false NOT NULL,
    frozen_for_children boolean_char DEFAULT false NOT NULL,
    frozen_for_parents boolean_char DEFAULT false NOT NULL,
    frozen_for_comps boolean_char DEFAULT false NOT NULL,
    frozen_for_conts boolean_char DEFAULT false NOT NULL,
    tsvector_document tsvector NOT NULL,
    CONSTRAINT data_ck CHECK (((expe_id IS NOT NULL) OR (samp_id IS NOT NULL)))
);
CREATE VIEW data AS
 SELECT data_all.id,
    data_all.code,
    data_all.dsty_id,
    data_all.dast_id,
    data_all.expe_id,
    data_all.expe_frozen,
    data_all.data_producer_code,
    data_all.production_timestamp,
    data_all.samp_id,
    data_all.samp_frozen,
    data_all.registration_timestamp,
    data_all.access_timestamp,
    data_all.pers_id_registerer,
    data_all.pers_id_modifier,
    data_all.is_valid,
    data_all.modification_timestamp,
    data_all.is_derived,
    data_all.del_id,
    data_all.orig_del,
    data_all.version,
    data_all.data_set_kind,
    data_all.frozen,
    data_all.frozen_for_children,
    data_all.frozen_for_parents,
    data_all.frozen_for_comps,
    data_all.frozen_for_conts,
    data_all.tsvector_document
   FROM data_all
  WHERE (data_all.del_id IS NULL);
CREATE VIEW data_deleted AS
 SELECT data_all.id,
    data_all.code,
    data_all.dsty_id,
    data_all.dast_id,
    data_all.expe_id,
    data_all.data_producer_code,
    data_all.production_timestamp,
    data_all.samp_id,
    data_all.registration_timestamp,
    data_all.access_timestamp,
    data_all.pers_id_registerer,
    data_all.pers_id_modifier,
    data_all.is_valid,
    data_all.modification_timestamp,
    data_all.is_derived,
    data_all.del_id,
    data_all.orig_del,
    data_all.version,
    data_all.data_set_kind
   FROM data_all
  WHERE (data_all.del_id IS NOT NULL);
CREATE SEQUENCE data_id_seq
    START WITH 1
    INCREMENT BY 1
    NO MINVALUE
    NO MAXVALUE
    CACHE 1;
CREATE TABLE data_set_copies_history (
    id tech_id NOT NULL,
    cc_id tech_id NOT NULL,
    data_id tech_id NOT NULL,
    external_code text_value,
    path text_value,
    git_commit_hash text_value,
    git_repository_id text_value,
    edms_id tech_id NOT NULL,
    pers_id_author tech_id,
    valid_from_timestamp time_stamp NOT NULL,
    valid_until_timestamp time_stamp,
    edms_code code,
    edms_label text_value,
    edms_address text_value
);
CREATE SEQUENCE data_set_copies_history_id_seq
    START WITH 1
    INCREMENT BY 1
    NO MINVALUE
    NO MAXVALUE
    CACHE 1;
CREATE TABLE data_set_properties_history (
    id tech_id NOT NULL,
    ds_id tech_id NOT NULL,
    dstpt_id tech_id NOT NULL,
    value text_value,
    valid_until_timestamp time_stamp DEFAULT now(),
    pers_id_author tech_id NOT NULL,
    valid_from_timestamp time_stamp NOT NULL,
    vocabulary_term identifier,
    material identifier,
    sample identifier,
    integer_array_value long_value[],
    real_array_value double_value[],
    string_array_value text_value[],
    timestamp_array_value time_stamp[],
    json_value jsonb,
    CONSTRAINT dsprh_ck CHECK ((
        ((value IS NOT NULL) AND (vocabulary_term IS NULL) AND (material IS NULL) AND (sample IS NULL) AND (integer_array_value IS NULL) AND (real_array_value IS NULL) AND (string_array_value IS NULL) AND (timestamp_array_value IS NULL) AND (json_value IS NULL))
            OR ((value IS NULL) AND (vocabulary_term IS NOT NULL) AND (material IS NULL) AND (sample IS NULL) AND (integer_array_value IS NULL) AND (real_array_value IS NULL) AND (string_array_value IS NULL) AND (timestamp_array_value IS NULL) AND (json_value IS NULL))
            OR ((value IS NULL) AND (vocabulary_term IS NULL) AND (material IS NOT NULL) AND (sample IS NULL) AND (integer_array_value IS NULL) AND (real_array_value IS NULL) AND (string_array_value IS NULL) AND (timestamp_array_value IS NULL) AND (json_value IS NULL))
            OR ((value IS NULL) AND (vocabulary_term IS NULL) AND (material IS NULL) AND (sample IS NOT NULL) AND (integer_array_value IS NULL) AND (real_array_value IS NULL) AND (string_array_value IS NULL) AND (timestamp_array_value IS NULL) AND (json_value IS NULL))
            OR ((value IS NULL) AND (vocabulary_term IS NULL) AND (material IS NULL) AND (sample IS NULL) AND (integer_array_value IS NOT NULL) AND (real_array_value IS NULL) AND (string_array_value IS NULL) AND (timestamp_array_value IS NULL) AND (json_value IS NULL))
            OR ((value IS NULL) AND (vocabulary_term IS NULL) AND (material IS NULL) AND (sample IS NULL) AND (integer_array_value IS NULL) AND (real_array_value IS NOT NULL) AND (string_array_value IS NULL) AND (timestamp_array_value IS NULL) AND (json_value IS NULL))
            OR ((value IS NULL) AND (vocabulary_term IS NULL) AND (material IS NULL) AND (sample IS NULL) AND (integer_array_value IS NULL) AND (real_array_value IS NULL) AND (string_array_value IS NOT NULL) AND (timestamp_array_value IS NULL) AND (json_value IS NULL))
            OR ((value IS NULL) AND (vocabulary_term IS NULL) AND (material IS NULL) AND (sample IS NULL) AND (integer_array_value IS NULL) AND (real_array_value IS NULL) AND (string_array_value IS NULL) AND (timestamp_array_value IS NOT NULL) AND (json_value IS NULL))
            OR ((value IS NULL) AND (vocabulary_term IS NULL) AND (material IS NULL) AND (sample IS NULL) AND (integer_array_value IS NULL) AND (real_array_value IS NULL) AND (string_array_value IS NULL) AND (timestamp_array_value IS NULL) AND (json_value IS NOT NULL))
        ))
);
CREATE TABLE data_set_relationships_history (
    id tech_id NOT NULL,
    main_data_id tech_id NOT NULL,
    relation_type text_value,
    expe_id tech_id,
    samp_id tech_id,
    data_id tech_id,
    entity_perm_id text_value,
    pers_id_author tech_id,
    valid_from_timestamp time_stamp NOT NULL,
    valid_until_timestamp time_stamp,
    ordinal integer,
    entity_kind text_value
);
CREATE VIEW data_set_history_view AS
 SELECT (3 * (data_set_relationships_history.id)::bigint) AS id,
    data_set_relationships_history.main_data_id,
    data_set_relationships_history.relation_type,
    data_set_relationships_history.ordinal,
    data_set_relationships_history.expe_id,
    data_set_relationships_history.samp_id,
    data_set_relationships_history.data_id,
    data_set_relationships_history.entity_kind,
    data_set_relationships_history.entity_perm_id,
    NULL::bigint AS dstpt_id,
    NULL::text AS value,
    NULL::character varying AS vocabulary_term,
    NULL::character varying AS material,
    NULL::character varying AS sample,
    NULL::text AS external_code,
    NULL::text AS path,
    NULL::text AS git_commit_hash,
    NULL::text AS git_repository_id,
    (NULL::bigint)::tech_id AS edms_id,
    NULL::text AS edms_code,
    NULL::text AS edms_label,
    NULL::text AS edms_address,
    data_set_relationships_history.pers_id_author,
    data_set_relationships_history.valid_from_timestamp,
    data_set_relationships_history.valid_until_timestamp,
    NULL::long_value[] AS integer_array_value,
    NULL::double_value[] AS real_array_value,
    NULL::text_value[] AS string_array_value,
    NULL::time_stamp[] AS timestamp_array_value,
    NULL::jsonb AS json_value
   FROM data_set_relationships_history
  WHERE (data_set_relationships_history.valid_until_timestamp IS NOT NULL)
UNION
 SELECT ((3 * (data_set_properties_history.id)::bigint) + 1) AS id,
    data_set_properties_history.ds_id AS main_data_id,
    NULL::text AS relation_type,
    NULL::integer AS ordinal,
    NULL::bigint AS expe_id,
    NULL::bigint AS samp_id,
    NULL::bigint AS data_id,
    NULL::text AS entity_kind,
    NULL::text AS entity_perm_id,
    data_set_properties_history.dstpt_id,
    data_set_properties_history.value,
    data_set_properties_history.vocabulary_term,
    data_set_properties_history.material,
    data_set_properties_history.sample,
    NULL::text AS external_code,
    NULL::text AS path,
    NULL::text AS git_commit_hash,
    NULL::text AS git_repository_id,
    NULL::bigint AS edms_id,
    NULL::text AS edms_code,
    NULL::text AS edms_label,
    NULL::text AS edms_address,
    data_set_properties_history.pers_id_author,
    data_set_properties_history.valid_from_timestamp,
    data_set_properties_history.valid_until_timestamp,
    data_set_properties_history.integer_array_value,
    data_set_properties_history.real_array_value,
    data_set_properties_history.string_array_value,
    data_set_properties_history.timestamp_array_value,
    data_set_properties_history.json_value
   FROM data_set_properties_history
UNION
 SELECT ((3 * (data_set_copies_history.id)::bigint) + 2) AS id,
    data_set_copies_history.data_id AS main_data_id,
    NULL::text AS relation_type,
    NULL::integer AS ordinal,
    NULL::bigint AS expe_id,
    NULL::bigint AS samp_id,
    NULL::bigint AS data_id,
    NULL::text AS entity_kind,
    NULL::text AS entity_perm_id,
    NULL::bigint AS dstpt_id,
    NULL::text AS value,
    NULL::character varying AS vocabulary_term,
    NULL::character varying AS material,
    NULL::character varying AS sample,
    data_set_copies_history.external_code,
    data_set_copies_history.path,
    data_set_copies_history.git_commit_hash,
    data_set_copies_history.git_repository_id,
    data_set_copies_history.edms_id,
    data_set_copies_history.edms_code,
    data_set_copies_history.edms_label,
    data_set_copies_history.edms_address,
    data_set_copies_history.pers_id_author,
    data_set_copies_history.valid_from_timestamp,
    data_set_copies_history.valid_until_timestamp,
    NULL::long_value[] AS integer_array_value,
    NULL::double_value[] AS real_array_value,
    NULL::text_value[] AS string_array_value,
    NULL::time_stamp[] AS timestamp_array_value,
    NULL::jsonb AS json_value
   FROM data_set_copies_history
  WHERE (data_set_copies_history.valid_until_timestamp IS NOT NULL);
CREATE TABLE data_set_properties (
    id tech_id NOT NULL,
    ds_id tech_id NOT NULL,
    dstpt_id tech_id NOT NULL,
    value text_value,
    cvte_id tech_id,
    mate_prop_id tech_id,
    pers_id_registerer tech_id NOT NULL,
    registration_timestamp time_stamp_dfl DEFAULT now() NOT NULL,
    modification_timestamp time_stamp DEFAULT now(),
    pers_id_author tech_id NOT NULL,
    dase_frozen boolean_char DEFAULT false NOT NULL,
    samp_prop_id tech_id,
    tsvector_document tsvector NOT NULL,
    is_unique boolean_char DEFAULT false NOT NULL,
    integer_array_value long_value[],
    real_array_value double_value[],
    string_array_value text_value[],
    timestamp_array_value time_stamp[],
    json_value jsonb,
    CONSTRAINT dspr_ck CHECK ((
        ((value IS NOT NULL) AND (cvte_id IS NULL) AND (mate_prop_id IS NULL) AND (samp_prop_id IS NULL) AND (integer_array_value IS NULL) AND (real_array_value IS NULL) AND (string_array_value IS NULL) AND (timestamp_array_value IS NULL) AND (json_value IS NULL))
            OR ((value IS NULL) AND (cvte_id IS NOT NULL) AND (mate_prop_id IS NULL) AND (samp_prop_id IS NULL) AND (integer_array_value IS NULL) AND (real_array_value IS NULL) AND (string_array_value IS NULL) AND (timestamp_array_value IS NULL) AND (json_value IS NULL))
            OR ((value IS NULL) AND (cvte_id IS NULL) AND (mate_prop_id IS NOT NULL) AND (samp_prop_id IS NULL) AND (integer_array_value IS NULL) AND (real_array_value IS NULL) AND (string_array_value IS NULL) AND (timestamp_array_value IS NULL) AND (json_value IS NULL))
            OR ((value IS NULL) AND (cvte_id IS NULL) AND (mate_prop_id IS NULL) AND (samp_prop_id IS NOT NULL) AND (integer_array_value IS NULL) AND (real_array_value IS NULL) AND (string_array_value IS NULL) AND (timestamp_array_value IS NULL) AND (json_value IS NULL))
            OR ((value IS NULL) AND (cvte_id IS NULL) AND (mate_prop_id IS NULL) AND (samp_prop_id IS NULL) AND (integer_array_value IS NOT NULL) AND (real_array_value IS NULL) AND (string_array_value IS NULL) AND (timestamp_array_value IS NULL) AND (json_value IS NULL))
            OR ((value IS NULL) AND (cvte_id IS NULL) AND (mate_prop_id IS NULL) AND (samp_prop_id IS NULL) AND (integer_array_value IS NULL) AND (real_array_value IS NOT NULL) AND (string_array_value IS NULL) AND (timestamp_array_value IS NULL) AND (json_value IS NULL))
            OR ((value IS NULL) AND (cvte_id IS NULL) AND (mate_prop_id IS NULL) AND (samp_prop_id IS NULL) AND (integer_array_value IS NULL) AND (real_array_value IS NULL) AND (string_array_value IS NOT NULL) AND (timestamp_array_value IS NULL) AND (json_value IS NULL))
            OR ((value IS NULL) AND (cvte_id IS NULL) AND (mate_prop_id IS NULL) AND (samp_prop_id IS NULL) AND (integer_array_value IS NULL) AND (real_array_value IS NULL) AND (string_array_value IS NULL) AND (timestamp_array_value IS NOT NULL) AND (json_value IS NULL))
            OR ((value IS NULL) AND (cvte_id IS NULL) AND (mate_prop_id IS NULL) AND (samp_prop_id IS NULL) AND (integer_array_value IS NULL) AND (real_array_value IS NULL) AND (string_array_value IS NULL) AND (timestamp_array_value IS NULL) AND (json_value IS NOT NULL))
        ))
);
CREATE SEQUENCE data_set_property_id_seq
    START WITH 1
    INCREMENT BY 1
    NO MINVALUE
    NO MAXVALUE
    CACHE 1;
CREATE SEQUENCE data_set_relationship_id_seq
    START WITH 1
    INCREMENT BY 1
    NO MINVALUE
    NO MAXVALUE
    CACHE 1;
CREATE TABLE data_set_relationships_all (
    data_id_parent tech_id NOT NULL,
    data_id_child tech_id NOT NULL,
    del_id tech_id,
    pers_id_author tech_id,
    registration_timestamp time_stamp_dfl DEFAULT now() NOT NULL,
    modification_timestamp time_stamp DEFAULT now(),
    relationship_id tech_id NOT NULL,
    ordinal integer,
    parent_frozen boolean_char DEFAULT false NOT NULL,
    child_frozen boolean_char DEFAULT false NOT NULL,
    comp_frozen boolean_char DEFAULT false NOT NULL,
    cont_frozen boolean_char DEFAULT false NOT NULL
);
CREATE VIEW data_set_relationships AS
 SELECT data_set_relationships_all.data_id_parent,
    data_set_relationships_all.parent_frozen,
    data_set_relationships_all.cont_frozen,
    data_set_relationships_all.data_id_child,
    data_set_relationships_all.child_frozen,
    data_set_relationships_all.comp_frozen,
    data_set_relationships_all.relationship_id,
    data_set_relationships_all.ordinal,
    data_set_relationships_all.del_id,
    data_set_relationships_all.pers_id_author,
    data_set_relationships_all.registration_timestamp,
    data_set_relationships_all.modification_timestamp
   FROM data_set_relationships_all
  WHERE (data_set_relationships_all.del_id IS NULL);
CREATE SEQUENCE data_set_relationships_history_id_seq
    START WITH 1
    INCREMENT BY 1
    NO MINVALUE
    NO MAXVALUE
    CACHE 1;
CREATE SEQUENCE data_set_type_id_seq
    START WITH 1
    INCREMENT BY 1
    NO MINVALUE
    NO MAXVALUE
    CACHE 1;
CREATE TABLE data_set_type_property_types (
    id tech_id NOT NULL,
    dsty_id tech_id NOT NULL,
    prty_id tech_id NOT NULL,
    is_mandatory boolean_char DEFAULT false NOT NULL,
    is_managed_internally boolean_char DEFAULT false NOT NULL,
    pers_id_registerer tech_id NOT NULL,
    registration_timestamp time_stamp_dfl DEFAULT now() NOT NULL,
    section description_2000,
    ordinal ordinal_int NOT NULL,
    script_id tech_id,
    is_shown_edit boolean_char DEFAULT true NOT NULL,
    show_raw_value boolean_char DEFAULT false NOT NULL,
    is_unique boolean_char DEFAULT false NOT NULL
);
CREATE TABLE data_set_types (
    id tech_id NOT NULL,
    code code NOT NULL,
    description description_2000,
    modification_timestamp time_stamp DEFAULT now(),
    main_ds_pattern character varying(300),
    main_ds_path character varying(1000),
    deletion_disallow boolean_char DEFAULT false,
    validation_script_id tech_id
);
CREATE SEQUENCE data_store_id_seq
    START WITH 1
    INCREMENT BY 1
    NO MINVALUE
    NO MAXVALUE
    CACHE 1;
CREATE TABLE data_store_service_data_set_types (
    data_store_service_id tech_id NOT NULL,
    data_set_type_id tech_id NOT NULL
);
CREATE TABLE data_store_services (
    id tech_id NOT NULL,
    key character varying(256) NOT NULL,
    label character varying(256) NOT NULL,
    kind data_store_service_kind NOT NULL,
    data_store_id tech_id NOT NULL,
    reporting_plugin_type data_store_service_reporting_plugin_type
);
CREATE SEQUENCE data_store_services_id_seq
    START WITH 1
    INCREMENT BY 1
    NO MINVALUE
    NO MAXVALUE
    CACHE 1;
CREATE TABLE data_stores (
    id tech_id NOT NULL,
    code code NOT NULL,
    download_url character varying(1024) NOT NULL,
    registration_timestamp time_stamp_dfl DEFAULT now() NOT NULL,
    remote_url character varying(250) NOT NULL,
    session_token character varying(50) NOT NULL,
    modification_timestamp time_stamp DEFAULT now(),
    is_archiver_configured boolean_char DEFAULT false NOT NULL,
    data_source_definitions text_value,
    uuid code NOT NULL
);
CREATE SEQUENCE data_type_id_seq
    START WITH 1
    INCREMENT BY 1
    NO MINVALUE
    NO MAXVALUE
    CACHE 1;
CREATE TABLE data_types (
    id tech_id NOT NULL,
    code code NOT NULL,
    description description_2000 NOT NULL
);
CREATE SEQUENCE database_instance_id_seq
    START WITH 1
    INCREMENT BY 1
    NO MINVALUE
    NO MAXVALUE
    CACHE 1;
CREATE TABLE database_version_logs (
    db_version character varying(4) NOT NULL,
    module_name character varying(250),
    run_status character varying(10),
    run_status_timestamp timestamp without time zone,
    module_code bytea,
    run_exception bytea
);
CREATE SEQUENCE deletion_id_seq
    START WITH 5
    INCREMENT BY 1
    NO MINVALUE
    NO MAXVALUE
    CACHE 1;
CREATE TABLE deletions (
    id tech_id NOT NULL,
    pers_id_registerer tech_id NOT NULL,
    registration_timestamp time_stamp_dfl DEFAULT now() NOT NULL,
    reason description_2000 NOT NULL
);
CREATE SEQUENCE dstpt_id_seq
    START WITH 1
    INCREMENT BY 1
    NO MINVALUE
    NO MAXVALUE
    CACHE 1;
CREATE TABLE entity_operations_log (
    id tech_id NOT NULL,
    registration_id tech_id NOT NULL
);
CREATE SEQUENCE entity_operations_log_id_seq
    START WITH 1
    INCREMENT BY 1
    NO MINVALUE
    NO MAXVALUE
    CACHE 1;
CREATE SEQUENCE etpt_id_seq
    START WITH 1
    INCREMENT BY 1
    NO MINVALUE
    NO MAXVALUE
    CACHE 1;
CREATE SEQUENCE event_id_seq
    START WITH 1
    INCREMENT BY 1
    NO MINVALUE
    NO MAXVALUE
    CACHE 1;
CREATE TABLE events (
    id tech_id NOT NULL,
    event_type event_type NOT NULL,
    description text_value,
    reason description_2000,
    pers_id_registerer tech_id NOT NULL,
    registration_timestamp time_stamp_dfl DEFAULT now() NOT NULL,
    entity_type character varying(80) NOT NULL,
    identifiers text_value NOT NULL,
    content text_value,
    exac_id tech_id,
    CONSTRAINT evnt_et_enum_ck CHECK (((entity_type)::text = ANY (ARRAY[('ATTACHMENT'::character varying)::text, ('DATASET'::character varying)::text, ('EXPERIMENT'::character varying)::text, ('SPACE'::character varying)::text, ('MATERIAL'::character varying)::text, ('PROJECT'::character varying)::text, ('PROPERTY_TYPE'::character varying)::text, ('SAMPLE'::character varying)::text, ('VOCABULARY'::character varying)::text, ('AUTHORIZATION_GROUP'::character varying)::text, ('METAPROJECT'::character varying)::text])))
);
CREATE TABLE events_search (
    id tech_id NOT NULL,
    event_type event_type NOT NULL,
    entity_type text_value NOT NULL,
    entity_space text_value,
    entity_space_perm_id text_value,
    entity_project text_value,
    entity_project_perm_id text_value,
    entity_registerer text_value,
    entity_registration_timestamp time_stamp,
    identifier text_value NOT NULL,
    description text_value,
    reason text_value,
    content text_value,
    exac_id tech_id,
    pers_id_registerer tech_id NOT NULL,
    registration_timestamp time_stamp NOT NULL,
    CONSTRAINT events_search_entity_type_ck CHECK (((entity_type)::text = ANY (ARRAY['ATTACHMENT'::text, 'DATASET'::text, 'EXPERIMENT'::text, 'SPACE'::text, 'MATERIAL'::text, 'PROJECT'::text, 'PROPERTY_TYPE'::text, 'SAMPLE'::text, 'VOCABULARY'::text, 'AUTHORIZATION_GROUP'::text, 'METAPROJECT'::text])))
);
CREATE SEQUENCE events_search_id_seq
    START WITH 1
    INCREMENT BY 1
    NO MINVALUE
    NO MAXVALUE
    CACHE 1;
CREATE SEQUENCE experiment_code_seq
    START WITH 1
    INCREMENT BY 1
    NO MINVALUE
    NO MAXVALUE
    CACHE 1;
CREATE TABLE experiment_properties_history (
    id tech_id NOT NULL,
    expe_id tech_id NOT NULL,
    etpt_id tech_id NOT NULL,
    value text_value,
    valid_until_timestamp time_stamp DEFAULT now(),
    pers_id_author tech_id NOT NULL,
    valid_from_timestamp time_stamp NOT NULL,
    vocabulary_term identifier,
    material identifier,
    sample identifier,
    integer_array_value long_value[],
    real_array_value double_value[],
    string_array_value text_value[],
    timestamp_array_value time_stamp[],
    json_value jsonb,
    CONSTRAINT exprh_ck CHECK ((
        ((value IS NOT NULL) AND (vocabulary_term IS NULL) AND (material IS NULL) AND (sample IS NULL) AND (integer_array_value IS NULL) AND (real_array_value IS NULL) AND (string_array_value IS NULL) AND (timestamp_array_value IS NULL) AND (json_value IS NULL))
            OR ((value IS NULL) AND (vocabulary_term IS NOT NULL) AND (material IS NULL) AND (sample IS NULL) AND (integer_array_value IS NULL) AND (real_array_value IS NULL) AND (string_array_value IS NULL) AND (timestamp_array_value IS NULL) AND (json_value IS NULL))
            OR ((value IS NULL) AND (vocabulary_term IS NULL) AND (material IS NOT NULL) AND (sample IS NULL) AND (integer_array_value IS NULL) AND (real_array_value IS NULL) AND (string_array_value IS NULL) AND (timestamp_array_value IS NULL) AND (json_value IS NULL))
            OR ((value IS NULL) AND (vocabulary_term IS NULL) AND (material IS NULL) AND (sample IS NOT NULL) AND (integer_array_value IS NULL) AND (real_array_value IS NULL) AND (string_array_value IS NULL) AND (timestamp_array_value IS NULL) AND (json_value IS NULL))
            OR ((value IS NULL) AND (vocabulary_term IS NULL) AND (material IS NULL) AND (sample IS NULL) AND (integer_array_value IS NOT NULL) AND (real_array_value IS NULL) AND (string_array_value IS NULL) AND (timestamp_array_value IS NULL) AND (json_value IS NULL))
            OR ((value IS NULL) AND (vocabulary_term IS NULL) AND (material IS NULL) AND (sample IS NULL) AND (integer_array_value IS NULL) AND (real_array_value IS NOT NULL) AND (string_array_value IS NULL) AND (timestamp_array_value IS NULL) AND (json_value IS NULL))
            OR ((value IS NULL) AND (vocabulary_term IS NULL) AND (material IS NULL) AND (sample IS NULL) AND (integer_array_value IS NULL) AND (real_array_value IS NULL) AND (string_array_value IS NOT NULL) AND (timestamp_array_value IS NULL) AND (json_value IS NULL))
            OR ((value IS NULL) AND (vocabulary_term IS NULL) AND (material IS NULL) AND (sample IS NULL) AND (integer_array_value IS NULL) AND (real_array_value IS NULL) AND (string_array_value IS NULL) AND (timestamp_array_value IS NOT NULL) AND (json_value IS NULL))
            OR ((value IS NULL) AND (vocabulary_term IS NULL) AND (material IS NULL) AND (sample IS NULL) AND (integer_array_value IS NULL) AND (real_array_value IS NULL) AND (string_array_value IS NULL) AND (timestamp_array_value IS NULL) AND (json_value IS NOT NULL))
        ))
);
CREATE TABLE experiment_relationships_history (
    id tech_id NOT NULL,
    main_expe_id tech_id NOT NULL,
    relation_type text_value,
    samp_id tech_id,
    data_id tech_id,
    entity_perm_id text_value,
    pers_id_author tech_id,
    valid_from_timestamp time_stamp NOT NULL,
    valid_until_timestamp time_stamp,
    proj_id tech_id,
    entity_kind text_value
);
CREATE VIEW experiment_history_view AS
 SELECT (2 * (experiment_relationships_history.id)::bigint) AS id,
    experiment_relationships_history.main_expe_id,
    experiment_relationships_history.relation_type,
    experiment_relationships_history.proj_id,
    experiment_relationships_history.samp_id,
    experiment_relationships_history.data_id,
    experiment_relationships_history.entity_kind,
    experiment_relationships_history.entity_perm_id,
    NULL::bigint AS etpt_id,
    NULL::text AS value,
    NULL::character varying AS vocabulary_term,
    NULL::character varying AS material,
    NULL::character varying AS sample,
    experiment_relationships_history.pers_id_author,
    experiment_relationships_history.valid_from_timestamp,
    experiment_relationships_history.valid_until_timestamp,
    NULL::long_value[] AS integer_array_value,
    NULL::double_value[] AS real_array_value,
    NULL::text_value[] AS string_array_value,
    NULL::time_stamp[] AS timestamp_array_value,
    NULL::jsonb AS json_value
   FROM experiment_relationships_history
  WHERE (experiment_relationships_history.valid_until_timestamp IS NOT NULL)
UNION
 SELECT ((2 * (experiment_properties_history.id)::bigint) + 1) AS id,
    experiment_properties_history.expe_id AS main_expe_id,
    NULL::text AS relation_type,
    NULL::bigint AS proj_id,
    NULL::bigint AS samp_id,
    NULL::bigint AS data_id,
    NULL::text AS entity_kind,
    NULL::text AS entity_perm_id,
    experiment_properties_history.etpt_id,
    experiment_properties_history.value,
    experiment_properties_history.vocabulary_term,
    experiment_properties_history.material,
    experiment_properties_history.sample,
    experiment_properties_history.pers_id_author,
    experiment_properties_history.valid_from_timestamp,
    experiment_properties_history.valid_until_timestamp,
    experiment_properties_history.integer_array_value,
    experiment_properties_history.real_array_value,
    experiment_properties_history.string_array_value,
    experiment_properties_history.timestamp_array_value,
    experiment_properties_history.json_value
   FROM experiment_properties_history;
CREATE SEQUENCE experiment_id_seq
    START WITH 1
    INCREMENT BY 1
    NO MINVALUE
    NO MAXVALUE
    CACHE 1;
CREATE TABLE experiment_properties (
    id tech_id NOT NULL,
    expe_id tech_id NOT NULL,
    etpt_id tech_id NOT NULL,
    value text_value,
    cvte_id tech_id,
    pers_id_registerer tech_id NOT NULL,
    registration_timestamp time_stamp_dfl DEFAULT now() NOT NULL,
    modification_timestamp time_stamp DEFAULT now(),
    mate_prop_id tech_id,
    pers_id_author tech_id NOT NULL,
    expe_frozen boolean_char DEFAULT false NOT NULL,
    samp_prop_id tech_id,
    tsvector_document tsvector NOT NULL,
    is_unique boolean_char DEFAULT false NOT NULL,
    integer_array_value long_value[],
    real_array_value double_value[],
    string_array_value text_value[],
    timestamp_array_value time_stamp[],
    json_value jsonb,
    CONSTRAINT expr_ck CHECK ((
        ((value IS NOT NULL) AND (cvte_id IS NULL) AND (mate_prop_id IS NULL) AND (samp_prop_id IS NULL) AND (integer_array_value IS NULL) AND (real_array_value IS NULL) AND (string_array_value IS NULL) AND (timestamp_array_value IS NULL) AND (json_value IS NULL))
            OR ((value IS NULL) AND (cvte_id IS NOT NULL) AND (mate_prop_id IS NULL) AND (samp_prop_id IS NULL) AND (integer_array_value IS NULL) AND (real_array_value IS NULL) AND (string_array_value IS NULL) AND (timestamp_array_value IS NULL) AND (json_value IS NULL))
            OR ((value IS NULL) AND (cvte_id IS NULL) AND (mate_prop_id IS NOT NULL) AND (samp_prop_id IS NULL) AND (integer_array_value IS NULL) AND (real_array_value IS NULL) AND (string_array_value IS NULL) AND (timestamp_array_value IS NULL) AND (json_value IS NULL))
            OR ((value IS NULL) AND (cvte_id IS NULL) AND (mate_prop_id IS NULL) AND (samp_prop_id IS NOT NULL) AND (integer_array_value IS NULL) AND (real_array_value IS NULL) AND (string_array_value IS NULL) AND (timestamp_array_value IS NULL) AND (json_value IS NULL))
            OR ((value IS NULL) AND (cvte_id IS NULL) AND (mate_prop_id IS NULL) AND (samp_prop_id IS NULL) AND (integer_array_value IS NOT NULL) AND (real_array_value IS NULL) AND (string_array_value IS NULL) AND (timestamp_array_value IS NULL) AND (json_value IS NULL))
            OR ((value IS NULL) AND (cvte_id IS NULL) AND (mate_prop_id IS NULL) AND (samp_prop_id IS NULL) AND (integer_array_value IS NULL) AND (real_array_value IS NOT NULL) AND (string_array_value IS NULL) AND (timestamp_array_value IS NULL) AND (json_value IS NULL))
            OR ((value IS NULL) AND (cvte_id IS NULL) AND (mate_prop_id IS NULL) AND (samp_prop_id IS NULL) AND (integer_array_value IS NULL) AND (real_array_value IS NULL) AND (string_array_value IS NOT NULL) AND (timestamp_array_value IS NULL) AND (json_value IS NULL))
            OR ((value IS NULL) AND (cvte_id IS NULL) AND (mate_prop_id IS NULL) AND (samp_prop_id IS NULL) AND (integer_array_value IS NULL) AND (real_array_value IS NULL) AND (string_array_value IS NULL) AND (timestamp_array_value IS NOT NULL) AND (json_value IS NULL))
            OR ((value IS NULL) AND (cvte_id IS NULL) AND (mate_prop_id IS NULL) AND (samp_prop_id IS NULL) AND (integer_array_value IS NULL) AND (real_array_value IS NULL) AND (string_array_value IS NULL) AND (timestamp_array_value IS NULL) AND (json_value IS NOT NULL))
        ))
);
CREATE SEQUENCE experiment_property_id_seq
    START WITH 1
    INCREMENT BY 1
    NO MINVALUE
    NO MAXVALUE
    CACHE 1;
CREATE SEQUENCE experiment_relationships_history_id_seq
    START WITH 1
    INCREMENT BY 1
    NO MINVALUE
    NO MAXVALUE
    CACHE 1;
CREATE SEQUENCE experiment_type_id_seq
    START WITH 1
    INCREMENT BY 1
    NO MINVALUE
    NO MAXVALUE
    CACHE 1;
CREATE TABLE experiment_type_property_types (
    id tech_id NOT NULL,
    exty_id tech_id NOT NULL,
    prty_id tech_id NOT NULL,
    is_mandatory boolean_char DEFAULT false NOT NULL,
    is_managed_internally boolean_char DEFAULT false NOT NULL,
    pers_id_registerer tech_id NOT NULL,
    registration_timestamp time_stamp_dfl DEFAULT now() NOT NULL,
    section description_2000,
    ordinal ordinal_int NOT NULL,
    script_id tech_id,
    is_shown_edit boolean_char DEFAULT true NOT NULL,
    show_raw_value boolean_char DEFAULT false NOT NULL,
    is_unique boolean_char DEFAULT false NOT NULL
);
CREATE TABLE experiment_types (
    id tech_id NOT NULL,
    code code NOT NULL,
    description description_2000,
    modification_timestamp time_stamp DEFAULT now(),
    validation_script_id tech_id
);
CREATE TABLE experiments_all (
    id tech_id NOT NULL,
    code code NOT NULL,
    exty_id tech_id NOT NULL,
    pers_id_registerer tech_id NOT NULL,
    registration_timestamp time_stamp_dfl DEFAULT now() NOT NULL,
    proj_id tech_id NOT NULL,
    del_id tech_id,
    is_public boolean_char DEFAULT false NOT NULL,
    modification_timestamp time_stamp DEFAULT now(),
    perm_id code NOT NULL,
    pers_id_modifier tech_id,
    version integer DEFAULT 0,
    orig_del tech_id,
    frozen boolean_char DEFAULT false NOT NULL,
    proj_frozen boolean_char DEFAULT false NOT NULL,
    frozen_for_samp boolean_char DEFAULT false NOT NULL,
    frozen_for_data boolean_char DEFAULT false NOT NULL,
    tsvector_document tsvector NOT NULL
);
CREATE VIEW experiments AS
 SELECT experiments_all.id,
    experiments_all.perm_id,
    experiments_all.code,
    experiments_all.exty_id,
    experiments_all.pers_id_registerer,
    experiments_all.pers_id_modifier,
    experiments_all.registration_timestamp,
    experiments_all.modification_timestamp,
    experiments_all.proj_id,
    experiments_all.proj_frozen,
    experiments_all.del_id,
    experiments_all.orig_del,
    experiments_all.is_public,
    experiments_all.version,
    experiments_all.frozen,
    experiments_all.frozen_for_samp,
    experiments_all.frozen_for_data,
    experiments_all.tsvector_document
   FROM experiments_all
  WHERE (experiments_all.del_id IS NULL);
CREATE VIEW experiments_deleted AS
 SELECT experiments_all.id,
    experiments_all.perm_id,
    experiments_all.code,
    experiments_all.exty_id,
    experiments_all.pers_id_registerer,
    experiments_all.pers_id_modifier,
    experiments_all.registration_timestamp,
    experiments_all.modification_timestamp,
    experiments_all.proj_id,
    experiments_all.del_id,
    experiments_all.orig_del,
    experiments_all.is_public,
    experiments_all.version
   FROM experiments_all
  WHERE (experiments_all.del_id IS NOT NULL);
CREATE TABLE external_data (
    id tech_id NOT NULL,
    location character varying(1024) NOT NULL,
    ffty_id tech_id NOT NULL,
    loty_id tech_id NOT NULL,
    cvte_id_stor_fmt tech_id NOT NULL,
    is_complete boolean_char_or_unknown DEFAULT 'U'::bpchar NOT NULL,
    cvte_id_store tech_id,
    status archiving_status DEFAULT 'AVAILABLE'::character varying NOT NULL,
    share_id code,
    size ordinal_int,
    present_in_archive boolean_char DEFAULT false,
    speed_hint integer DEFAULT '-50'::integer NOT NULL,
    storage_confirmation boolean_char DEFAULT false NOT NULL,
    h5_folders boolean_char NOT NULL,
    h5ar_folders boolean_char NOT NULL,
    archiving_requested boolean_char DEFAULT false NOT NULL
);
CREATE SEQUENCE external_data_management_system_id_seq
    START WITH 1
    INCREMENT BY 1
    NO MINVALUE
    NO MAXVALUE
    CACHE 1;
CREATE TABLE external_data_management_systems (
    id tech_id NOT NULL,
    code code NOT NULL,
    label text_value,
    address text_value NOT NULL,
    address_type edms_address_type NOT NULL
);
CREATE SEQUENCE file_format_type_id_seq
    START WITH 1
    INCREMENT BY 1
    NO MINVALUE
    NO MAXVALUE
    CACHE 1;
CREATE TABLE file_format_types (
    id tech_id NOT NULL,
    code code NOT NULL,
    description description_2000
);
CREATE SEQUENCE filter_id_seq
    START WITH 1
    INCREMENT BY 1
    NO MINVALUE
    NO MAXVALUE
    CACHE 1;
CREATE TABLE filters (
    id tech_id NOT NULL,
    name character varying(200) NOT NULL,
    description description_2000,
    registration_timestamp time_stamp_dfl DEFAULT now() NOT NULL,
    pers_id_registerer tech_id NOT NULL,
    modification_timestamp time_stamp DEFAULT now(),
    expression text NOT NULL,
    is_public boolean NOT NULL,
    grid_id character varying(200) NOT NULL
);
CREATE TABLE grid_custom_columns (
    id tech_id NOT NULL,
    code character varying(200) NOT NULL,
    label column_label NOT NULL,
    description description_2000,
    registration_timestamp time_stamp_dfl DEFAULT now() NOT NULL,
    pers_id_registerer tech_id NOT NULL,
    modification_timestamp time_stamp DEFAULT now(),
    expression grid_expression NOT NULL,
    is_public boolean NOT NULL,
    grid_id grid_id NOT NULL
);
CREATE SEQUENCE grid_custom_columns_id_seq
    START WITH 1
    INCREMENT BY 1
    NO MINVALUE
    NO MAXVALUE
    CACHE 1;
CREATE TABLE link_data (
    id tech_id NOT NULL,
    data_frozen boolean_char DEFAULT false NOT NULL
);
CREATE SEQUENCE locator_type_id_seq
    START WITH 1
    INCREMENT BY 1
    NO MINVALUE
    NO MAXVALUE
    CACHE 1;
CREATE TABLE locator_types (
    id tech_id NOT NULL,
    code code NOT NULL,
    description description_2000
);
CREATE SEQUENCE material_id_seq
    START WITH 1
    INCREMENT BY 1
    NO MINVALUE
    NO MAXVALUE
    CACHE 1;
CREATE TABLE material_properties (
    id tech_id NOT NULL,
    mate_id tech_id NOT NULL,
    mtpt_id tech_id NOT NULL,
    value text_value,
    registration_timestamp time_stamp_dfl DEFAULT now() NOT NULL,
    pers_id_registerer tech_id NOT NULL,
    cvte_id tech_id,
    modification_timestamp time_stamp DEFAULT now(),
    mate_prop_id tech_id,
    pers_id_author tech_id NOT NULL,
    tsvector_document tsvector NOT NULL,
    is_unique boolean_char DEFAULT false NOT NULL,
    integer_array_value long_value[],
    real_array_value double_value[],
    string_array_value text_value[],
    timestamp_array_value time_stamp[],
    json_value jsonb,
    CONSTRAINT mapr_ck CHECK ((
            ((value IS NOT NULL) AND (cvte_id IS NULL) AND (mate_prop_id IS NULL) AND (integer_array_value IS NULL) AND (real_array_value IS NULL) AND (string_array_value IS NULL) AND (timestamp_array_value IS NULL) AND (json_value IS NULL))
                OR ((value IS NULL) AND (cvte_id IS NOT NULL) AND (mate_prop_id IS NULL) AND (integer_array_value IS NULL) AND (real_array_value IS NULL) AND (string_array_value IS NULL) AND (timestamp_array_value IS NULL) AND (json_value IS NULL))
                OR ((value IS NULL) AND (cvte_id IS NULL) AND (mate_prop_id IS NOT NULL) AND (integer_array_value IS NULL) AND (real_array_value IS NULL) AND (string_array_value IS NULL) AND (timestamp_array_value IS NULL) AND (json_value IS NULL))
                OR ((value IS NULL) AND (cvte_id IS NULL) AND (mate_prop_id IS NULL) AND (integer_array_value IS NOT NULL) AND (real_array_value IS NULL) AND (string_array_value IS NULL) AND (timestamp_array_value IS NULL) AND (json_value IS NULL))
                OR ((value IS NULL) AND (cvte_id IS NULL) AND (mate_prop_id IS NULL) AND (integer_array_value IS NULL) AND (real_array_value IS NOT NULL) AND (string_array_value IS NULL) AND (timestamp_array_value IS NULL) AND (json_value IS NULL))
                OR ((value IS NULL) AND (cvte_id IS NULL) AND (mate_prop_id IS NULL) AND (integer_array_value IS NULL) AND (real_array_value IS NULL) AND (string_array_value IS NOT NULL) AND (timestamp_array_value IS NULL) AND (json_value IS NULL))
                OR ((value IS NULL) AND (cvte_id IS NULL) AND (mate_prop_id IS NULL) AND (integer_array_value IS NULL) AND (real_array_value IS NULL) AND (string_array_value IS NULL) AND (timestamp_array_value IS NOT NULL) AND (json_value IS NULL))
                OR ((value IS NULL) AND (cvte_id IS NULL) AND (mate_prop_id IS NULL) AND (integer_array_value IS NULL) AND (real_array_value IS NULL) AND (string_array_value IS NULL) AND (timestamp_array_value IS NULL) AND (json_value IS NOT NULL))
        ))
);
CREATE TABLE material_properties_history (
    id tech_id NOT NULL,
    mate_id tech_id NOT NULL,
    mtpt_id tech_id NOT NULL,
    value text_value,
    valid_until_timestamp time_stamp DEFAULT now(),
    pers_id_author tech_id NOT NULL,
    valid_from_timestamp time_stamp NOT NULL,
    vocabulary_term identifier,
    material identifier,
    integer_array_value long_value[],
    real_array_value double_value[],
    string_array_value text_value[],
    timestamp_array_value time_stamp[],
    json_value jsonb,
    CONSTRAINT maprh_ck CHECK ((
            ((value IS NOT NULL) AND (vocabulary_term IS NULL) AND (material IS NULL) AND (integer_array_value IS NULL) AND (real_array_value IS NULL) AND (string_array_value IS NULL) AND (timestamp_array_value IS NULL) AND (json_value IS NULL))
                OR ((value IS NULL) AND (vocabulary_term IS NOT NULL) AND (material IS NULL) AND (integer_array_value IS NULL) AND (real_array_value IS NULL) AND (string_array_value IS NULL) AND (timestamp_array_value IS NULL) AND (json_value IS NULL))
                OR ((value IS NULL) AND (vocabulary_term IS NULL) AND (material IS NOT NULL) AND (integer_array_value IS NULL) AND (real_array_value IS NULL) AND (string_array_value IS NULL) AND (timestamp_array_value IS NULL) AND (json_value IS NULL))
                OR ((value IS NULL) AND (vocabulary_term IS NULL) AND (material IS NULL) AND (integer_array_value IS NOT NULL) AND (real_array_value IS NULL) AND (string_array_value IS NULL) AND (timestamp_array_value IS NULL) AND (json_value IS NULL))
                OR ((value IS NULL) AND (vocabulary_term IS NULL) AND (material IS NULL) AND (integer_array_value IS NULL) AND (real_array_value IS NOT NULL) AND (string_array_value IS NULL) AND (timestamp_array_value IS NULL) AND (json_value IS NULL))
                OR ((value IS NULL) AND (vocabulary_term IS NULL) AND (material IS NULL) AND (integer_array_value IS NULL) AND (real_array_value IS NULL) AND (string_array_value IS NOT NULL) AND (timestamp_array_value IS NULL) AND (json_value IS NULL))
                OR ((value IS NULL) AND (vocabulary_term IS NULL) AND (material IS NULL) AND (integer_array_value IS NULL) AND (real_array_value IS NULL) AND (string_array_value IS NULL) AND (timestamp_array_value IS NOT NULL) AND (json_value IS NULL))
                OR ((value IS NULL) AND (vocabulary_term IS NULL) AND (material IS NULL) AND (integer_array_value IS NULL) AND (real_array_value IS NULL) AND (string_array_value IS NULL) AND (timestamp_array_value IS NULL) AND (json_value IS NOT NULL))
        ))
);
CREATE SEQUENCE material_property_id_seq
    START WITH 1
    INCREMENT BY 1
    NO MINVALUE
    NO MAXVALUE
    CACHE 1;
CREATE SEQUENCE material_type_id_seq
    START WITH 1
    INCREMENT BY 1
    NO MINVALUE
    NO MAXVALUE
    CACHE 1;
CREATE TABLE material_type_property_types (
    id tech_id NOT NULL,
    maty_id tech_id NOT NULL,
    prty_id tech_id NOT NULL,
    is_mandatory boolean_char DEFAULT false NOT NULL,
    is_managed_internally boolean_char DEFAULT false NOT NULL,
    registration_timestamp time_stamp_dfl DEFAULT now() NOT NULL,
    pers_id_registerer tech_id NOT NULL,
    section description_2000,
    ordinal ordinal_int NOT NULL,
    script_id tech_id,
    is_shown_edit boolean_char DEFAULT true NOT NULL,
    show_raw_value boolean_char DEFAULT false NOT NULL,
    is_unique boolean_char DEFAULT false NOT NULL
);
CREATE TABLE material_types (
    id tech_id NOT NULL,
    code code NOT NULL,
    description description_2000,
    modification_timestamp time_stamp DEFAULT now(),
    validation_script_id tech_id
);
CREATE TABLE materials (
    id tech_id NOT NULL,
    code code NOT NULL,
    maty_id tech_id NOT NULL,
    pers_id_registerer tech_id NOT NULL,
    registration_timestamp time_stamp_dfl DEFAULT now() NOT NULL,
    modification_timestamp time_stamp DEFAULT now(),
    tsvector_document tsvector NOT NULL
);
CREATE SEQUENCE metaproject_assignment_id_seq
    START WITH 1
    INCREMENT BY 1
    NO MINVALUE
    NO MAXVALUE
    CACHE 1;
CREATE TABLE metaproject_assignments_all (
    id tech_id NOT NULL,
    mepr_id tech_id NOT NULL,
    expe_id tech_id,
    samp_id tech_id,
    data_id tech_id,
    mate_id tech_id,
    del_id tech_id,
    creation_date time_stamp_dfl DEFAULT now() NOT NULL,
    CONSTRAINT metaproject_assignments_all_check_nn CHECK ((((expe_id IS NOT NULL) AND (samp_id IS NULL) AND (data_id IS NULL) AND (mate_id IS NULL)) OR ((expe_id IS NULL) AND (samp_id IS NOT NULL) AND (data_id IS NULL) AND (mate_id IS NULL)) OR ((expe_id IS NULL) AND (samp_id IS NULL) AND (data_id IS NOT NULL) AND (mate_id IS NULL)) OR ((expe_id IS NULL) AND (samp_id IS NULL) AND (data_id IS NULL) AND (mate_id IS NOT NULL))))
);
CREATE VIEW metaproject_assignments AS
 SELECT metaproject_assignments_all.id,
    metaproject_assignments_all.mepr_id,
    metaproject_assignments_all.expe_id,
    metaproject_assignments_all.samp_id,
    metaproject_assignments_all.data_id,
    metaproject_assignments_all.mate_id,
    metaproject_assignments_all.del_id,
    metaproject_assignments_all.creation_date
   FROM metaproject_assignments_all
  WHERE (metaproject_assignments_all.del_id IS NULL);
CREATE SEQUENCE metaproject_id_seq
    START WITH 1
    INCREMENT BY 1
    NO MINVALUE
    NO MAXVALUE
    CACHE 1;
CREATE TABLE metaprojects (
    id tech_id NOT NULL,
    name code NOT NULL,
    description description_2000,
    owner tech_id NOT NULL,
    private boolean_char DEFAULT true NOT NULL,
    creation_date time_stamp_dfl DEFAULT now() NOT NULL
);
CREATE SEQUENCE mtpt_id_seq
    START WITH 1
    INCREMENT BY 1
    NO MINVALUE
    NO MAXVALUE
    CACHE 1;
CREATE TABLE operation_executions (
    id tech_id NOT NULL,
    code code NOT NULL,
    state operation_execution_state DEFAULT 'NEW'::character varying NOT NULL,
    owner tech_id NOT NULL,
    description text_value,
    notification text_value,
    availability operation_execution_availability DEFAULT 'AVAILABLE'::character varying NOT NULL,
    availability_time bigint DEFAULT 1 NOT NULL,
    summary_operations text_value,
    summary_progress text_value,
    summary_error text_value,
    summary_results text_value,
    summary_availability operation_execution_availability DEFAULT 'AVAILABLE'::character varying NOT NULL,
    summary_availability_time bigint DEFAULT 1 NOT NULL,
    details_path character varying(1000),
    details_availability operation_execution_availability DEFAULT 'AVAILABLE'::character varying NOT NULL,
    details_availability_time bigint DEFAULT 1 NOT NULL,
    creation_date time_stamp_dfl NOT NULL,
    start_date time_stamp,
    finish_date time_stamp,
    CONSTRAINT operation_executions_state_finish_date_check CHECK (((((state)::text = ANY (ARRAY[('NEW'::character varying)::text, ('SCHEDULED'::character varying)::text, ('RUNNING'::character varying)::text])) AND (finish_date IS NULL)) OR (((state)::text = ANY (ARRAY[('FINISHED'::character varying)::text, ('FAILED'::character varying)::text])) AND (finish_date IS NOT NULL)))),
    CONSTRAINT operation_executions_state_start_date_check CHECK (((((state)::text = ANY (ARRAY[('NEW'::character varying)::text, ('SCHEDULED'::character varying)::text])) AND (start_date IS NULL)) OR (((state)::text = ANY (ARRAY[('RUNNING'::character varying)::text, ('FINISHED'::character varying)::text, ('FAILED'::character varying)::text])) AND (start_date IS NOT NULL))))
);
CREATE SEQUENCE operation_executions_id_seq
    START WITH 1
    INCREMENT BY 1
    NO MINVALUE
    NO MAXVALUE
    CACHE 1;
CREATE SEQUENCE perm_id_seq
    START WITH 1
    INCREMENT BY 1
    NO MINVALUE
    NO MAXVALUE
    CACHE 1;
CREATE SEQUENCE person_id_seq
    START WITH 1
    INCREMENT BY 1
    NO MINVALUE
    NO MAXVALUE
    CACHE 1;
CREATE TABLE persons (
    id tech_id NOT NULL,
    first_name character varying(30),
    last_name character varying(30),
    user_id user_id NOT NULL,
    email object_name,
    space_id tech_id,
    registration_timestamp time_stamp_dfl DEFAULT now() NOT NULL,
    pers_id_registerer tech_id,
    display_settings file,
    is_active boolean DEFAULT true
);
CREATE TABLE post_registration_dataset_queue (
    id tech_id NOT NULL,
    ds_id tech_id NOT NULL
);
CREATE SEQUENCE post_registration_dataset_queue_id_seq
    START WITH 1
    INCREMENT BY 1
    NO MINVALUE
    NO MAXVALUE
    CACHE 1;
CREATE SEQUENCE project_id_seq
    START WITH 1
    INCREMENT BY 1
    NO MINVALUE
    NO MAXVALUE
    CACHE 1;
CREATE TABLE project_relationships_history (
    id tech_id NOT NULL,
    main_proj_id tech_id NOT NULL,
    relation_type text_value,
    expe_id tech_id,
    space_id tech_id,
    entity_perm_id text_value,
    pers_id_author tech_id,
    valid_from_timestamp time_stamp NOT NULL,
    valid_until_timestamp time_stamp,
    entity_kind text_value,
    samp_id tech_id
);
CREATE SEQUENCE project_relationships_history_id_seq
    START WITH 1
    INCREMENT BY 1
    NO MINVALUE
    NO MAXVALUE
    CACHE 1;
CREATE TABLE projects (
    id tech_id NOT NULL,
    perm_id code NOT NULL,
    code code NOT NULL,
    space_id tech_id NOT NULL,
    pers_id_leader tech_id,
    description text_value,
Loading
Loading full blame...