From d50c3d3528d54ef38d04f765b67eadc5cdd7e86c Mon Sep 17 00:00:00 2001
From: felmer <felmer>
Date: Tue, 10 May 2016 09:08:48 +0000
Subject: [PATCH] SSDM-3597 : Lucene reindexing triggered when sample type
 changed

SVN: 36520
---
 .../generic/server/dataaccess/ISampleDAO.java |  3 +++
 .../server/dataaccess/db/DAOFactory.java      |  2 +-
 .../server/dataaccess/db/EntityTypeDAO.java   | 22 +++++++++++++++--
 .../server/dataaccess/db/SampleDAO.java       | 24 +++++++++++++++++++
 4 files changed, 48 insertions(+), 3 deletions(-)

diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/dataaccess/ISampleDAO.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/dataaccess/ISampleDAO.java
index bb97241432d..6059bd40128 100644
--- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/dataaccess/ISampleDAO.java
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/dataaccess/ISampleDAO.java
@@ -119,6 +119,9 @@ public interface ISampleDAO extends IGenericDAO<SamplePE>
     /** Returns ids of samples connected with experiments specified by given ids. */
     List<TechId> listSampleIdsByExperimentIds(Collection<TechId> experimentIds);
 
+    /** Returns ids of sample of specified types specified by given ids. */
+    List<TechId> listSampleIdsBySampleTypeIds(Collection<TechId> sampleTypeIds);
+    
     /**
      * Lists samples (with minimal additional information) belonging to the given <code>space</code> and having a property with the specified value.
      */
diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/dataaccess/db/DAOFactory.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/dataaccess/db/DAOFactory.java
index 2988dc0cc23..c474d33dc0a 100644
--- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/dataaccess/db/DAOFactory.java
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/dataaccess/db/DAOFactory.java
@@ -174,7 +174,7 @@ public final class DAOFactory extends AuthorizationDAOFactory implements IDAOFac
         for (final EntityKind entityKind : entityKinds)
         {
             final EntityTypeDAO dao =
-                    new EntityTypeDAO(entityKind, sessionFactory, historyCreator);
+                    new EntityTypeDAO(entityKind, sessionFactory, historyCreator, this);
             entityTypeDAOs.put(entityKind, dao);
             entityPropertyTypeDAOs.put(entityKind, new EntityPropertyTypeDAO(entityKind,
                     getPersistencyResources()));
diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/dataaccess/db/EntityTypeDAO.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/dataaccess/db/EntityTypeDAO.java
index d3195a7309b..434c9956f45 100644
--- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/dataaccess/db/EntityTypeDAO.java
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/dataaccess/db/EntityTypeDAO.java
@@ -16,6 +16,7 @@
 
 package ch.systemsx.cisd.openbis.generic.server.dataaccess.db;
 
+import java.util.Arrays;
 import java.util.List;
 
 import org.apache.log4j.Logger;
@@ -28,10 +29,15 @@ import org.springframework.orm.hibernate4.HibernateTemplate;
 
 import ch.systemsx.cisd.common.logging.LogCategory;
 import ch.systemsx.cisd.common.logging.LogFactory;
+import ch.systemsx.cisd.openbis.generic.server.dataaccess.IDAOFactory;
 import ch.systemsx.cisd.openbis.generic.server.dataaccess.IEntityTypeDAO;
+import ch.systemsx.cisd.openbis.generic.server.dataaccess.ISampleDAO;
 import ch.systemsx.cisd.openbis.generic.server.dataaccess.db.deletion.EntityHistoryCreator;
 import ch.systemsx.cisd.openbis.generic.shared.basic.CodeConverter;
+import ch.systemsx.cisd.openbis.generic.shared.basic.TechId;
 import ch.systemsx.cisd.openbis.generic.shared.dto.EntityTypePE;
+import ch.systemsx.cisd.openbis.generic.shared.dto.SamplePE;
+import ch.systemsx.cisd.openbis.generic.shared.dto.SampleTypePE;
 import ch.systemsx.cisd.openbis.generic.shared.dto.properties.EntityKind;
 
 /**
@@ -45,11 +51,14 @@ final class EntityTypeDAO extends AbstractTypeDAO<EntityTypePE> implements IEnti
             LogFactory.getLogger(LogCategory.OPERATION, EntityTypeDAO.class);
 
     private final EntityKind entityKind;
-
-    EntityTypeDAO(final EntityKind entityKind, final SessionFactory sessionFactory, EntityHistoryCreator historyCreator)
+    private final IDAOFactory daoFactory;
+    
+    EntityTypeDAO(final EntityKind entityKind, final SessionFactory sessionFactory, 
+            EntityHistoryCreator historyCreator, IDAOFactory daoFactory)
     {
         super(sessionFactory, entityKind.getTypeClass(), historyCreator);
         this.entityKind = entityKind;
+        this.daoFactory = daoFactory;
     }
 
     //
@@ -96,6 +105,15 @@ final class EntityTypeDAO extends AbstractTypeDAO<EntityTypePE> implements IEnti
         {
             operationLog.info(String.format("ADD: entity type '%s'.", entityType));
         }
+        
+        if (entityType instanceof SampleTypePE)
+        {
+            ISampleDAO sampleDAO = daoFactory.getSampleDAO();
+            List<TechId> sampleIds = sampleDAO.listSampleIdsBySampleTypeIds(Arrays.asList(new TechId(entityType.getId())));
+            scheduleDynamicPropertiesEvaluationForIds(
+                    daoFactory.getPersistencyResources().getDynamicPropertyEvaluationScheduler(),
+                    SamplePE.class, TechId.asLongs(sampleIds));
+        }
     }
 
     @Override
diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/dataaccess/db/SampleDAO.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/dataaccess/db/SampleDAO.java
index 172437d7cc1..79ef99fd721 100644
--- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/dataaccess/db/SampleDAO.java
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/dataaccess/db/SampleDAO.java
@@ -740,6 +740,30 @@ public class SampleDAO extends AbstractGenericEntityWithPropertiesDAO<SamplePE>
         return transformNumbers2TechIdList(results);
     }
 
+    @Override
+    public List<TechId> listSampleIdsBySampleTypeIds(Collection<TechId> sampleTypeIds)
+    {
+        final List<Long> longIds = TechId.asLongs(sampleTypeIds);
+        final List<Long> results =
+                DAOUtils.listByCollection(getHibernateTemplate(), new IDetachedCriteriaFactory()
+                    {
+                        @Override
+                        public DetachedCriteria createCriteria()
+                        {
+                            final DetachedCriteria criteria =
+                                    DetachedCriteria.forClass(SamplePE.class);
+                            criteria.setProjection(Projections.id());
+                            return criteria;
+                        }
+                    }, "sampleType.id", longIds);
+        if (operationLog.isDebugEnabled())
+        {
+            operationLog.info(String.format("found %s samples for given sample types",
+                    results.size()));
+        }
+        return transformNumbers2TechIdList(results);
+    }
+    
     @Override
     public List<TechId> listSampleIdsByExperimentIds(final Collection<TechId> experiments)
     {
-- 
GitLab