diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/business/bo/EntityPropertiesConverter.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/business/bo/EntityPropertiesConverter.java index e5f8d10003900b656fb3c388f41078828e17d1ba..e5c72fb2fe6e42de3b9b559e250d3bf32b1fa74c 100644 --- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/business/bo/EntityPropertiesConverter.java +++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/business/bo/EntityPropertiesConverter.java @@ -286,12 +286,13 @@ public final class EntityPropertiesConverter implements IEntityPropertiesConvert final IEntityProperty[] properties, final String entityTypeCode, final PersonPE registrator) { - return convertProperties(properties, entityTypeCode, registrator, true); + return convertProperties(properties, entityTypeCode, registrator, true, true); } private final <T extends EntityPropertyPE> List<T> convertProperties( final IEntityProperty[] properties, final String entityTypeCode, - final PersonPE registrator, final boolean createManagedPropertiesPlaceholders) + final PersonPE registrator, final boolean createManagedPropertiesPlaceholders, + boolean createDynamicPropertiesPlaceholders) { assert entityTypeCode != null : "Unspecified entity type code."; assert registrator != null : "Unspecified registrator"; @@ -304,7 +305,11 @@ public final class EntityPropertiesConverter implements IEntityPropertiesConvert Set<String> propertiesToUpdate = extractPropertiesToUpdate(properties); dynamicPropertiesUpdateChecker.checkDynamicPropertiesNotManuallyUpdated(propertiesToUpdate, dynamicProperties); - placeholderCreator.addDynamicPropertiesPlaceholders(definedProperties, dynamicProperties); + if (createDynamicPropertiesPlaceholders) + { + placeholderCreator.addDynamicPropertiesPlaceholders(definedProperties, + dynamicProperties); + } if (createManagedPropertiesPlaceholders) { placeholderCreator.addManagedPropertiesPlaceholders(definedProperties, @@ -486,7 +491,7 @@ public final class EntityPropertiesConverter implements IEntityPropertiesConvert final PersonPE registrator) { IEntityProperty[] propsArray = properties.toArray(new IEntityProperty[0]); - return convertProperties(propsArray, entityTypeCode, registrator, false); + return convertProperties(propsArray, entityTypeCode, registrator, false, false); } public <T extends EntityPropertyPE> Set<T> updateProperties(Collection<T> oldProperties, diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/business/bo/PlaceholderPropertyCreator.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/business/bo/PlaceholderPropertyCreator.java index b905307cb073e572841cee89440d473db34fe982..f5d56d2fb0eb928dc9de123ef1e88a52880a399d 100644 --- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/business/bo/PlaceholderPropertyCreator.java +++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/business/bo/PlaceholderPropertyCreator.java @@ -32,8 +32,8 @@ class PlaceholderPropertyCreator implements IPropertyPlaceholderCreator public void addDynamicPropertiesPlaceholders(Set<IEntityProperty> definedProperties, Set<String> dynamicProperties) { - // Note: if you want to set the dynamicProperties to 'invalid', this is the right place - // to do it. + addPlaceholders(definedProperties, dynamicProperties, + BasicConstant.DYNAMIC_PROPERTY_PLACEHOLDER_VALUE); } /** diff --git a/openbis/source/sql/postgresql/091/function-091.sql b/openbis/source/sql/postgresql/091/function-091.sql index cf5a9e79a370007e782fd442cadbb73403d89e08..27de2c674457c3de06e31356c6996e178b17b636 100644 --- a/openbis/source/sql/postgresql/091/function-091.sql +++ b/openbis/source/sql/postgresql/091/function-091.sql @@ -659,18 +659,11 @@ CREATE OR REPLACE RULE data_deleted_delete AS DELETE FROM data_all WHERE id = OLD.id; ----------------------------------------------------------------------------------------------------- --- Rules for properties history ----------------------------------------------------------------------------------------------------- - --- Material Properties -- - 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) + WHERE (OLD.VALUE IS NOT NULL AND decode(substring(OLD.value from 1 for 1), 'escape') != E'\\xefbfbd' 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)) + 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, @@ -696,10 +689,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 + WHERE (OLD.VALUE IS NOT NULL AND decode(substring(OLD.value from 1 for 1), 'escape') != E'\\xefbfbd') OR OLD.CVTE_ID IS NOT NULL - OR OLD.MATE_PROP_ID IS NOT NULL) + OR OLD.MATE_PROP_ID IS NOT NULL DO ALSO INSERT INTO material_properties_history ( ID, @@ -722,186 +714,6 @@ CREATE OR REPLACE RULE material_properties_delete AS OLD.MODIFICATION_TIMESTAMP, current_timestamp ); - --- Experiment Properties -- - -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, - EXPE_ID, - ETPT_ID, - VALUE, - CVTE_ID, - MATE_PROP_ID, - PERS_ID_AUTHOR, - VALID_FROM_TIMESTAMP, - VALID_UNTIL_TIMESTAMP - ) VALUES ( - nextval('EXPERIMENT_PROPERTY_ID_SEQ'), - OLD.EXPE_ID, - OLD.ETPT_ID, - OLD.VALUE, - OLD.CVTE_ID, - OLD.MATE_PROP_ID, - OLD.PERS_ID_AUTHOR, - OLD.MODIFICATION_TIMESTAMP, - current_timestamp - ); - -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, - EXPE_ID, - ETPT_ID, - VALUE, - CVTE_ID, - MATE_PROP_ID, - PERS_ID_AUTHOR, - VALID_FROM_TIMESTAMP, - VALID_UNTIL_TIMESTAMP - ) VALUES ( - nextval('EXPERIMENT_PROPERTY_ID_SEQ'), - OLD.EXPE_ID, - OLD.ETPT_ID, - OLD.VALUE, - OLD.CVTE_ID, - OLD.MATE_PROP_ID, - OLD.PERS_ID_AUTHOR, - OLD.MODIFICATION_TIMESTAMP, - current_timestamp - ); - --- Sample Properties -- - -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, - SAMP_ID, - STPT_ID, - VALUE, - CVTE_ID, - MATE_PROP_ID, - PERS_ID_AUTHOR, - VALID_FROM_TIMESTAMP, - VALID_UNTIL_TIMESTAMP - ) VALUES ( - nextval('SAMPLE_PROPERTY_ID_SEQ'), - OLD.SAMP_ID, - OLD.STPT_ID, - OLD.VALUE, - OLD.CVTE_ID, - OLD.MATE_PROP_ID, - OLD.PERS_ID_AUTHOR, - OLD.MODIFICATION_TIMESTAMP, - current_timestamp - ); - -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, - SAMP_ID, - STPT_ID, - VALUE, - CVTE_ID, - MATE_PROP_ID, - PERS_ID_AUTHOR, - VALID_FROM_TIMESTAMP, - VALID_UNTIL_TIMESTAMP - ) VALUES ( - nextval('SAMPLE_PROPERTY_ID_SEQ'), - OLD.SAMP_ID, - OLD.STPT_ID, - OLD.VALUE, - OLD.CVTE_ID, - OLD.MATE_PROP_ID, - OLD.PERS_ID_AUTHOR, - OLD.MODIFICATION_TIMESTAMP, - current_timestamp - ); - --- Data Set Properties -- - -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, - DS_ID, - DSTPT_ID, - VALUE, - CVTE_ID, - MATE_PROP_ID, - PERS_ID_AUTHOR, - VALID_FROM_TIMESTAMP, - VALID_UNTIL_TIMESTAMP - ) VALUES ( - nextval('DATA_SET_PROPERTY_ID_SEQ'), - OLD.DS_ID, - OLD.DSTPT_ID, - OLD.VALUE, - OLD.CVTE_ID, - OLD.MATE_PROP_ID, - OLD.PERS_ID_AUTHOR, - OLD.MODIFICATION_TIMESTAMP, - current_timestamp - ); - -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, - DS_ID, - DSTPT_ID, - VALUE, - CVTE_ID, - MATE_PROP_ID, - PERS_ID_AUTHOR, - VALID_FROM_TIMESTAMP, - VALID_UNTIL_TIMESTAMP - ) VALUES ( - nextval('DATA_SET_PROPERTY_ID_SEQ'), - OLD.DS_ID, - OLD.DSTPT_ID, - OLD.VALUE, - OLD.CVTE_ID, - OLD.MATE_PROP_ID, - OLD.PERS_ID_AUTHOR, - OLD.MODIFICATION_TIMESTAMP, - current_timestamp - ); CREATE OR REPLACE RULE data_set_relationships_insert AS diff --git a/openbis/source/sql/postgresql/migration/migration-090-091.sql b/openbis/source/sql/postgresql/migration/migration-090-091.sql index f635c26ec70ea7a7fb1ae23cb840afd5be630d01..4a5b66bf0546f5535d0fe01f82441aa89ac1e19c 100644 --- a/openbis/source/sql/postgresql/migration/migration-090-091.sql +++ b/openbis/source/sql/postgresql/migration/migration-090-091.sql @@ -74,10 +74,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) + WHERE (OLD.VALUE IS NOT NULL AND decode(substring(OLD.value from 1 for 1), 'escape') != E'\\xefbfbd' 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)) + 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, @@ -103,10 +102,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 + WHERE (OLD.VALUE IS NOT NULL AND decode(substring(OLD.value from 1 for 1), 'escape') != E'\\xefbfbd') OR OLD.CVTE_ID IS NOT NULL - OR OLD.MATE_PROP_ID IS NOT NULL) + OR OLD.MATE_PROP_ID IS NOT NULL DO ALSO INSERT INTO material_properties_history ( ID, @@ -134,10 +132,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) + WHERE (OLD.VALUE IS NOT NULL AND decode(substring(OLD.value from 1 for 1), 'escape') != E'\\xefbfbd' 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)) + 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, @@ -163,10 +160,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 + WHERE (OLD.VALUE IS NOT NULL AND decode(substring(OLD.value from 1 for 1), 'escape') != E'\\xefbfbd') OR OLD.CVTE_ID IS NOT NULL - OR OLD.MATE_PROP_ID IS NOT NULL) + OR OLD.MATE_PROP_ID IS NOT NULL DO ALSO INSERT INTO experiment_properties_history ( ID, @@ -194,10 +190,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) + WHERE (OLD.VALUE IS NOT NULL AND decode(substring(OLD.value from 1 for 1), 'escape') != E'\\xefbfbd' 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)) + 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, @@ -223,10 +218,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 + WHERE (OLD.VALUE IS NOT NULL AND decode(substring(OLD.value from 1 for 1), 'escape') != E'\\xefbfbd') OR OLD.CVTE_ID IS NOT NULL - OR OLD.MATE_PROP_ID IS NOT NULL) + OR OLD.MATE_PROP_ID IS NOT NULL DO ALSO INSERT INTO sample_properties_history ( ID, @@ -254,10 +248,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) + WHERE (OLD.VALUE IS NOT NULL AND decode(substring(OLD.value from 1 for 1), 'escape') != E'\\xefbfbd' 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)) + 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, @@ -283,10 +276,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 + WHERE (OLD.VALUE IS NOT NULL AND decode(substring(OLD.value from 1 for 1), 'escape') != E'\\xefbfbd') OR OLD.CVTE_ID IS NOT NULL - OR OLD.MATE_PROP_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 59fc8e3589cf2d1eed0e2c8e5060a7969ca6b3bd..29b7a875d6a849182062793410dddbb2a0c05d1e 100644 --- a/openbis/sourceTest/sql/postgresql/091/finish-091.sql +++ b/openbis/sourceTest/sql/postgresql/091/finish-091.sql @@ -305,10 +305,9 @@ CREATE RULE data_deleted_update AS ON UPDATE TO data_deleted DO INSTEAD UPDATE d CREATE RULE data_insert AS ON INSERT TO data DO INSTEAD INSERT INTO data_all (id, code, ctnr_id, ctnr_order, del_id, expe_id, dast_id, data_producer_code, dsty_id, is_derived, is_placeholder, is_valid, modification_timestamp, pers_id_registerer, production_timestamp, registration_timestamp, samp_id) VALUES (new.id, new.code, new.ctnr_id, new.ctnr_order, new.del_id, new.expe_id, new.dast_id, new.data_producer_code, new.dsty_id, new.is_derived, new.is_placeholder, new.is_valid, new.modification_timestamp, new.pers_id_registerer, new.production_timestamp, new.registration_timestamp, new.samp_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) + WHERE (OLD.VALUE IS NOT NULL AND decode(substring(OLD.value from 1 for 1), 'escape') != E'\\xefbfbd' 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)) + 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, @@ -333,10 +332,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 + WHERE (OLD.VALUE IS NOT NULL AND decode(substring(OLD.value from 1 for 1), 'escape') != E'\\xefbfbd') OR OLD.CVTE_ID IS NOT NULL - OR OLD.MATE_PROP_ID IS NOT NULL) + OR OLD.MATE_PROP_ID IS NOT NULL DO ALSO INSERT INTO data_set_properties_history ( ID, @@ -366,10 +364,9 @@ CREATE RULE experiment_delete AS ON DELETE TO experiments DO INSTEAD DELETE FROM CREATE RULE experiment_insert AS ON INSERT TO experiments DO INSTEAD INSERT INTO experiments_all (id, code, del_id, exty_id, is_public, mate_id_study_object, modification_timestamp, perm_id, pers_id_registerer, proj_id, registration_timestamp) VALUES (new.id, new.code, new.del_id, new.exty_id, new.is_public, new.mate_id_study_object, new.modification_timestamp, new.perm_id, new.pers_id_registerer, new.proj_id, new.registration_timestamp); 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) + WHERE (OLD.VALUE IS NOT NULL AND decode(substring(OLD.value from 1 for 1), 'escape') != E'\\xefbfbd' 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)) + 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, @@ -394,10 +391,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 + WHERE (OLD.VALUE IS NOT NULL AND decode(substring(OLD.value from 1 for 1), 'escape') != E'\\xefbfbd') OR OLD.CVTE_ID IS NOT NULL - OR OLD.MATE_PROP_ID IS NOT NULL) + OR OLD.MATE_PROP_ID IS NOT NULL DO ALSO INSERT INTO experiment_properties_history ( ID, @@ -425,10 +421,9 @@ CREATE RULE experiments_deleted_delete AS ON DELETE TO experiments_deleted DO IN CREATE RULE experiments_deleted_update AS ON UPDATE TO experiments_deleted DO INSTEAD UPDATE experiments_all SET del_id = new.del_id, modification_timestamp = new.modification_timestamp WHERE ((experiments_all.id)::bigint = (new.id)::bigint); 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) + WHERE (OLD.VALUE IS NOT NULL AND decode(substring(OLD.value from 1 for 1), 'escape') != E'\\xefbfbd' 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)) + 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, @@ -453,10 +448,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 + WHERE (OLD.VALUE IS NOT NULL AND decode(substring(OLD.value from 1 for 1), 'escape') != E'\\xefbfbd') OR OLD.CVTE_ID IS NOT NULL - OR OLD.MATE_PROP_ID IS NOT NULL) + OR OLD.MATE_PROP_ID IS NOT NULL DO ALSO INSERT INTO material_properties_history ( ID, @@ -485,10 +479,9 @@ CREATE RULE sample_deleted_update AS ON UPDATE TO samples_deleted DO INSTEAD UPD CREATE RULE sample_insert AS ON INSERT TO samples DO INSTEAD INSERT INTO samples_all (id, code, dbin_id, del_id, expe_id, modification_timestamp, perm_id, pers_id_registerer, registration_timestamp, samp_id_part_of, saty_id, space_id) VALUES (new.id, new.code, new.dbin_id, new.del_id, new.expe_id, new.modification_timestamp, new.perm_id, new.pers_id_registerer, new.registration_timestamp, new.samp_id_part_of, new.saty_id, new.space_id); 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) + WHERE (OLD.VALUE IS NOT NULL AND decode(substring(OLD.value from 1 for 1), 'escape') != E'\\xefbfbd' 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)) + 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, @@ -513,10 +506,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 + WHERE (OLD.VALUE IS NOT NULL AND decode(substring(OLD.value from 1 for 1), 'escape') != E'\\xefbfbd') OR OLD.CVTE_ID IS NOT NULL - OR OLD.MATE_PROP_ID IS NOT NULL) + OR OLD.MATE_PROP_ID IS NOT NULL DO ALSO INSERT INTO sample_properties_history ( ID,