From 88c75d3a4e3e37d7e38f428d26d082d83633973c Mon Sep 17 00:00:00 2001
From: buczekp <buczekp>
Date: Thu, 11 Nov 2010 15:14:08 +0000
Subject: [PATCH] [LMS-1772] use cache of samples (reduces time spend on
 loading parents for 1000 samples with the same parent from 12s to <100ms)

SVN: 18642
---
 .../bo/AbstractSampleBusinessObject.java      |  1 -
 ...bstractSampleIdentifierBusinessObject.java | 46 ++++++++++++-------
 2 files changed, 30 insertions(+), 17 deletions(-)

diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/business/bo/AbstractSampleBusinessObject.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/business/bo/AbstractSampleBusinessObject.java
index b59329d8cad..6782ed2b31e 100644
--- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/business/bo/AbstractSampleBusinessObject.java
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/business/bo/AbstractSampleBusinessObject.java
@@ -214,7 +214,6 @@ abstract class AbstractSampleBusinessObject extends AbstractSampleIdentifierBusi
         final Set<SamplePE> parentPEs = new HashSet<SamplePE>();
         for (SampleIdentifier si : parentIdentifiers)
         {
-            // TODO 2010-11-10, Piotr Buczek: use cache
             SamplePE parent = getSampleByIdentifier(si);
             parentPEs.add(parent);
         }
diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/business/bo/AbstractSampleIdentifierBusinessObject.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/business/bo/AbstractSampleIdentifierBusinessObject.java
index b504e0c0ffb..bc2e7eb3f84 100644
--- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/business/bo/AbstractSampleIdentifierBusinessObject.java
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/business/bo/AbstractSampleIdentifierBusinessObject.java
@@ -16,6 +16,9 @@
 
 package ch.systemsx.cisd.openbis.generic.server.business.bo;
 
+import java.util.HashMap;
+import java.util.Map;
+
 import ch.systemsx.cisd.common.exceptions.UserFailureException;
 import ch.systemsx.cisd.openbis.generic.server.business.bo.util.SampleOwner;
 import ch.systemsx.cisd.openbis.generic.server.business.bo.util.SampleOwnerFinder;
@@ -35,6 +38,9 @@ import ch.systemsx.cisd.openbis.generic.shared.util.HibernateUtils;
  */
 abstract class AbstractSampleIdentifierBusinessObject extends AbstractBusinessObject
 {
+    private final Map<SampleIdentifier, SamplePE> sampleByIdentifierCache =
+            new HashMap<SampleIdentifier, SamplePE>();
+
     private final SampleOwnerFinder sampleOwnerFinder;
 
     AbstractSampleIdentifierBusinessObject(final IDAOFactory daoFactory, final Session session)
@@ -70,27 +76,35 @@ abstract class AbstractSampleIdentifierBusinessObject extends AbstractBusinessOb
 
     protected SamplePE tryToGetSampleByIdentifier(final SampleIdentifier sampleIdentifier)
     {
-        // TODO 2010-11-10, Piotr Buczek: use cache
         assert sampleIdentifier != null : "Sample identifier unspecified.";
-        final SampleOwner sampleOwner = sampleOwnerFinder.figureSampleOwner(sampleIdentifier);
-        final String sampleCode = sampleIdentifier.getSampleCode();
-        final ISampleDAO sampleDAO = getSampleDAO();
-        final SamplePE sample;
-        if (sampleOwner.isDatabaseInstanceLevel())
+
+        final SamplePE cachedResult = sampleByIdentifierCache.get(sampleIdentifier);
+        if (cachedResult != null)
         {
-            sample =
-                    sampleDAO.tryFindByCodeAndDatabaseInstance(sampleCode,
-                            sampleOwner.tryGetDatabaseInstance());
+            return cachedResult;
         } else
         {
-            assert sampleOwner.isGroupLevel() : "Must be of space level.";
-            sample = sampleDAO.tryFindByCodeAndGroup(sampleCode, sampleOwner.tryGetGroup());
+            final SampleOwner sampleOwner = sampleOwnerFinder.figureSampleOwner(sampleIdentifier);
+            final String sampleCode = sampleIdentifier.getSampleCode();
+            final ISampleDAO sampleDAO = getSampleDAO();
+            final SamplePE result;
+            if (sampleOwner.isDatabaseInstanceLevel())
+            {
+                result =
+                        sampleDAO.tryFindByCodeAndDatabaseInstance(sampleCode,
+                                sampleOwner.tryGetDatabaseInstance());
+            } else
+            {
+                assert sampleOwner.isGroupLevel() : "Must be of space level.";
+                result = sampleDAO.tryFindByCodeAndGroup(sampleCode, sampleOwner.tryGetGroup());
+            }
+            if (result != null)
+            {
+                HibernateUtils.initialize(result.getExperiment());
+                sampleByIdentifierCache.put(sampleIdentifier, result);
+            }
+            return result;
         }
-        if (sample != null)
-        {
-            HibernateUtils.initialize(sample.getExperiment());
-        }
-        return sample;
     }
 
     /**
-- 
GitLab