From e3e87a618f35d9b0778e9d6573f74cf6685ab760 Mon Sep 17 00:00:00 2001
From: kaloyane <kaloyane>
Date: Fri, 6 May 2011 12:30:53 +0000
Subject: [PATCH] [LMS-2104] database changes for Virtual Datasets

SVN: 21158
---
 .../generic/shared/dto/ColumnNames.java       |  6 ++
 .../openbis/generic/shared/dto/DataPE.java    | 68 +++++++++++++++++++
 openbis/source/sql/generic/071/schema-071.sql |  3 +-
 .../migration/migration-070-071.sql           |  9 +++
 .../sql/postgresql/071/007=data.tsv           | 20 +++---
 .../071/017=database_version_logs.tsv         |  2 +-
 .../sql/postgresql/071/finish-071.sql         |  2 +
 .../sql/postgresql/071/schema-071.sql         |  5 +-
 8 files changed, 102 insertions(+), 13 deletions(-)

diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/shared/dto/ColumnNames.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/shared/dto/ColumnNames.java
index a2f90dc93ba..1e62ff807df 100644
--- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/shared/dto/ColumnNames.java
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/shared/dto/ColumnNames.java
@@ -48,6 +48,10 @@ public final class ColumnNames
 
     public static final String DATA_PARENT_COLUMN = "data_id_parent";
 
+    public static final String DATA_VIRTUAL_PARENT_COLUMN = "virt_parent_id";
+
+    public static final String DATA_VIRTUAL_ORDER_COLUMN = "virt_order";
+
     public static final String DATA_PRODUCER_CODE_COLUMN = "data_producer_code";
 
     public static final String DATA_SET_TYPE_COLUMN = "dsty_id";
@@ -124,6 +128,8 @@ public final class ColumnNames
 
     public static final String IS_DERIVED = "is_derived";
 
+    public static final String IS_VIRTUAL = "is_virtual";
+
     public static final String IS_PUBLIC = "is_public";
 
     public static final String IS_OFFICIAL = "is_official";
diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/shared/dto/DataPE.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/shared/dto/DataPE.java
index 6db58ad0358..fb1c4dde1bb 100644
--- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/shared/dto/DataPE.java
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/shared/dto/DataPE.java
@@ -16,8 +16,10 @@
 
 package ch.systemsx.cisd.openbis.generic.shared.dto;
 
+import java.util.ArrayList;
 import java.util.Date;
 import java.util.HashSet;
+import java.util.List;
 import java.util.Set;
 
 import javax.persistence.CascadeType;
@@ -93,6 +95,8 @@ public class DataPE extends AbstractIdAndCodeHolder<DataPE> implements
 
     private boolean isDerived;
 
+    private boolean isVirtual;
+
     private PersonPE registrator;
 
     /** Registration date of the database instance. */
@@ -114,6 +118,15 @@ public class DataPE extends AbstractIdAndCodeHolder<DataPE> implements
 
     private Set<DataPE> children = new HashSet<DataPE>();
 
+    private DataPE virtualParent = null;
+
+    private List<DataPE> virtualChildren = new ArrayList<DataPE>();
+
+    /**
+     * the index of this {@link DataPE} within its virtual parent.
+     */
+    private int virtualOrder;
+
     private DataStorePE dataStore;
 
     @ManyToOne(fetch = FetchType.LAZY)
@@ -179,6 +192,7 @@ public class DataPE extends AbstractIdAndCodeHolder<DataPE> implements
         return isDerived;
     }
 
