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;
$$;
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,
    pers_id_registerer tech_id NOT NULL,
    registration_timestamp time_stamp_dfl DEFAULT now() NOT NULL,
    modification_timestamp time_stamp DEFAULT now(),
    pers_id_modifier tech_id,
    version integer DEFAULT 0,
    frozen boolean_char DEFAULT false NOT NULL,
    frozen_for_exp boolean_char DEFAULT false NOT NULL,
    frozen_for_samp boolean_char DEFAULT false NOT NULL,
    space_frozen boolean_char DEFAULT false NOT NULL
);
CREATE SEQUENCE property_type_id_seq
    START WITH 1
    INCREMENT BY 1
    NO MINVALUE
    NO MAXVALUE
    CACHE 1;
CREATE TABLE property_types (
    id tech_id NOT NULL,
    code code NOT NULL,
    description description_2000 NOT NULL,
    label column_label NOT NULL,
    daty_id tech_id NOT NULL,
    registration_timestamp time_stamp_dfl DEFAULT now() NOT NULL,
    pers_id_registerer tech_id NOT NULL,
    covo_id tech_id,
    is_managed_internally boolean_char DEFAULT false NOT NULL,
    maty_prop_id tech_id,
    schema text_value,
    transformation text_value,
    meta_data jsonb,
    saty_prop_id tech_id
);
CREATE TABLE queries (
    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,
    query_type query_type NOT NULL,
    db_key code DEFAULT '1'::character varying NOT NULL,
    entity_type_code code
);
CREATE SEQUENCE query_id_seq
    START WITH 1
    INCREMENT BY 1
    NO MINVALUE
    NO MAXVALUE
    CACHE 1;
CREATE SEQUENCE relationship_type_id_seq
    START WITH 1
    INCREMENT BY 1
    NO MINVALUE
    NO MAXVALUE
    CACHE 1;
CREATE TABLE relationship_types (
    id tech_id NOT NULL,
    code code NOT NULL,
    label column_label,
    parent_label column_label,
    child_label column_label,
    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
);
CREATE SEQUENCE role_assignment_id_seq
    START WITH 1
    INCREMENT BY 1
    NO MINVALUE
    NO MAXVALUE
    CACHE 1;
CREATE TABLE role_assignments (
    id tech_id NOT NULL,
    role_code authorization_role NOT NULL,
    space_id tech_id,
    pers_id_grantee tech_id,
    pers_id_registerer tech_id NOT NULL,
    registration_timestamp time_stamp_dfl DEFAULT now() NOT NULL,
    ag_id_grantee tech_id,
    project_id tech_id,
    CONSTRAINT roas_ag_pers_arc_ck CHECK ((((ag_id_grantee IS NOT NULL) AND (pers_id_grantee IS NULL)) OR ((ag_id_grantee IS NULL) AND (pers_id_grantee IS NOT NULL)))),
    CONSTRAINT roas_space_project_ck CHECK (((space_id IS NULL) OR (project_id IS NULL)))
);
CREATE SEQUENCE sample_code_seq
    START WITH 1
    INCREMENT BY 1
    NO MINVALUE
    NO MAXVALUE
    CACHE 1;
