From fe050bfc4d4f5be359a4a667cce21899003ed36c Mon Sep 17 00:00:00 2001
From: alaskowski <alaskowski@ethz.ch>
Date: Tue, 18 Jun 2024 16:45:55 +0200
Subject: [PATCH] BIS-745: Added missing insert and update sql function changes

---
 .../sql/postgresql/198/function-198.sql       |  18 +-
 .../migration/migration-197-198.sql           | 159 +++++++++++++++++-
 .../asapi/v3/CreateExperimentTest.java        |   6 +-
 .../systemtest/asapi/v3/CreateSampleTest.java |   2 +-
 .../asapi/v3/UpdateExperimentTest.java        |  17 +-
 .../sql/postgresql/198/finish-198.sql         |  12 +-
 6 files changed, 192 insertions(+), 22 deletions(-)

diff --git a/server-application-server/source/sql/postgresql/198/function-198.sql b/server-application-server/source/sql/postgresql/198/function-198.sql
index 568c3c6da95..88717f13db4 100644
--- a/server-application-server/source/sql/postgresql/198/function-198.sql
+++ b/server-application-server/source/sql/postgresql/198/function-198.sql
@@ -613,7 +613,8 @@ CREATE OR REPLACE RULE sample_insert AS
          space_id,
          space_frozen,
          version,
-         meta_data
+         meta_data,
+         immutable_data
        ) VALUES (
          NEW.id,
          NEW.frozen,
@@ -639,7 +640,8 @@ CREATE OR REPLACE RULE sample_insert AS
          NEW.space_id,
          NEW.space_frozen,
          NEW.version,
-         NEW.meta_data
+         NEW.meta_data,
+         NEW.immutable_data
        );
 
 CREATE OR REPLACE RULE sample_update AS
@@ -668,7 +670,8 @@ CREATE OR REPLACE RULE sample_update AS
               space_id = NEW.space_id,
               space_frozen = NEW.space_frozen,
               version = NEW.version,
-              meta_data = NEW.meta_data
+              meta_data = NEW.meta_data,
+              immutable_data = NEW.immutable_data
           WHERE id = NEW.id;
 
 CREATE OR REPLACE RULE sample_delete AS
@@ -714,7 +717,8 @@ CREATE OR REPLACE RULE experiment_insert AS
        proj_frozen,
        registration_timestamp,
        version,
-       meta_data
+       meta_data,
+       immutable_data
      ) VALUES (
        NEW.id,
        NEW.frozen,
@@ -733,7 +737,8 @@ CREATE OR REPLACE RULE experiment_insert AS
        NEW.proj_frozen,
        NEW.registration_timestamp,
        NEW.version,
-       NEW.meta_data
+       NEW.meta_data,
+       NEW.immutable_data
      );
 
 CREATE OR REPLACE RULE experiment_update AS
@@ -755,7 +760,8 @@ CREATE OR REPLACE RULE experiment_update AS
               proj_frozen = NEW.proj_frozen,
               registration_timestamp = NEW.registration_timestamp,
               version = NEW.version,
-              meta_data = NEW.meta_data
+              meta_data = NEW.meta_data,
+              immutable_data = NEW.immutable_data
           WHERE id = NEW.id;
 
 CREATE OR REPLACE RULE experiment_delete AS
diff --git a/server-application-server/source/sql/postgresql/migration/migration-197-198.sql b/server-application-server/source/sql/postgresql/migration/migration-197-198.sql
index acd92e0bb78..c4ba1be30d4 100644
--- a/server-application-server/source/sql/postgresql/migration/migration-197-198.sql
+++ b/server-application-server/source/sql/postgresql/migration/migration-197-198.sql
@@ -15,4 +15,161 @@ CREATE OR REPLACE VIEW experiments AS
      SELECT id, perm_id, code, exty_id, pers_id_registerer, pers_id_modifier, registration_timestamp, modification_timestamp,
             proj_id, proj_frozen, del_id, orig_del, is_public, version, frozen, frozen_for_samp, frozen_for_data, tsvector_document, meta_data, immutable_data
        FROM experiments_all
