From 0779826735fa791b9c9fb2845bded4859aafcc02 Mon Sep 17 00:00:00 2001
From: brinn <brinn>
Date: Tue, 6 Dec 2011 16:56:53 +0000
Subject: [PATCH] Add an additional check to the property history update and
 delete rules that ensures that something changed in the property value and
 suppress the addition otherwise.

SVN: 23899
---
 .../sql/postgresql/091/function-091.sql       | 24 +++++++++++++++++++
 .../migration/migration-090-091.sql           | 24 +++++++++++++++++++
 .../sql/postgresql/091/finish-091.sql         | 24 +++++++++++++++++++
 3 files changed, 72 insertions(+)

diff --git a/openbis/source/sql/postgresql/091/function-091.sql b/openbis/source/sql/postgresql/091/function-091.sql
index a6c4f33ac29..cf5a9e79a37 100644
--- a/openbis/source/sql/postgresql/091/function-091.sql
+++ b/openbis/source/sql/postgresql/091/function-091.sql
@@ -668,6 +668,9 @@ CREATE OR REPLACE RULE data_deleted_delete AS
 CREATE OR REPLACE RULE material_properties_update AS
     ON UPDATE TO material_properties 
     WHERE decode(substring(OLD.value from 1 for 1), 'escape') != E'\\xefbfbd'
