From f3912e55be0d9d6765e2102ceff1b9f6e3b15145 Mon Sep 17 00:00:00 2001
From: buczekp <buczekp>
Date: Mon, 8 Aug 2011 08:40:35 +0000
Subject: [PATCH] [LMS-2441] improved speed of logical deletion of containers
 (we don't need to list components of components)

SVN: 22401
---
 .../generic/server/business/bo/TrashBO.java   | 31 ++++++++++++++++---
 1 file changed, 27 insertions(+), 4 deletions(-)

diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/business/bo/TrashBO.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/business/bo/TrashBO.java
index 4ee7cfb1d18..d6e105e9b55 100644
--- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/business/bo/TrashBO.java
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/business/bo/TrashBO.java
@@ -39,6 +39,11 @@ import ch.systemsx.cisd.openbis.generic.shared.dto.properties.EntityKind;
  */
 public class TrashBO extends AbstractBusinessObject implements ITrashBO
 {
+    private enum CascadeSampleDependentComponents
+    {
+        TRUE, FALSE
+    }
+
     private DeletionPE deletion;
 
     public TrashBO(IDAOFactory daoFactory, Session session)
@@ -61,6 +66,13 @@ public class TrashBO extends AbstractBusinessObject implements ITrashBO
     }
 
     public void trashSamples(final List<TechId> sampleIds)
+    {
+        assert deletion != null;
+        trashSamples(sampleIds, CascadeSampleDependentComponents.TRUE);
+    }
+
+    void trashSamples(final List<TechId> sampleIds,
+            final CascadeSampleDependentComponents cascadeType)
     {
         assert deletion != null;
 
@@ -70,7 +82,11 @@ public class TrashBO extends AbstractBusinessObject implements ITrashBO
 
         if (batchOperation.counter > 0)
         {
-            trashSampleDependentChildrenAndComponents(sampleIds);
+            trashSampleDependentChildren(sampleIds);
+            if (cascadeType == CascadeSampleDependentComponents.TRUE)
+            {
+                trashSampleDependentComponents(sampleIds);
+            }
             trashSampleDependentDataSets(sampleIds);
         }
     }
@@ -101,7 +117,7 @@ public class TrashBO extends AbstractBusinessObject implements ITrashBO
         // NOTE: data set children are not cascade trashed - a conscious decision made by Tomek
     }
 
-    private void trashSampleDependentChildrenAndComponents(List<TechId> sampleIds)
+    private void trashSampleDependentChildren(List<TechId> sampleIds)
     {
         final ISampleDAO sampleDAO = getSampleDAO();
 
@@ -117,8 +133,13 @@ public class TrashBO extends AbstractBusinessObject implements ITrashBO
                     };
         BatchOperationExecutor.executeInBatches(batchOperation);
         trashSamples(batchOperation.getResults());
+    }
+    
+    private void trashSampleDependentComponents(List<TechId> sampleIds)
+    {
+        final ISampleDAO sampleDAO = getSampleDAO();
 
-        batchOperation =
+        AbstractQueryBatchOperation batchOperation =
                 new AbstractQueryBatchOperation(EntityKind.SAMPLE, sampleIds,
                         "listSampleIdsByContainerIds")
                     {
@@ -129,7 +150,9 @@ public class TrashBO extends AbstractBusinessObject implements ITrashBO
                         }
                     };
         BatchOperationExecutor.executeInBatches(batchOperation);
-        trashSamples(batchOperation.getResults());
+        // We have a business rule that there is just 1 level of components and using this here
+        // improves performance.
+        trashSamples(batchOperation.getResults(), CascadeSampleDependentComponents.FALSE);
     }
 
     private void trashSampleDependentDataSets(List<TechId> sampleIds)
-- 
GitLab