-      WHERE del_id IS NULL;
\ No newline at end of file
+      WHERE del_id IS NULL;
+
+
+CREATE OR REPLACE RULE sample_insert AS
+    ON INSERT TO samples DO INSTEAD
+       INSERT INTO samples_all (
+         id,
+         frozen,
+         frozen_for_comp,
+         frozen_for_children,
+         frozen_for_parents,
+         frozen_for_data,
+         code,
+         del_id,
+         orig_del,
+         expe_id,
+         expe_frozen,
+         proj_id,
+         proj_frozen,
+         modification_timestamp,
+         perm_id,
+         pers_id_registerer,
+         pers_id_modifier,
+         registration_timestamp,
+         samp_id_part_of,
+         cont_frozen,
+         saty_id,
+         space_id,
+         space_frozen,
+         version,
+         meta_data,
+         immutable_data
+       ) VALUES (
+         NEW.id,
+         NEW.frozen,
+         NEW.frozen_for_comp,
+         NEW.frozen_for_children,
+         NEW.frozen_for_parents,
+         NEW.frozen_for_data,
+         NEW.code,
+         NEW.del_id,
+         NEW.orig_del,
+         NEW.expe_id,
+         NEW.expe_frozen,
+         NEW.proj_id,
+         NEW.proj_frozen,
+         NEW.modification_timestamp,
+         NEW.perm_id,
+         NEW.pers_id_registerer,
+         NEW.pers_id_modifier,
+         NEW.registration_timestamp,
+         NEW.samp_id_part_of,
+         NEW.cont_frozen,
+         NEW.saty_id,
+         NEW.space_id,
+         NEW.space_frozen,
+         NEW.version,
+         NEW.meta_data,
+         NEW.immutable_data
+       );
+
+CREATE OR REPLACE RULE sample_update AS
+    ON UPDATE TO samples DO INSTEAD
+       UPDATE samples_all
+          SET code = NEW.code,
+              frozen = NEW.frozen,
+              frozen_for_comp = NEW.frozen_for_comp,
+              frozen_for_children = NEW.frozen_for_children,
+              frozen_for_parents = NEW.frozen_for_parents,
+              frozen_for_data = NEW.frozen_for_data,
+              del_id = NEW.del_id,
+              orig_del = NEW.orig_del,
+              expe_id = NEW.expe_id,
+              expe_frozen = NEW.expe_frozen,
+              proj_id = NEW.proj_id,
+              proj_frozen = NEW.proj_frozen,
+              modification_timestamp = NEW.modification_timestamp,
+              perm_id = NEW.perm_id,
+              pers_id_registerer = NEW.pers_id_registerer,
+              pers_id_modifier = NEW.pers_id_modifier,
+              registration_timestamp = NEW.registration_timestamp,
+              samp_id_part_of = NEW.samp_id_part_of,
+              cont_frozen = NEW.cont_frozen,
+              saty_id = NEW.saty_id,
+              space_id = NEW.space_id,
+              space_frozen = NEW.space_frozen,
+              version = NEW.version,
+              meta_data = NEW.meta_data,
+              immutable_data = NEW.immutable_data
+          WHERE id = NEW.id;
+
+
+CREATE OR REPLACE RULE experiment_insert AS
+  ON INSERT TO experiments DO INSTEAD
+     INSERT INTO experiments_all (
+       id,
+       frozen,
+       frozen_for_samp,
+       frozen_for_data,
+       code,
+       del_id,
+       orig_del,
+       exty_id,
+       is_public,
+       modification_timestamp,
+       perm_id,
+       pers_id_registerer,
+       pers_id_modifier,
+       proj_id,
+       proj_frozen,
+       registration_timestamp,
+       version,
+       meta_data,
+       immutable_data
+     ) VALUES (
+       NEW.id,
+       NEW.frozen,
+       NEW.frozen_for_samp,
+       NEW.frozen_for_data,
+       NEW.code,
+       NEW.del_id,
+       NEW.orig_del,
+       NEW.exty_id,
+       NEW.is_public,
+       NEW.modification_timestamp,
+       NEW.perm_id,
+       NEW.pers_id_registerer,
+       NEW.pers_id_modifier,
+       NEW.proj_id,
+       NEW.proj_frozen,
+       NEW.registration_timestamp,
+       NEW.version,
+       NEW.meta_data,
+       NEW.immutable_data
+     );
+
+CREATE OR REPLACE RULE experiment_update AS
+    ON UPDATE TO experiments DO INSTEAD
+       UPDATE experiments_all
+          SET code = NEW.code,
+              frozen = NEW.frozen,
+              frozen_for_samp = NEW.frozen_for_samp,
+              frozen_for_data = NEW.frozen_for_data,
+              del_id = NEW.del_id,
+              orig_del = NEW.orig_del,
+              exty_id = NEW.exty_id,
+              is_public = NEW.is_public,
+              modification_timestamp = NEW.modification_timestamp,
+              perm_id = NEW.perm_id,
+              pers_id_registerer = NEW.pers_id_registerer,
+              pers_id_modifier = NEW.pers_id_modifier,
+              proj_id = NEW.proj_id,
+              proj_frozen = NEW.proj_frozen,
+              registration_timestamp = NEW.registration_timestamp,
+              version = NEW.version,
+              meta_data = NEW.meta_data,
+              immutable_data = NEW.immutable_data
+          WHERE id = NEW.id;
\ No newline at end of file
diff --git a/server-application-server/sourceTest/java/ch/ethz/sis/openbis/systemtest/asapi/v3/CreateExperimentTest.java b/server-application-server/sourceTest/java/ch/ethz/sis/openbis/systemtest/asapi/v3/CreateExperimentTest.java
index fdc684d1b6b..3705b200c9b 100644
--- a/server-application-server/sourceTest/java/ch/ethz/sis/openbis/systemtest/asapi/v3/CreateExperimentTest.java
+++ b/server-application-server/sourceTest/java/ch/ethz/sis/openbis/systemtest/asapi/v3/CreateExperimentTest.java
@@ -273,14 +273,14 @@ public class CreateExperimentTest extends AbstractExperimentTest
         final String sessionToken = v3api.login(TEST_USER, PASSWORD);
 
         final ExperimentCreation creation = new ExperimentCreation();