+      AND ((OLD.VALUE IS NOT NULL AND OLD.VALUE != NEW.VALUE) 
+        OR (OLD.CVTE_ID IS NOT NULL AND OLD.CVTE_ID != NEW.CVTE_ID) 
+        OR (OLD.MATE_PROP_ID IS NOT NULL AND OLD.MATE_PROP_ID != NEW.MATE_PROP_ID)) 
     DO ALSO 
        INSERT INTO material_properties_history (
          ID, 
@@ -694,6 +697,9 @@ CREATE OR REPLACE RULE material_properties_update AS
 CREATE OR REPLACE RULE material_properties_delete AS
     ON DELETE TO material_properties 
     WHERE decode(substring(OLD.value from 1 for 1), 'escape') != E'\\xefbfbd'
+      AND (OLD.VALUE IS NOT NULL 
+        OR OLD.CVTE_ID IS NOT NULL 
+        OR OLD.MATE_PROP_ID IS NOT NULL) 
     DO ALSO 
        INSERT INTO material_properties_history (
          ID, 
@@ -722,6 +728,9 @@ CREATE OR REPLACE RULE material_properties_delete AS
 CREATE OR REPLACE RULE experiment_properties_update AS
     ON UPDATE TO experiment_properties 
     WHERE decode(substring(OLD.value from 1 for 1), 'escape') != E'\\xefbfbd'
+      AND ((OLD.VALUE IS NOT NULL AND OLD.VALUE != NEW.VALUE) 
+        OR (OLD.CVTE_ID IS NOT NULL AND OLD.CVTE_ID != NEW.CVTE_ID) 
+        OR (OLD.MATE_PROP_ID IS NOT NULL AND OLD.MATE_PROP_ID != NEW.MATE_PROP_ID)) 
     DO ALSO 
        INSERT INTO experiment_properties_history (
          ID, 
@@ -748,6 +757,9 @@ CREATE OR REPLACE RULE experiment_properties_update AS
 CREATE OR REPLACE RULE experiment_properties_delete AS
     ON DELETE TO experiment_properties 
     WHERE decode(substring(OLD.value from 1 for 1), 'escape') != E'\\xefbfbd'
+      AND (OLD.VALUE IS NOT NULL 
+        OR OLD.CVTE_ID IS NOT NULL 
+        OR OLD.MATE_PROP_ID IS NOT NULL) 
     DO ALSO 
        INSERT INTO experiment_properties_history (
          ID, 
@@ -776,6 +788,9 @@ CREATE OR REPLACE RULE experiment_properties_delete AS
 CREATE OR REPLACE RULE sample_properties_update AS
     ON UPDATE TO sample_properties
     WHERE decode(substring(OLD.value from 1 for 1), 'escape') != E'\\xefbfbd'
+      AND ((OLD.VALUE IS NOT NULL AND OLD.VALUE != NEW.VALUE) 
+        OR (OLD.CVTE_ID IS NOT NULL AND OLD.CVTE_ID != NEW.CVTE_ID) 
+        OR (OLD.MATE_PROP_ID IS NOT NULL AND OLD.MATE_PROP_ID != NEW.MATE_PROP_ID)) 
     DO ALSO
        INSERT INTO sample_properties_history (
          ID, 
@@ -802,6 +817,9 @@ CREATE OR REPLACE RULE sample_properties_update AS
 CREATE OR REPLACE RULE sample_properties_delete AS
     ON DELETE TO sample_properties 
     WHERE decode(substring(OLD.value from 1 for 1), 'escape') != E'\\xefbfbd'
+      AND (OLD.VALUE IS NOT NULL 
+        OR OLD.CVTE_ID IS NOT NULL 
+        OR OLD.MATE_PROP_ID IS NOT NULL) 
     DO ALSO
        INSERT INTO sample_properties_history (
          ID, 
@@ -830,6 +848,9 @@ CREATE OR REPLACE RULE sample_properties_delete AS
 CREATE OR REPLACE RULE data_set_properties_update AS
     ON UPDATE TO data_set_properties 
     WHERE decode(substring(OLD.value from 1 for 1), 'escape') != E'\\xefbfbd'
+      AND ((OLD.VALUE IS NOT NULL AND OLD.VALUE != NEW.VALUE) 
+        OR (OLD.CVTE_ID IS NOT NULL AND OLD.CVTE_ID != NEW.CVTE_ID) 
+        OR (OLD.MATE_PROP_ID IS NOT NULL AND OLD.MATE_PROP_ID != NEW.MATE_PROP_ID)) 
     DO ALSO
        INSERT INTO data_set_properties_history (
          ID, 
@@ -856,6 +877,9 @@ CREATE OR REPLACE RULE data_set_properties_update AS
 CREATE OR REPLACE RULE data_set_properties_delete AS
     ON DELETE TO data_set_properties 
     WHERE decode(substring(OLD.value from 1 for 1), 'escape') != E'\\xefbfbd'
+      AND (OLD.VALUE IS NOT NULL 
+        OR OLD.CVTE_ID IS NOT NULL 
+        OR OLD.MATE_PROP_ID IS NOT NULL) 
     DO ALSO
        INSERT INTO data_set_properties_history (
          ID, 
diff --git a/openbis/source/sql/postgresql/migration/migration-090-091.sql b/openbis/source/sql/postgresql/migration/migration-090-091.sql
index 3d20724483e..f635c26ec70 100644
--- a/openbis/source/sql/postgresql/migration/migration-090-091.sql
+++ b/openbis/source/sql/postgresql/migration/migration-090-091.sql
@@ -75,6 +75,9 @@ ALTER TABLE material_properties_history ALTER COLUMN valid_from_timestamp SET NO
 CREATE OR REPLACE RULE material_properties_update AS
     ON UPDATE TO material_properties 
     WHERE decode(substring(OLD.value from 1 for 1), 'escape') != E'\\xefbfbd'
+      AND ((OLD.VALUE IS NOT NULL AND OLD.VALUE != NEW.VALUE) 
+        OR (OLD.CVTE_ID IS NOT NULL AND OLD.CVTE_ID != NEW.CVTE_ID) 
+        OR (OLD.MATE_PROP_ID IS NOT NULL AND OLD.MATE_PROP_ID != NEW.MATE_PROP_ID)) 
     DO ALSO 
        INSERT INTO material_properties_history (
          ID, 
@@ -101,6 +104,9 @@ CREATE OR REPLACE RULE material_properties_update AS
 CREATE OR REPLACE RULE material_properties_delete AS
     ON DELETE TO material_properties 
     WHERE decode(substring(OLD.value from 1 for 1), 'escape') != E'\\xefbfbd'
+      AND (OLD.VALUE IS NOT NULL 
+        OR OLD.CVTE_ID IS NOT NULL 
+        OR OLD.MATE_PROP_ID IS NOT NULL) 
     DO ALSO 
        INSERT INTO material_properties_history (
          ID, 
@@ -129,6 +135,9 @@ CREATE OR REPLACE RULE material_properties_delete AS
 CREATE OR REPLACE RULE experiment_properties_update AS
     ON UPDATE TO experiment_properties 
     WHERE decode(substring(OLD.value from 1 for 1), 'escape') != E'\\xefbfbd'
+      AND ((OLD.VALUE IS NOT NULL AND OLD.VALUE != NEW.VALUE) 
+        OR (OLD.CVTE_ID IS NOT NULL AND OLD.CVTE_ID != NEW.CVTE_ID) 
+        OR (OLD.MATE_PROP_ID IS NOT NULL AND OLD.MATE_PROP_ID != NEW.MATE_PROP_ID)) 
     DO ALSO 
        INSERT INTO experiment_properties_history (
          ID, 
@@ -155,6 +164,9 @@ CREATE OR REPLACE RULE experiment_properties_update AS
 CREATE OR REPLACE RULE experiment_properties_delete AS
     ON DELETE TO experiment_properties 
     WHERE decode(substring(OLD.value from 1 for 1), 'escape') != E'\\xefbfbd'
+      AND (OLD.VALUE IS NOT NULL 
+        OR OLD.CVTE_ID IS NOT NULL 
+        OR OLD.MATE_PROP_ID IS NOT NULL) 
     DO ALSO 
        INSERT INTO experiment_properties_history (
          ID, 
@@ -183,6 +195,9 @@ CREATE OR REPLACE RULE experiment_properties_delete AS
 CREATE OR REPLACE RULE sample_properties_update AS
     ON UPDATE TO sample_properties
     WHERE decode(substring(OLD.value from 1 for 1), 'escape') != E'\\xefbfbd'
+      AND ((OLD.VALUE IS NOT NULL AND OLD.VALUE != NEW.VALUE) 
+        OR (OLD.CVTE_ID IS NOT NULL AND OLD.CVTE_ID != NEW.CVTE_ID) 
+        OR (OLD.MATE_PROP_ID IS NOT NULL AND OLD.MATE_PROP_ID != NEW.MATE_PROP_ID)) 
     DO ALSO
        INSERT INTO sample_properties_history (
          ID, 
@@ -209,6 +224,9 @@ CREATE OR REPLACE RULE sample_properties_update AS
 CREATE OR REPLACE RULE sample_properties_delete AS
     ON DELETE TO sample_properties 
     WHERE decode(substring(OLD.value from 1 for 1), 'escape') != E'\\xefbfbd'
+      AND (OLD.VALUE IS NOT NULL 
+        OR OLD.CVTE_ID IS NOT NULL 
+        OR OLD.MATE_PROP_ID IS NOT NULL) 
     DO ALSO
        INSERT INTO sample_properties_history (
          ID, 
@@ -237,6 +255,9 @@ CREATE OR REPLACE RULE sample_properties_delete AS
 CREATE OR REPLACE RULE data_set_properties_update AS
     ON UPDATE TO data_set_properties 
     WHERE decode(substring(OLD.value from 1 for 1), 'escape') != E'\\xefbfbd'
+      AND ((OLD.VALUE IS NOT NULL AND OLD.VALUE != NEW.VALUE) 
+        OR (OLD.CVTE_ID IS NOT NULL AND OLD.CVTE_ID != NEW.CVTE_ID) 
+        OR (OLD.MATE_PROP_ID IS NOT NULL AND OLD.MATE_PROP_ID != NEW.MATE_PROP_ID)) 
     DO ALSO
        INSERT INTO data_set_properties_history (
          ID, 
@@ -263,6 +284,9 @@ CREATE OR REPLACE RULE data_set_properties_update AS
 CREATE OR REPLACE RULE data_set_properties_delete AS
     ON DELETE TO data_set_properties 
     WHERE decode(substring(OLD.value from 1 for 1), 'escape') != E'\\xefbfbd'
+      AND (OLD.VALUE IS NOT NULL 
+        OR OLD.CVTE_ID IS NOT NULL 
+        OR OLD.MATE_PROP_ID IS NOT NULL) 
     DO ALSO
        INSERT INTO data_set_properties_history (
          ID, 
diff --git a/openbis/sourceTest/sql/postgresql/091/finish-091.sql b/openbis/sourceTest/sql/postgresql/091/finish-091.sql
index 2b3e88e648f..59fc8e3589c 100644
--- a/openbis/sourceTest/sql/postgresql/091/finish-091.sql
+++ b/openbis/sourceTest/sql/postgresql/091/finish-091.sql
@@ -306,6 +306,9 @@ CREATE RULE data_insert AS ON INSERT TO data DO INSTEAD INSERT INTO data_all (id
 CREATE RULE data_set_properties_update AS
     ON UPDATE TO data_set_properties 
     WHERE decode(substring(OLD.value from 1 for 1), 'escape') != E'\\xefbfbd'
+      AND ((OLD.VALUE IS NOT NULL AND OLD.VALUE != NEW.VALUE) 
+        OR (OLD.CVTE_ID IS NOT NULL AND OLD.CVTE_ID != NEW.CVTE_ID) 
+        OR (OLD.MATE_PROP_ID IS NOT NULL AND OLD.MATE_PROP_ID != NEW.MATE_PROP_ID)) 
     DO ALSO
        INSERT INTO data_set_properties_history (
          ID, 
@@ -331,6 +334,9 @@ CREATE RULE data_set_properties_update AS
 CREATE RULE data_set_properties_delete AS
     ON DELETE TO data_set_properties 
     WHERE decode(substring(OLD.value from 1 for 1), 'escape') != E'\\xefbfbd'
+      AND (OLD.VALUE IS NOT NULL 
+        OR OLD.CVTE_ID IS NOT NULL 
+        OR OLD.MATE_PROP_ID IS NOT NULL) 
     DO ALSO
        INSERT INTO data_set_properties_history (
          ID, 
@@ -361,6 +367,9 @@ CREATE RULE experiment_insert AS ON INSERT TO experiments DO INSTEAD INSERT INTO
 CREATE RULE experiment_properties_update AS
     ON UPDATE TO experiment_properties 
     WHERE decode(substring(OLD.value from 1 for 1), 'escape') != E'\\xefbfbd'
+      AND ((OLD.VALUE IS NOT NULL AND OLD.VALUE != NEW.VALUE) 
+        OR (OLD.CVTE_ID IS NOT NULL AND OLD.CVTE_ID != NEW.CVTE_ID) 
+        OR (OLD.MATE_PROP_ID IS NOT NULL AND OLD.MATE_PROP_ID != NEW.MATE_PROP_ID)) 
     DO ALSO 
        INSERT INTO experiment_properties_history (
          ID, 
@@ -386,6 +395,9 @@ CREATE RULE experiment_properties_update AS
 CREATE RULE experiment_properties_delete AS
     ON DELETE TO experiment_properties 
     WHERE decode(substring(OLD.value from 1 for 1), 'escape') != E'\\xefbfbd'
+      AND (OLD.VALUE IS NOT NULL 
+        OR OLD.CVTE_ID IS NOT NULL 
+        OR OLD.MATE_PROP_ID IS NOT NULL) 
     DO ALSO 
        INSERT INTO experiment_properties_history (
          ID, 
@@ -414,6 +426,9 @@ CREATE RULE experiments_deleted_update AS ON UPDATE TO experiments_deleted DO IN
 CREATE RULE material_properties_update AS
     ON UPDATE TO material_properties 
     WHERE decode(substring(OLD.value from 1 for 1), 'escape') != E'\\xefbfbd'
+      AND ((OLD.VALUE IS NOT NULL AND OLD.VALUE != NEW.VALUE) 
+        OR (OLD.CVTE_ID IS NOT NULL AND OLD.CVTE_ID != NEW.CVTE_ID) 
+        OR (OLD.MATE_PROP_ID IS NOT NULL AND OLD.MATE_PROP_ID != NEW.MATE_PROP_ID)) 
     DO ALSO 
        INSERT INTO material_properties_history (
          ID, 
@@ -439,6 +454,9 @@ CREATE RULE material_properties_update AS
 CREATE RULE material_properties_delete AS
     ON DELETE TO material_properties 
     WHERE decode(substring(OLD.value from 1 for 1), 'escape') != E'\\xefbfbd'
+      AND (OLD.VALUE IS NOT NULL 
+        OR OLD.CVTE_ID IS NOT NULL 
+        OR OLD.MATE_PROP_ID IS NOT NULL) 
     DO ALSO 
        INSERT INTO material_properties_history (
          ID, 
@@ -468,6 +486,9 @@ CREATE RULE sample_insert AS ON INSERT TO samples DO INSTEAD INSERT INTO samples
 CREATE RULE sample_properties_update AS
     ON UPDATE TO sample_properties
     WHERE decode(substring(OLD.value from 1 for 1), 'escape') != E'\\xefbfbd'
+      AND ((OLD.VALUE IS NOT NULL AND OLD.VALUE != NEW.VALUE) 
+        OR (OLD.CVTE_ID IS NOT NULL AND OLD.CVTE_ID != NEW.CVTE_ID) 
+        OR (OLD.MATE_PROP_ID IS NOT NULL AND OLD.MATE_PROP_ID != NEW.MATE_PROP_ID)) 
     DO ALSO
        INSERT INTO sample_properties_history (
          ID, 
@@ -493,6 +514,9 @@ CREATE RULE sample_properties_update AS
 CREATE RULE sample_properties_delete AS
     ON DELETE TO sample_properties 
     WHERE decode(substring(OLD.value from 1 for 1), 'escape') != E'\\xefbfbd'
+      AND (OLD.VALUE IS NOT NULL 
+        OR OLD.CVTE_ID IS NOT NULL 
+        OR OLD.MATE_PROP_ID IS NOT NULL) 
     DO ALSO
        INSERT INTO sample_properties_history (
          ID, 
-- 
GitLab