+
     /**
      * Set to <code>true</code> if this data set is data set is derived from a sample (otherwise it
      * is measured from a sample).
@@ -188,6 +202,34 @@ public class DataPE extends AbstractIdAndCodeHolder<DataPE> implements
         this.isDerived = isDerived;
     }
 
+    /**
+     * Returns <code>true</code> if this data set is data set is virtual data set.
+     */
+    @Column(name = ColumnNames.IS_VIRTUAL)
+    public boolean isVirtual()
+    {
+        return isVirtual;
+    }
+
+    /**
+     * Set to <code>true</code> if this data set is virtual data set.
+     */
+    public void setVirtual(boolean isVirtual)
+    {
+        this.isVirtual = isVirtual;
+    }
+
+    @Column(name = ColumnNames.DATA_VIRTUAL_ORDER_COLUMN)
+    public int getVirtualOrder()
+    {
+        return virtualOrder;
+    }
+
+    public void setVirtualOrder(Integer virtualOrder)
+    {
+        this.virtualOrder = (virtualOrder != null) ? virtualOrder : 0;
+    }
+
     /**
      * Returns <code>true</code> if this data set is data set is measured from a sample (otherwise
      * it is derived from a sample).
@@ -396,6 +438,32 @@ public class DataPE extends AbstractIdAndCodeHolder<DataPE> implements
         this.children.remove(child);
     }
 
+    @SuppressWarnings("unused")
+    @ManyToOne(fetch = FetchType.EAGER, targetEntity = DataPE.class)
+    @JoinColumn(name = ColumnNames.DATA_VIRTUAL_PARENT_COLUMN)
+    private DataPE getVirtualParentInternal()
+    {
+        return virtualParent;
+    }
+
+    @SuppressWarnings("unused")
+    private void setVirtualParentInternal(final DataPE virtualParent)
+    {
+        this.virtualParent = virtualParent;
+    }
+
+    
+    @OneToMany(mappedBy = "virtualParentInternal", fetch = FetchType.LAZY)
+    public List<DataPE> getVirtualChildren()
+    {
+        return virtualChildren;
+    }
+
+    public void setVirtualChildren(List<DataPE> virtualChildren)
+    {
+        this.virtualChildren = virtualChildren;
+    }
+
     //
     // AbstractIdAndCodeHolder
     //
diff --git a/openbis/source/sql/generic/071/schema-071.sql b/openbis/source/sql/generic/071/schema-071.sql
index 4505bde0c4f..d22651b0ab7 100644
--- a/openbis/source/sql/generic/071/schema-071.sql
+++ b/openbis/source/sql/generic/071/schema-071.sql
@@ -2,7 +2,7 @@
 
 CREATE TABLE CONTROLLED_VOCABULARIES (ID TECH_ID NOT NULL,CODE CODE NOT NULL,DESCRIPTION DESCRIPTION_2000,REGISTRATION_TIMESTAMP TIME_STAMP_DFL NOT NULL DEFAULT CURRENT_TIMESTAMP,PERS_ID_REGISTERER TECH_ID NOT NULL,IS_MANAGED_INTERNALLY BOOLEAN_CHAR NOT NULL DEFAULT 'F',IS_INTERNAL_NAMESPACE BOOLEAN_CHAR NOT NULL DEFAULT 'F',DBIN_ID TECH_ID NOT NULL, MODIFICATION_TIMESTAMP TIME_STAMP DEFAULT CURRENT_TIMESTAMP, IS_CHOSEN_FROM_LIST BOOLEAN_CHAR NOT NULL DEFAULT TRUE, SOURCE_URI CHARACTER VARYING(250));
 CREATE TABLE CONTROLLED_VOCABULARY_TERMS (ID TECH_ID NOT NULL,CODE OBJECT_NAME NOT NULL,REGISTRATION_TIMESTAMP TIME_STAMP_DFL NOT NULL DEFAULT CURRENT_TIMESTAMP,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 NOT NULL DEFAULT 'T');
-CREATE TABLE DATA (ID TECH_ID NOT NULL,CODE CODE,DSTY_ID TECH_ID NOT NULL,DAST_ID TECH_ID NOT NULL,EXPE_ID TECH_ID NOT NULL,DATA_PRODUCER_CODE CODE,PRODUCTION_TIMESTAMP TIME_STAMP,SAMP_ID TECH_ID,REGISTRATION_TIMESTAMP TIME_STAMP_DFL NOT NULL DEFAULT CURRENT_TIMESTAMP,PERS_ID_REGISTERER TECH_ID,IS_PLACEHOLDER BOOLEAN_CHAR DEFAULT 'F',IS_VALID BOOLEAN_CHAR DEFAULT 'T', MODIFICATION_TIMESTAMP TIME_STAMP DEFAULT CURRENT_TIMESTAMP, IS_DERIVED BOOLEAN_CHAR NOT NULL);
+CREATE TABLE DATA (ID TECH_ID NOT NULL,CODE CODE,DSTY_ID TECH_ID NOT NULL,DAST_ID TECH_ID NOT NULL,EXPE_ID TECH_ID NOT NULL,DATA_PRODUCER_CODE CODE,PRODUCTION_TIMESTAMP TIME_STAMP,SAMP_ID TECH_ID,REGISTRATION_TIMESTAMP TIME_STAMP_DFL NOT NULL DEFAULT CURRENT_TIMESTAMP,PERS_ID_REGISTERER TECH_ID,IS_PLACEHOLDER BOOLEAN_CHAR DEFAULT 'F',IS_VALID BOOLEAN_CHAR DEFAULT 'T', MODIFICATION_TIMESTAMP TIME_STAMP DEFAULT CURRENT_TIMESTAMP, IS_DERIVED BOOLEAN_CHAR NOT NULL, IS_VIRTUAL BOOLEAN_CHAR DEFAULT FALSE, VIRT_ORDER INTEGER, VIRT_PARENT_ID TECH_ID DEFAULT NULL);
 CREATE TABLE DATABASE_INSTANCES (ID TECH_ID NOT NULL,CODE CODE NOT NULL,UUID CODE NOT NULL,IS_ORIGINAL_SOURCE BOOLEAN_CHAR NOT NULL DEFAULT 'F',REGISTRATION_TIMESTAMP TIME_STAMP_DFL NOT NULL DEFAULT CURRENT_TIMESTAMP);
 CREATE TABLE DATA_SET_RELATIONSHIPS (DATA_ID_PARENT TECH_ID NOT NULL,DATA_ID_CHILD TECH_ID NOT NULL);
 CREATE TABLE DATA_STORES (ID TECH_ID NOT NULL,DBIN_ID TECH_ID NOT NULL,CODE CODE NOT NULL,DOWNLOAD_URL VARCHAR(1024) NOT NULL,REMOTE_URL VARCHAR(250) NOT NULL,SESSION_TOKEN VARCHAR(50) NOT NULL,REGISTRATION_TIMESTAMP TIME_STAMP_DFL NOT NULL DEFAULT CURRENT_TIMESTAMP,MODIFICATION_TIMESTAMP TIME_STAMP DEFAULT CURRENT_TIMESTAMP, IS_ARCHIVER_CONFIGURED BOOLEAN_CHAR NOT NULL DEFAULT 'F');
@@ -203,6 +203,7 @@ ALTER TABLE DATA ADD CONSTRAINT DATA_EXPE_FK FOREIGN KEY (EXPE_ID) REFERENCES EX
 ALTER TABLE DATA ADD CONSTRAINT DATA_SAMP_FK FOREIGN KEY (SAMP_ID) REFERENCES SAMPLES(ID);
 ALTER TABLE DATA ADD CONSTRAINT DATA_DAST_FK FOREIGN KEY (DAST_ID) REFERENCES DATA_STORES(ID);
 ALTER TABLE DATA ADD CONSTRAINT DATA_PERS_FK FOREIGN KEY (PERS_ID_REGISTERER) REFERENCES PERSONS(ID);
+ALTER TABLE DATA ADD CONSTRAINT DATA_VIRT_PARENT_FK FOREIGN KEY (VIRT_PARENT_ID) REFERENCES DATA(ID);
 ALTER TABLE DATA_SET_RELATIONSHIPS ADD CONSTRAINT DSRE_DATA_FK_CHILD FOREIGN KEY (DATA_ID_CHILD) REFERENCES DATA(ID);
 ALTER TABLE DATA_SET_RELATIONSHIPS ADD CONSTRAINT DSRE_DATA_FK_PARENT FOREIGN KEY (DATA_ID_PARENT) REFERENCES DATA(ID);
 ALTER TABLE sample_relationships ADD CONSTRAINT sare_data_fk_child FOREIGN KEY (sample_id_child) REFERENCES samples(id) ON DELETE CASCADE;
diff --git a/openbis/source/sql/postgresql/migration/migration-070-071.sql b/openbis/source/sql/postgresql/migration/migration-070-071.sql
index 70f06537f3f..21dc4360e15 100644
--- a/openbis/source/sql/postgresql/migration/migration-070-071.sql
+++ b/openbis/source/sql/postgresql/migration/migration-070-071.sql
@@ -1,2 +1,11 @@
 -- Migration from 070 to 071
 ALTER TABLE CONTROLLED_VOCABULARY_TERMS ADD COLUMN IS_OFFICIAL BOOLEAN_CHAR NOT NULL DEFAULT 'T';
+
+-- 
+-- Virtual data set related changes
+--
+ALTER TABLE DATA ADD COLUMN IS_VIRTUAL BOOLEAN_CHAR DEFAULT false;
+ALTER TABLE DATA ADD COLUMN VIRT_ORDER INTEGER;
+ALTER TABLE DATA ADD COLUMN VIRT_PARENT_ID TECH_ID DEFAULT NULL;
+ALTER TABLE DATA ADD CONSTRAINT DATA_VIRT_PARENT_FK FOREIGN KEY (VIRT_PARENT_ID) REFERENCES DATA(ID);
+
diff --git a/openbis/sourceTest/sql/postgresql/071/007=data.tsv b/openbis/sourceTest/sql/postgresql/071/007=data.tsv
index facf0357eb8..93c42b91e72 100644
--- a/openbis/sourceTest/sql/postgresql/071/007=data.tsv
+++ b/openbis/sourceTest/sql/postgresql/071/007=data.tsv
@@ -1,10 +1,10 @@
-2	20081105092158673-1	2	\N	2008-11-05 09:21:58.688+01	2008-11-05 09:21:58.798+01	f	t	2009-03-23 15:34:44.462776+01	2	1	f	982	\N
-4	20081105092159188-3	2	\N	2008-11-05 09:21:59.203+01	2008-11-05 09:21:59.313+01	f	t	2009-03-23 15:34:44.462776+01	2	1	t	\N	\N
-5	20081105092159111-1	2	\N	2008-11-05 09:21:59.203+01	2009-02-09 12:20:21.646654+01	f	t	2009-03-23 15:34:44.462776+01	18	1	f	1042	\N
-6	20081105092159222-2	2	\N	2008-11-05 09:21:59.203+01	2009-02-09 12:21:11.479816+01	f	t	2009-03-23 15:34:44.462776+01	19	1	f	1043	\N
-7	20081105092159333-3	2	\N	2008-11-05 09:21:59.203+01	2009-02-09 12:21:47.815468+01	f	t	2009-03-23 15:34:44.462776+01	20	1	f	1044	\N
-8	20081105092259000-8	2	\N	2008-11-05 09:22:59.203+01	2008-11-05 09:22:59.313+01	f	t	2009-03-23 15:34:44.462776+01	8	1	t	\N	\N
-9	20081105092259000-9	2	\N	2008-11-05 09:22:59.203+01	2008-11-05 09:22:59.313+01	f	t	2009-03-23 15:34:44.462776+01	8	1	t	\N	\N
-10	20081105092259900-0	2	\N	2008-11-05 09:22:59.203+01	2008-11-05 09:22:59.313+01	f	t	2009-03-23 15:34:44.462776+01	8	1	t	\N	\N
-11	20081105092259900-1	2	\N	2008-11-05 09:22:59.203+01	2008-11-05 09:22:59.313+01	f	t	2009-03-23 15:34:44.462776+01	8	1	t	\N	\N
-12	20081105092359990-2	2	\N	2008-11-05 09:22:59.203+01	2008-11-05 09:22:59.313+01	f	t	2009-03-23 15:34:44.462776+01	8	1	t	\N	\N
+2	20081105092158673-1	2	\N	2008-11-05 09:21:58.688+01	2008-11-05 09:21:58.798+01	f	t	2009-03-23 15:34:44.462776+01	2	1	f	982	\N	f	\N	\N
+4	20081105092159188-3	2	\N	2008-11-05 09:21:59.203+01	2008-11-05 09:21:59.313+01	f	t	2009-03-23 15:34:44.462776+01	2	1	t	\N	\N	f	\N	\N
+5	20081105092159111-1	2	\N	2008-11-05 09:21:59.203+01	2009-02-09 12:20:21.646654+01	f	t	2009-03-23 15:34:44.462776+01	18	1	f	1042	\N	f	\N	\N
+6	20081105092159222-2	2	\N	2008-11-05 09:21:59.203+01	2009-02-09 12:21:11.479816+01	f	t	2009-03-23 15:34:44.462776+01	19	1	f	1043	\N	f	\N	\N
+7	20081105092159333-3	2	\N	2008-11-05 09:21:59.203+01	2009-02-09 12:21:47.815468+01	f	t	2009-03-23 15:34:44.462776+01	20	1	f	1044	\N	f	\N	\N
+8	20081105092259000-8	2	\N	2008-11-05 09:22:59.203+01	2008-11-05 09:22:59.313+01	f	t	2009-03-23 15:34:44.462776+01	8	1	t	\N	\N	f	\N	\N
+9	20081105092259000-9	2	\N	2008-11-05 09:22:59.203+01	2008-11-05 09:22:59.313+01	f	t	2009-03-23 15:34:44.462776+01	8	1	t	\N	\N	f	\N	\N
+10	20081105092259900-0	2	\N	2008-11-05 09:22:59.203+01	2008-11-05 09:22:59.313+01	f	t	2009-03-23 15:34:44.462776+01	8	1	t	\N	\N	f	\N	\N
+11	20081105092259900-1	2	\N	2008-11-05 09:22:59.203+01	2008-11-05 09:22:59.313+01	f	t	2009-03-23 15:34:44.462776+01	8	1	t	\N	\N	f	\N	\N
+12	20081105092359990-2	2	\N	2008-11-05 09:22:59.203+01	2008-11-05 09:22:59.313+01	f	t	2009-03-23 15:34:44.462776+01	8	1	t	\N	\N	f	\N	\N
diff --git a/openbis/sourceTest/sql/postgresql/071/017=database_version_logs.tsv b/openbis/sourceTest/sql/postgresql/071/017=database_version_logs.tsv
index c4dd7d4dd63..95c0ae77add 100644
--- a/openbis/sourceTest/sql/postgresql/071/017=database_version_logs.tsv
+++ b/openbis/sourceTest/sql/postgresql/071/017=database_version_logs.tsv
@@ -44,4 +44,4 @@
 068	source/sql/postgresql/migration/migration-067-068.sql	SUCCESS	2011-03-18 14:04:55.005	\\x2d2d204d6967726174696f6e2066726f6d2030363720746f203036380a414c54455220444f4d41494e20415243484956494e475f5354415455532044524f5020434f4e53545241494e5420415243484956494e475f5354415455535f434845434b3b0a414c54455220444f4d41494e20415243484956494e475f5354415455532041444420434f4e53545241494e5420415243484956494e475f5354415455535f434845434b20434845434b202856414c554520494e2028274c4f434b4544272c2027415641494c41424c45272c20274152434849564544272c2027415243484956455f50454e44494e47272c2027554e415243484956455f50454e44494e47272c20274241434b55505f50454e44494e472729293b0a0a0a	\N
 069	source/sql/postgresql/migration/migration-068-069.sql	SUCCESS	2011-04-04 14:23:35.016	\\x2d2d204d6967726174696f6e2066726f6d2030363820746f203036390a0a43524541544520494e44455820534150525f4d4150525f464b5f49204f4e2053414d504c455f50524f5045525449455320284d4154455f50524f505f4944293b0a43524541544520494e44455820455850525f4d4150525f464b5f49204f4e204558504552494d454e545f50524f5045525449455320284d4154455f50524f505f4944293b0a43524541544520494e444558204d4150525f4d4150525f464b5f49204f4e204d4154455249414c5f50524f5045525449455320284d4154455f50524f505f4944293b0a43524541544520494e44455820445350525f4d4150525f464b5f49204f4e20444154415f5345545f50524f5045525449455320284d4154455f50524f505f4944293b0a	\N
 070	source/sql/postgresql/migration/migration-069-070.sql	SUCCESS	2011-04-19 14:47:34.742	\\x0a2d2d204d6967726174696f6e2066726f6d2030363920746f203037300a414c544552205441424c452045585445524e414c5f444154412041444420434f4c554d4e2053504545445f48494e5420494e54454745523b0a	\N
-071	source/sql/postgresql/migration/migration-070-071.sql	SUCCESS	2011-05-04 14:57:37.131	\\x2d2d204d6967726174696f6e2066726f6d2030373020746f203037310a414c544552205441424c4520434f4e54524f4c4c45445f564f434142554c4152595f5445524d532041444420434f4c554d4e2049535f4f4646494349414c20424f4f4c45414e5f43484152204e4f54204e554c4c2044454641554c54202754273b0a	\N
+071	source/sql/postgresql/migration/migration-070-071.sql	SUCCESS	2011-05-06 14:01:57.781	\\x2d2d204d6967726174696f6e2066726f6d2030373020746f203037310a414c544552205441424c4520434f4e54524f4c4c45445f564f434142554c4152595f5445524d532041444420434f4c554d4e2049535f4f4646494349414c20424f4f4c45414e5f43484152204e4f54204e554c4c2044454641554c54202754273b0a0a2d2d200a2d2d205669727475616c2064617461207365742072656c61746564206368616e6765730a2d2d0a414c544552205441424c4520444154412041444420434f4c554d4e2049535f5649525455414c20424f4f4c45414e5f434841522044454641554c542066616c73653b0a414c544552205441424c4520444154412041444420434f4c554d4e20564952545f4f5244455220494e54454745523b0a414c544552205441424c4520444154412041444420434f4c554d4e20564952545f504152454e545f494420544543485f49442044454641554c54204e554c4c3b0a414c544552205441424c4520444154412041444420434f4e53545241494e5420444154415f564952545f504152454e545f464b20464f524549474e204b45592028564952545f504152454e545f494429205245464552454e4345532044415441284944293b0a0a	\N
diff --git a/openbis/sourceTest/sql/postgresql/071/finish-071.sql b/openbis/sourceTest/sql/postgresql/071/finish-071.sql
index db8142135c1..cb507412776 100644
--- a/openbis/sourceTest/sql/postgresql/071/finish-071.sql
+++ b/openbis/sourceTest/sql/postgresql/071/finish-071.sql
@@ -314,6 +314,8 @@ ALTER TABLE ONLY data
     ADD CONSTRAINT data_pers_fk FOREIGN KEY (pers_id_registerer) REFERENCES persons(id);
 ALTER TABLE ONLY data
     ADD CONSTRAINT data_samp_fk FOREIGN KEY (samp_id) REFERENCES samples(id);
+ALTER TABLE ONLY data
+    ADD CONSTRAINT data_virt_parent_fk FOREIGN KEY (virt_parent_id) REFERENCES data(id);
 ALTER TABLE ONLY data_set_properties
     ADD CONSTRAINT dspr_cvte_fk FOREIGN KEY (cvte_id) REFERENCES controlled_vocabulary_terms(id);
 ALTER TABLE ONLY data_set_properties
diff --git a/openbis/sourceTest/sql/postgresql/071/schema-071.sql b/openbis/sourceTest/sql/postgresql/071/schema-071.sql
index 2033ecd91db..703050cb04e 100644
--- a/openbis/sourceTest/sql/postgresql/071/schema-071.sql
+++ b/openbis/sourceTest/sql/postgresql/071/schema-071.sql
@@ -379,7 +379,10 @@ CREATE TABLE data (
     dast_id tech_id NOT NULL,
     is_derived boolean_char NOT NULL,
     samp_id tech_id,
-    pers_id_registerer tech_id
+    pers_id_registerer tech_id,
+    is_virtual boolean_char DEFAULT false,
+    virt_order integer,
+    virt_parent_id tech_id DEFAULT NULL::bigint
 );
 CREATE SEQUENCE data_id_seq
     START WITH 1
-- 
GitLab