-        creation.setCode("TEST_EXPERIMENT1");
+        creation.setCode("TEST_IMMUTABLE_EXPERIMENT1");
         creation.setTypeId(new EntityTypePermId("SIRNA_HCS"));
         creation.setProjectId(new ProjectIdentifier("/TESTGROUP/TESTPROJ"));
         creation.setProperty("DESCRIPTION", "a description");
         creation.setImmutableData(true);
 
         ExperimentFetchOptions fetchOptions = new ExperimentFetchOptions();
-        fetchOptions.withTags();
+        fetchOptions.withProperties();
 
         List<ExperimentPermId> permIds = v3api.createExperiments(sessionToken, Arrays.asList(creation));
         Map<IExperimentId, Experiment> map = v3api.getExperiments(sessionToken, permIds, fetchOptions);
@@ -290,7 +290,7 @@ public class CreateExperimentTest extends AbstractExperimentTest
 
         Experiment experiment = experiments.get(0);
 
-        assertEquals(experiment.getIdentifier().getIdentifier(), "/TESTGROUP/TESTPROJ/TEST_EXPERIMENT1");
+        assertEquals(experiment.getIdentifier().getIdentifier(), "/TESTGROUP/TESTPROJ/TEST_IMMUTABLE_EXPERIMENT1");
         assertEquals(experiment.isImmutableData(), true);
         assertEquals(experiment.isFrozen(), false);
         assertEquals(experiment.getProperty("DESCRIPTION"), "a description");
diff --git a/server-application-server/sourceTest/java/ch/ethz/sis/openbis/systemtest/asapi/v3/CreateSampleTest.java b/server-application-server/sourceTest/java/ch/ethz/sis/openbis/systemtest/asapi/v3/CreateSampleTest.java
index b232335ed00..6e661f05523 100644
--- a/server-application-server/sourceTest/java/ch/ethz/sis/openbis/systemtest/asapi/v3/CreateSampleTest.java
+++ b/server-application-server/sourceTest/java/ch/ethz/sis/openbis/systemtest/asapi/v3/CreateSampleTest.java
@@ -1228,7 +1228,7 @@ public class CreateSampleTest extends AbstractSampleTest
 
 
         SampleCreation samp1 = new SampleCreation();