CREATE TABLE sample_properties_history (
    id tech_id NOT NULL,
    samp_id tech_id NOT NULL,
    stpt_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 saprh_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 sample_relationships_history (
    id tech_id NOT NULL,
    main_samp_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,
    space_id tech_id,
    proj_id tech_id,
    annotations jsonb,
    entity_kind text_value
);
CREATE VIEW sample_history_view AS
 SELECT (2 * (sample_relationships_history.id)::bigint) AS id,
    sample_relationships_history.main_samp_id,
    sample_relationships_history.relation_type,
    sample_relationships_history.space_id,
    sample_relationships_history.expe_id,
    sample_relationships_history.samp_id,
    sample_relationships_history.proj_id,
    sample_relationships_history.data_id,
    sample_relationships_history.entity_kind,
    sample_relationships_history.entity_perm_id,
    sample_relationships_history.annotations,
    NULL::bigint AS stpt_id,
    NULL::text AS value,
    NULL::character varying AS vocabulary_term,
    NULL::character varying AS material,
    NULL::character varying AS sample,
    sample_relationships_history.pers_id_author,
    sample_relationships_history.valid_from_timestamp,
    sample_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 sample_relationships_history
  WHERE (sample_relationships_history.valid_until_timestamp IS NOT NULL)
UNION
 SELECT ((2 * (sample_properties_history.id)::bigint) + 1) AS id,
    sample_properties_history.samp_id AS main_samp_id,
    NULL::text AS relation_type,
    NULL::bigint AS space_id,
    NULL::bigint AS expe_id,
    NULL::bigint AS samp_id,
    NULL::bigint AS proj_id,
    NULL::bigint AS data_id,
    NULL::text AS entity_kind,
    NULL::text AS entity_perm_id,
    NULL::jsonb AS annotations,
    sample_properties_history.stpt_id,
    sample_properties_history.value,
    sample_properties_history.vocabulary_term,
    sample_properties_history.material,
    sample_properties_history.sample,
    sample_properties_history.pers_id_author,
    sample_properties_history.valid_from_timestamp,
    sample_properties_history.valid_until_timestamp,
    sample_properties_history.integer_array_value,
    sample_properties_history.real_array_value,
    sample_properties_history.string_array_value,
    sample_properties_history.timestamp_array_value,
    sample_properties_history.json_value
   FROM sample_properties_history;
CREATE SEQUENCE sample_id_seq
    START WITH 1
    INCREMENT BY 1
    NO MINVALUE
    NO MAXVALUE
    CACHE 1;
CREATE TABLE sample_properties (
    id tech_id NOT NULL,
    samp_id tech_id NOT NULL,
    stpt_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,
    samp_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 sapr_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 sample_property_id_seq
    START WITH 1
    INCREMENT BY 1
    NO MINVALUE
    NO MAXVALUE
    CACHE 1;
CREATE SEQUENCE sample_relationship_id_seq
    START WITH 1
    INCREMENT BY 1
    NO MINVALUE
    NO MAXVALUE
    CACHE 1;
CREATE TABLE sample_relationships_all (
    id tech_id NOT NULL,
    sample_id_parent tech_id NOT NULL,
    relationship_id tech_id NOT NULL,
    sample_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(),
    parent_frozen boolean_char DEFAULT false NOT NULL,
    child_frozen boolean_char DEFAULT false NOT NULL,
    child_annotations jsonb,
    parent_annotations jsonb
);
CREATE VIEW sample_relationships AS
 SELECT sample_relationships_all.id,
    sample_relationships_all.sample_id_parent,
    sample_relationships_all.parent_frozen,
    sample_relationships_all.relationship_id,
    sample_relationships_all.sample_id_child,
    sample_relationships_all.child_frozen,
    sample_relationships_all.del_id,
    sample_relationships_all.pers_id_author,
    sample_relationships_all.registration_timestamp,
    sample_relationships_all.modification_timestamp,
    sample_relationships_all.child_annotations,
    sample_relationships_all.parent_annotations
   FROM sample_relationships_all
  WHERE (sample_relationships_all.del_id IS NULL);
CREATE SEQUENCE sample_relationships_history_id_seq
    START WITH 1
    INCREMENT BY 1
    NO MINVALUE
    NO MAXVALUE
    CACHE 1;
CREATE SEQUENCE sample_type_id_seq
    START WITH 1
    INCREMENT BY 1
    NO MINVALUE
    NO MAXVALUE
    CACHE 1;
CREATE TABLE sample_type_property_types (
    id tech_id NOT NULL,
    saty_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,
    is_displayed boolean_char DEFAULT true 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 sample_types (
    id tech_id NOT NULL,
    code code NOT NULL,
    description description_2000,
    is_listable boolean_char DEFAULT true NOT NULL,
    generated_from_depth integer DEFAULT 0 NOT NULL,
    part_of_depth integer DEFAULT 0 NOT NULL,
    modification_timestamp time_stamp DEFAULT now(),
    is_auto_generated_code boolean_char DEFAULT false NOT NULL,
    generated_code_prefix code DEFAULT 'S'::character varying NOT NULL,
    is_subcode_unique boolean_char DEFAULT false NOT NULL,
    inherit_properties boolean_char DEFAULT false NOT NULL,
    validation_script_id tech_id,
    show_parent_metadata boolean_char DEFAULT false NOT NULL
);
CREATE TABLE samples_all (
    id tech_id NOT NULL,
    code code NOT NULL,
    saty_id tech_id NOT NULL,
    registration_timestamp time_stamp_dfl DEFAULT now() NOT NULL,
    pers_id_registerer tech_id NOT NULL,
    del_id tech_id,
    space_id tech_id,
    samp_id_part_of tech_id,
    modification_timestamp time_stamp DEFAULT now(),
    expe_id tech_id,
    perm_id code NOT NULL,
    pers_id_modifier tech_id,
    code_unique_check character varying(300),
    subcode_unique_check character varying(300),
    version integer DEFAULT 0,
    orig_del tech_id,
    proj_id tech_id,
    frozen boolean_char DEFAULT false NOT NULL,
    space_frozen boolean_char DEFAULT false NOT NULL,
    proj_frozen boolean_char DEFAULT false NOT NULL,
    expe_frozen boolean_char DEFAULT false NOT NULL,
    cont_frozen boolean_char DEFAULT false NOT NULL,
    frozen_for_comp 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_data boolean_char DEFAULT false NOT NULL,
    sample_identifier sample_identifier,
    tsvector_document tsvector NOT NULL
);
CREATE VIEW samples AS
 SELECT samples_all.id,
    samples_all.perm_id,
    samples_all.code,
    samples_all.proj_id,
    samples_all.proj_frozen,
    samples_all.expe_id,
    samples_all.expe_frozen,
    samples_all.saty_id,
    samples_all.registration_timestamp,
    samples_all.modification_timestamp,
    samples_all.pers_id_registerer,
    samples_all.pers_id_modifier,
    samples_all.del_id,
    samples_all.orig_del,
    samples_all.space_id,
    samples_all.space_frozen,
    samples_all.samp_id_part_of,
    samples_all.cont_frozen,
    samples_all.version,
    samples_all.frozen,
    samples_all.frozen_for_comp,
    samples_all.frozen_for_children,
    samples_all.frozen_for_parents,
    samples_all.frozen_for_data,
    samples_all.tsvector_document,
    samples_all.sample_identifier
   FROM samples_all
  WHERE (samples_all.del_id IS NULL);
CREATE VIEW samples_deleted AS
 SELECT samples_all.id,
    samples_all.perm_id,
    samples_all.code,
    samples_all.expe_id,
    samples_all.saty_id,
    samples_all.registration_timestamp,
    samples_all.modification_timestamp,
    samples_all.pers_id_registerer,
    samples_all.pers_id_modifier,
    samples_all.del_id,
    samples_all.orig_del,
    samples_all.space_id,
    samples_all.proj_id,
    samples_all.samp_id_part_of,
    samples_all.version
   FROM samples_all
  WHERE (samples_all.del_id IS NOT NULL);
CREATE SEQUENCE script_id_seq
    START WITH 1
    INCREMENT BY 1
    NO MINVALUE
    NO MAXVALUE
    CACHE 1;
CREATE TABLE scripts (
    id tech_id NOT NULL,
    name character varying(200) NOT NULL,
    description description_2000,
    script text_value,
    registration_timestamp time_stamp_dfl DEFAULT now() NOT NULL,
    pers_id_registerer tech_id NOT NULL,
    entity_kind entity_kind,
    script_type script_type NOT NULL,
    plugin_type plugin_type DEFAULT 'JYTHON'::character varying NOT NULL,
    is_available boolean_char DEFAULT true NOT NULL,
    CONSTRAINT script_nn_ck CHECK ((((plugin_type)::text = 'PREDEPLOYED'::text) OR (script IS NOT NULL)))
);
CREATE SEQUENCE semantic_annotation_id_seq
    START WITH 1
    INCREMENT BY 1
    NO MINVALUE
    NO MAXVALUE
    CACHE 1;
CREATE TABLE semantic_annotations (
    id tech_id NOT NULL,
    perm_id code NOT NULL,
    saty_id tech_id,
    stpt_id tech_id,
    prty_id tech_id,
    predicate_ontology_id text,
    predicate_ontology_version text,
    predicate_accession_id text,
    descriptor_ontology_id text,
    descriptor_ontology_version text,
    descriptor_accession_id text,
    creation_date time_stamp_dfl NOT NULL,
    CONSTRAINT semantic_annotations_ssp_ck CHECK ((((saty_id IS NOT NULL) AND (stpt_id IS NULL) AND (prty_id IS NULL)) OR ((saty_id IS NULL) AND (stpt_id IS NOT NULL) AND (prty_id IS NULL)) OR ((saty_id IS NULL) AND (stpt_id IS NULL) AND (prty_id IS NOT NULL))))
);
CREATE SEQUENCE space_id_seq
    START WITH 1
    INCREMENT BY 1
    NO MINVALUE
    NO MAXVALUE
    CACHE 1;
CREATE TABLE spaces (
    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,
    frozen boolean_char DEFAULT false NOT NULL,
    frozen_for_proj boolean_char DEFAULT false NOT NULL,
    frozen_for_samp boolean_char DEFAULT false NOT NULL
);
CREATE SEQUENCE stpt_id_seq
    START WITH 1
    INCREMENT BY 1
    NO MINVALUE
    NO MAXVALUE
    CACHE 1;
SELECT pg_catalog.setval('attachment_content_id_seq', 12, true);
SELECT pg_catalog.setval('attachment_id_seq', 12, true);
SELECT pg_catalog.setval('authorization_group_id_seq', 1, true);
SELECT pg_catalog.setval('code_seq', 8, true);
SELECT pg_catalog.setval('content_copies_id_seq', 4, true);
SELECT pg_catalog.setval('controlled_vocabulary_id_seq', 6, true);
SELECT pg_catalog.setval('core_plugin_id_seq', 1, false);
SELECT pg_catalog.setval('cvte_id_seq', 17, true);
SELECT pg_catalog.setval('data_id_seq', 41, true);
SELECT pg_catalog.setval('data_set_copies_history_id_seq', 1, false);
SELECT pg_catalog.setval('data_set_property_id_seq', 29, true);
SELECT pg_catalog.setval('data_set_relationship_id_seq', 1, false);
SELECT pg_catalog.setval('data_set_relationships_history_id_seq', 16, true);
SELECT pg_catalog.setval('data_set_type_id_seq', 11, true);
SELECT pg_catalog.setval('data_store_id_seq', 1, true);
SELECT pg_catalog.setval('data_store_services_id_seq', 1, true);
SELECT pg_catalog.setval('data_type_id_seq', 12, true);
SELECT pg_catalog.setval('database_instance_id_seq', 1, true);
SELECT pg_catalog.setval('deletion_id_seq', 4, true);
SELECT pg_catalog.setval('dstpt_id_seq', 10, true);
SELECT pg_catalog.setval('entity_operations_log_id_seq', 10, false);
SELECT pg_catalog.setval('etpt_id_seq', 11, true);
SELECT pg_catalog.setval('event_id_seq', 1, false);
SELECT pg_catalog.setval('events_search_id_seq', 1, false);
SELECT pg_catalog.setval('experiment_code_seq', 7, true);
SELECT pg_catalog.setval('experiment_id_seq', 25, true);
SELECT pg_catalog.setval('experiment_property_id_seq', 23, true);
SELECT pg_catalog.setval('experiment_relationships_history_id_seq', 1, false);
SELECT pg_catalog.setval('experiment_type_id_seq', 3, true);
SELECT pg_catalog.setval('external_data_management_system_id_seq', 3, true);
SELECT pg_catalog.setval('file_format_type_id_seq', 8, true);
SELECT pg_catalog.setval('filter_id_seq', 1, true);
SELECT pg_catalog.setval('grid_custom_columns_id_seq', 1, false);
SELECT pg_catalog.setval('locator_type_id_seq', 1, true);
SELECT pg_catalog.setval('material_id_seq', 3736, true);
SELECT pg_catalog.setval('material_property_id_seq', 9324, true);
SELECT pg_catalog.setval('material_type_id_seq', 11, true);
SELECT pg_catalog.setval('metaproject_assignment_id_seq', 18, true);
SELECT pg_catalog.setval('metaproject_id_seq', 5, true);
SELECT pg_catalog.setval('mtpt_id_seq', 31, true);
SELECT pg_catalog.setval('operation_executions_id_seq', 1, false);
SELECT pg_catalog.setval('perm_id_seq', 1035, true);
SELECT pg_catalog.setval('person_id_seq', 21, true);
SELECT pg_catalog.setval('post_registration_dataset_queue_id_seq', 1, true);
SELECT pg_catalog.setval('project_id_seq', 7, true);
SELECT pg_catalog.setval('project_relationships_history_id_seq', 1, false);
SELECT pg_catalog.setval('property_type_id_seq', 28, true);
SELECT pg_catalog.setval('query_id_seq', 1, false);
SELECT pg_catalog.setval('relationship_type_id_seq', 3, true);
SELECT pg_catalog.setval('role_assignment_id_seq', 29, true);
SELECT pg_catalog.setval('sample_code_seq', 8, true);
SELECT pg_catalog.setval('sample_id_seq', 1061, true);
SELECT pg_catalog.setval('sample_property_id_seq', 55, true);
SELECT pg_catalog.setval('sample_relationship_id_seq', 48, true);
SELECT pg_catalog.setval('sample_relationships_history_id_seq', 1, false);
SELECT pg_catalog.setval('sample_type_id_seq', 12, true);
SELECT pg_catalog.setval('script_id_seq', 15, true);
SELECT pg_catalog.setval('semantic_annotation_id_seq', 8, true);
SELECT pg_catalog.setval('space_id_seq', 3, true);
SELECT pg_catalog.setval('stpt_id_seq', 21, true);