-        samp1.setCode("SAMPLE_WITH_SYS_PROPERTY");
+        samp1.setCode("IMMUTABLE_SAMPLE_WITH_SYS_PROPERTY");
         samp1.setTypeId(new EntityTypePermId("MASTER_PLATE"));
         samp1.setSpaceId(new SpacePermId("CISD"));
         samp1.setProperty(systemPropertyName, systemPropertyValue);
diff --git a/server-application-server/sourceTest/java/ch/ethz/sis/openbis/systemtest/asapi/v3/UpdateExperimentTest.java b/server-application-server/sourceTest/java/ch/ethz/sis/openbis/systemtest/asapi/v3/UpdateExperimentTest.java
index d3e87b6d5e9..b4b7e6d8f34 100644
--- a/server-application-server/sourceTest/java/ch/ethz/sis/openbis/systemtest/asapi/v3/UpdateExperimentTest.java
+++ b/server-application-server/sourceTest/java/ch/ethz/sis/openbis/systemtest/asapi/v3/UpdateExperimentTest.java
@@ -784,9 +784,16 @@ public class UpdateExperimentTest extends AbstractExperimentTest
     {
         // Given
         String sessionToken = v3api.login(TEST_USER, PASSWORD);
-        ExperimentIdentifier expId1 = new ExperimentIdentifier("/CISD/NEMO/EXP10");
+
+        ExperimentCreation creation = new ExperimentCreation();
+        creation.setCode("EXPERIMENT_WITH_SAMPLE_PROPERTY");
+        creation.setTypeId(new EntityTypePermId("DELETION_TEST"));
+        creation.setProjectId(new ProjectIdentifier("/TEST-SPACE/TEST-PROJECT"));
+        ExperimentPermId experimentPermId =
+                v3api.createExperiments(sessionToken, Arrays.asList(creation)).get(0);
+
         ExperimentUpdate update1 = new ExperimentUpdate();
-        update1.setExperimentId(expId1);
+        update1.setExperimentId(experimentPermId);
         update1.makeDataImmutable();
 
         // When
@@ -794,10 +801,10 @@ public class UpdateExperimentTest extends AbstractExperimentTest
 
         // Then
         Map<IExperimentId, Experiment> experiments =
-                v3api.getExperiments(sessionToken, Arrays.asList(expId1),
+                v3api.getExperiments(sessionToken, Arrays.asList(experimentPermId),
                         new ExperimentFetchOptions());
-        Experiment experiment1 = experiments.get(expId1);
-        assertEquals(experiment1.getIdentifier().getIdentifier(), expId1.getIdentifier());
+        Experiment experiment1 = experiments.get(experimentPermId);
+        assertEquals(experiment1.getPermId().getPermId(), experimentPermId.getPermId());
         assertEquals(experiment1.isFrozen(), false);
         assertEquals(experiment1.isImmutableData(), true);
         assertEquals(experiment1.isFrozenForDataSets(), false);
diff --git a/server-application-server/sourceTest/sql/postgresql/198/finish-198.sql b/server-application-server/sourceTest/sql/postgresql/198/finish-198.sql
index 4c787180d57..dcc51bf23b3 100644
--- a/server-application-server/sourceTest/sql/postgresql/198/finish-198.sql
+++ b/server-application-server/sourceTest/sql/postgresql/198/finish-198.sql
@@ -692,8 +692,8 @@ CREATE RULE experiment_delete AS
     ON DELETE TO experiments DO INSTEAD  DELETE FROM experiments_all
   WHERE ((experiments_all.id)::bigint = (old.id)::bigint);
 CREATE RULE experiment_insert AS
-    ON INSERT TO experiments DO INSTEAD  INSERT INTO experiments_all (id, frozen, frozen_for_samp, frozen_for_data, code, del_id, orig_del, exty_id, is_public, modification_timestamp, perm_id, pers_id_registerer, pers_id_modifier, proj_id, proj_frozen, registration_timestamp, version, meta_data)
-  VALUES (new.id, new.frozen, new.frozen_for_samp, new.frozen_for_data, new.code, new.del_id, new.orig_del, new.exty_id, new.is_public, new.modification_timestamp, new.perm_id, new.pers_id_registerer, new.pers_id_modifier, new.proj_id, new.proj_frozen, new.registration_timestamp, new.version, new.meta_data);
+    ON INSERT TO experiments DO INSTEAD  INSERT INTO experiments_all (id, frozen, frozen_for_samp, frozen_for_data, code, del_id, orig_del, exty_id, is_public, modification_timestamp, perm_id, pers_id_registerer, pers_id_modifier, proj_id, proj_frozen, registration_timestamp, version, meta_data, immutable_data)
+  VALUES (new.id, new.frozen, new.frozen_for_samp, new.frozen_for_data, new.code, new.del_id, new.orig_del, new.exty_id, new.is_public, new.modification_timestamp, new.perm_id, new.pers_id_registerer, new.pers_id_modifier, new.proj_id, new.proj_frozen, new.registration_timestamp, new.version, new.meta_data, new.immutable_data);
 CREATE RULE experiment_project_delete AS
     ON DELETE TO experiments_all
    WHERE (old.proj_id IS NOT NULL) DO  UPDATE project_relationships_history SET valid_until_timestamp = CURRENT_TIMESTAMP
@@ -770,7 +770,7 @@ CREATE RULE experiment_properties_update AS
            FROM samples_all
           WHERE ((samples_all.id)::bigint = (old.samp_prop_id)::bigint)), old.pers_id_author, old.modification_timestamp, new.modification_timestamp, old.integer_array_value, old.real_array_value, old.string_array_value, old.timestamp_array_value, old.json_value);
 CREATE RULE experiment_update AS
-    ON UPDATE TO experiments DO INSTEAD  UPDATE experiments_all SET code = new.code, frozen = new.frozen, frozen_for_samp = new.frozen_for_samp, frozen_for_data = new.frozen_for_data, del_id = new.del_id, orig_del = new.orig_del, exty_id = new.exty_id, is_public = new.is_public, modification_timestamp = new.modification_timestamp, perm_id = new.perm_id, pers_id_registerer = new.pers_id_registerer, pers_id_modifier = new.pers_id_modifier, proj_id = new.proj_id, proj_frozen = new.proj_frozen, registration_timestamp = new.registration_timestamp, version = new.version, meta_data = new.meta_data
+    ON UPDATE TO experiments DO INSTEAD  UPDATE experiments_all SET code = new.code, frozen = new.frozen, frozen_for_samp = new.frozen_for_samp, frozen_for_data = new.frozen_for_data, del_id = new.del_id, orig_del = new.orig_del, exty_id = new.exty_id, is_public = new.is_public, modification_timestamp = new.modification_timestamp, perm_id = new.perm_id, pers_id_registerer = new.pers_id_registerer, pers_id_modifier = new.pers_id_modifier, proj_id = new.proj_id, proj_frozen = new.proj_frozen, registration_timestamp = new.registration_timestamp, version = new.version, meta_data = new.meta_data, immutable_data = new.immutable_data
   WHERE ((experiments_all.id)::bigint = (new.id)::bigint);
 CREATE RULE material_properties_delete AS
     ON DELETE TO material_properties
@@ -891,8 +891,8 @@ CREATE RULE sample_experiment_update AS
           WHERE ((experiments_all.id)::bigint = (new.expe_id)::bigint)), new.pers_id_modifier, new.modification_timestamp);
 );
 CREATE RULE sample_insert AS
-    ON INSERT TO samples DO INSTEAD  INSERT INTO samples_all (id, frozen, frozen_for_comp, frozen_for_children, frozen_for_parents, frozen_for_data, code, del_id, orig_del, expe_id, expe_frozen, proj_id, proj_frozen, modification_timestamp, perm_id, pers_id_registerer, pers_id_modifier, registration_timestamp, samp_id_part_of, cont_frozen, saty_id, space_id, space_frozen, version, meta_data)
-  VALUES (new.id, new.frozen, new.frozen_for_comp, new.frozen_for_children, new.frozen_for_parents, new.frozen_for_data, new.code, new.del_id, new.orig_del, new.expe_id, new.expe_frozen, new.proj_id, new.proj_frozen, new.modification_timestamp, new.perm_id, new.pers_id_registerer, new.pers_id_modifier, new.registration_timestamp, new.samp_id_part_of, new.cont_frozen, new.saty_id, new.space_id, new.space_frozen, new.version, new.meta_data);
+    ON INSERT TO samples DO INSTEAD  INSERT INTO samples_all (id, frozen, frozen_for_comp, frozen_for_children, frozen_for_parents, frozen_for_data, code, del_id, orig_del, expe_id, expe_frozen, proj_id, proj_frozen, modification_timestamp, perm_id, pers_id_registerer, pers_id_modifier, registration_timestamp, samp_id_part_of, cont_frozen, saty_id, space_id, space_frozen, version, meta_data, immutable_data)
+  VALUES (new.id, new.frozen, new.frozen_for_comp, new.frozen_for_children, new.frozen_for_parents, new.frozen_for_data, new.code, new.del_id, new.orig_del, new.expe_id, new.expe_frozen, new.proj_id, new.proj_frozen, new.modification_timestamp, new.perm_id, new.pers_id_registerer, new.pers_id_modifier, new.registration_timestamp, new.samp_id_part_of, new.cont_frozen, new.saty_id, new.space_id, new.space_frozen, new.version, new.meta_data, new.immutable_data);
 CREATE RULE sample_parent_annotations_update AS
     ON UPDATE TO sample_relationships_all
    WHERE ((old.del_id IS NULL) AND (new.del_id IS NULL) AND ((old.sample_id_child)::bigint = (new.sample_id_child)::bigint) AND ((old.sample_id_parent)::bigint = (new.sample_id_parent)::bigint) AND (old.parent_annotations <> new.parent_annotations)) DO  INSERT INTO sample_relationships_history (id, main_samp_id, relation_type, samp_id, entity_kind, entity_perm_id, annotations, pers_id_author, valid_from_timestamp)
@@ -1047,7 +1047,7 @@ CREATE RULE sample_space_update AS
           WHERE ((spaces.id)::bigint = (new.space_id)::bigint)), new.pers_id_modifier, new.modification_timestamp);
 );
 CREATE RULE sample_update AS
-    ON UPDATE TO samples DO INSTEAD  UPDATE samples_all SET code = new.code, frozen = new.frozen, frozen_for_comp = new.frozen_for_comp, frozen_for_children = new.frozen_for_children, frozen_for_parents = new.frozen_for_parents, frozen_for_data = new.frozen_for_data, del_id = new.del_id, orig_del = new.orig_del, expe_id = new.expe_id, expe_frozen = new.expe_frozen, proj_id = new.proj_id, proj_frozen = new.proj_frozen, modification_timestamp = new.modification_timestamp, perm_id = new.perm_id, pers_id_registerer = new.pers_id_registerer, pers_id_modifier = new.pers_id_modifier, registration_timestamp = new.registration_timestamp, samp_id_part_of = new.samp_id_part_of, cont_frozen = new.cont_frozen, saty_id = new.saty_id, space_id = new.space_id, space_frozen = new.space_frozen, version = new.version, meta_data = new.meta_data
+    ON UPDATE TO samples DO INSTEAD  UPDATE samples_all SET code = new.code, frozen = new.frozen, frozen_for_comp = new.frozen_for_comp, frozen_for_children = new.frozen_for_children, frozen_for_parents = new.frozen_for_parents, frozen_for_data = new.frozen_for_data, del_id = new.del_id, orig_del = new.orig_del, expe_id = new.expe_id, expe_frozen = new.expe_frozen, proj_id = new.proj_id, proj_frozen = new.proj_frozen, modification_timestamp = new.modification_timestamp, perm_id = new.perm_id, pers_id_registerer = new.pers_id_registerer, pers_id_modifier = new.pers_id_modifier, registration_timestamp = new.registration_timestamp, samp_id_part_of = new.samp_id_part_of, cont_frozen = new.cont_frozen, saty_id = new.saty_id, space_id = new.space_id, space_frozen = new.space_frozen, version = new.version, meta_data = new.meta_data, immutable_data = new.immutable_data
   WHERE ((samples_all.id)::bigint = (new.id)::bigint);
 CREATE TRIGGER add_data_set_to_experiment_check AFTER INSERT ON data_all FOR EACH ROW WHEN (new.expe_frozen) EXECUTE PROCEDURE raise_exception_frozen_experiment_relationship('data set');
 CREATE TRIGGER add_data_set_to_sample_check AFTER INSERT ON data_all FOR EACH ROW WHEN (new.samp_frozen) EXECUTE PROCEDURE raise_exception_frozen_data_set_sample_relationship();
-- 
GitLab