Refactored free text search to re-use the same code for all identifiable entities...
[cdmlib.git] / cdmlib-persistence / src / main / java / eu / etaxonomy / cdm / persistence / dao / hibernate / occurrence / OccurrenceDaoHibernateImpl.java
index e0e4ece4e917f736ab3f4e73676873bffcb282e8..aa48b165d680aec06a6de2b3d34b9f4218e19fff 100644 (file)
@@ -7,16 +7,28 @@
 package eu.etaxonomy.cdm.persistence.dao.hibernate.occurrence;\r
 \r
 import java.util.List;\r
+import java.util.Set;\r
 \r
 import org.apache.log4j.Logger;\r
+import org.hibernate.Hibernate;\r
 import org.hibernate.Query;\r
 import org.hibernate.envers.query.AuditEntity;\r
 import org.hibernate.envers.query.AuditQuery;\r
+import org.hibernate.search.FullTextSession;\r
+import org.hibernate.search.Search;\r
 import org.springframework.stereotype.Repository;\r
 \r
 import eu.etaxonomy.cdm.model.media.Media;\r
+import eu.etaxonomy.cdm.model.molecular.DnaSample;\r
 import eu.etaxonomy.cdm.model.occurrence.DerivationEvent;\r
+import eu.etaxonomy.cdm.model.occurrence.DerivedUnit;\r
+import eu.etaxonomy.cdm.model.occurrence.DerivedUnitBase;\r
 import eu.etaxonomy.cdm.model.occurrence.DeterminationEvent;\r
+import eu.etaxonomy.cdm.model.occurrence.FieldObservation;\r
+import eu.etaxonomy.cdm.model.occurrence.Fossil;\r
+import eu.etaxonomy.cdm.model.occurrence.LivingBeing;\r
+import eu.etaxonomy.cdm.model.occurrence.Observation;\r
+import eu.etaxonomy.cdm.model.occurrence.Specimen;\r
 import eu.etaxonomy.cdm.model.occurrence.SpecimenOrObservationBase;\r
 import eu.etaxonomy.cdm.model.view.AuditEvent;\r
 import eu.etaxonomy.cdm.persistence.dao.hibernate.common.IdentifiableDaoBase;\r
@@ -28,14 +40,21 @@ import eu.etaxonomy.cdm.persistence.dao.occurrence.IOccurrenceDao;
  * @created 01.09.2008\r
  */\r
 @Repository\r
-public class OccurrenceDaoHibernateImpl extends IdentifiableDaoBase<SpecimenOrObservationBase> implements\r
-               IOccurrenceDao {\r
+public class OccurrenceDaoHibernateImpl extends IdentifiableDaoBase<SpecimenOrObservationBase> implements IOccurrenceDao {\r
        \r
        @SuppressWarnings("unused")\r
        private static final Logger logger = Logger.getLogger(TaxonDaoHibernateImpl.class);\r
 \r
        public OccurrenceDaoHibernateImpl() {\r
                super(SpecimenOrObservationBase.class);\r
+               indexedClasses = new Class[7];\r
+               indexedClasses[0] = FieldObservation.class;\r
+               indexedClasses[1] = DerivedUnit.class;\r
+               indexedClasses[2] = LivingBeing.class;\r
+               indexedClasses[3] = Observation.class;\r
+               indexedClasses[4] = Specimen.class;\r
+               indexedClasses[5] = DnaSample.class;\r
+               indexedClasses[6] = Fossil.class;\r
        }\r
 \r
        public int countDerivationEvents(SpecimenOrObservationBase occurence) {\r
@@ -50,7 +69,7 @@ public class OccurrenceDaoHibernateImpl extends IdentifiableDaoBase<SpecimenOrOb
                AuditEvent auditEvent = getAuditEventFromContext();\r
                if(auditEvent.equals(AuditEvent.CURRENT_VIEW)) {\r
                    Query query = getSession().createQuery("select count(determination) from DeterminationEvent determination where determination.identifiedUnit = :occurence");\r
-               \r
+                   query.setParameter("occurence", occurence);\r
                    return ((Long)query.uniqueResult()).intValue();\r
                } else {\r
                        AuditQuery query = getAuditReader().createQuery().forEntitiesAtRevision(DeterminationEvent.class,auditEvent.getRevisionNumber());\r
@@ -69,7 +88,7 @@ public class OccurrenceDaoHibernateImpl extends IdentifiableDaoBase<SpecimenOrOb
                return ((Long)query.uniqueResult()).intValue();\r
        }\r
 \r
-       public List<DerivationEvent> getDerivationEvents(SpecimenOrObservationBase occurence, Integer pageSize,Integer pageNumber) {\r
+       public List<DerivationEvent> getDerivationEvents(SpecimenOrObservationBase occurence, Integer pageSize,Integer pageNumber, List<String> propertyPaths) {\r
                checkNotInPriorView("OccurrenceDaoHibernateImpl.getDerivationEvents(SpecimenOrObservationBase occurence, Integer pageSize,Integer pageNumber)");\r
                Query query = getSession().createQuery("select distinct derivationEvent from DerivationEvent derivationEvent join derivationEvent.originals occurence where occurence = :occurence");\r
                query.setParameter("occurence", occurence);\r
@@ -83,10 +102,12 @@ public class OccurrenceDaoHibernateImpl extends IdentifiableDaoBase<SpecimenOrOb
                    }\r
                }\r
                \r
-               return (List<DerivationEvent>)query.list();\r
+               List<DerivationEvent> result = (List<DerivationEvent>)query.list();\r
+               defaultBeanInitializer.initializeAll(result, propertyPaths);\r
+               return result;\r
        }\r
 \r
-       public List<DeterminationEvent> getDeterminations(SpecimenOrObservationBase occurence, Integer pageSize, Integer pageNumber) {\r
+       public List<DeterminationEvent> getDeterminations(SpecimenOrObservationBase occurence, Integer pageSize, Integer pageNumber, List<String> propertyPaths) {\r
                AuditEvent auditEvent = getAuditEventFromContext();\r
                if(auditEvent.equals(AuditEvent.CURRENT_VIEW)) {\r
                        Query query = getSession().createQuery("select determination from DeterminationEvent determination where determination.identifiedUnit = :occurence");\r
@@ -100,8 +121,9 @@ public class OccurrenceDaoHibernateImpl extends IdentifiableDaoBase<SpecimenOrOb
                                        query.setFirstResult(0);\r
                                }\r
                        }\r
-\r
-                       return (List<DeterminationEvent>)query.list();\r
+                       List<DeterminationEvent> result = (List<DeterminationEvent>)query.list();\r
+            defaultBeanInitializer.initializeAll(result, propertyPaths);                       \r
+                       return result;\r
                } else {\r
                        AuditQuery query = getAuditReader().createQuery().forEntitiesAtRevision(DeterminationEvent.class,auditEvent.getRevisionNumber());\r
                        query.add(AuditEntity.relatedId("identifiedUnit").eq(occurence.getId()));\r
@@ -113,13 +135,14 @@ public class OccurrenceDaoHibernateImpl extends IdentifiableDaoBase<SpecimenOrOb
                                        query.setFirstResult(0);\r
                                }\r
                        }\r
-\r
-                       return (List<DeterminationEvent>)query.getResultList();\r
+                       List<DeterminationEvent> result = (List<DeterminationEvent>)query.getResultList();\r
+            defaultBeanInitializer.initializeAll(result, propertyPaths);                       \r
+                       return result;\r
                }\r
        }\r
 \r
-       public List<Media> getMedia(SpecimenOrObservationBase occurence, Integer pageSize, Integer pageNumber) {\r
-               checkNotInPriorView("OccurrenceDaoHibernateImpl.getMedia(SpecimenOrObservationBase occurence, Integer pageSize, Integer pageNumber)");\r
+       public List<Media> getMedia(SpecimenOrObservationBase occurence, Integer pageSize, Integer pageNumber, List<String> propertyPaths) {\r
+               checkNotInPriorView("OccurrenceDaoHibernateImpl.getMedia(SpecimenOrObservationBase occurence, Integer pageSize, Integer pageNumber, List<String> propertyPaths)");\r
                Query query = getSession().createQuery("select media from SpecimenOrObservationBase occurence join occurence.media media where occurence = :occurence");\r
                query.setParameter("occurence", occurence);\r
                \r
@@ -132,6 +155,41 @@ public class OccurrenceDaoHibernateImpl extends IdentifiableDaoBase<SpecimenOrOb
                    }\r
                }\r
                \r
-               return (List<Media>)query.list();\r
-       }       \r
-}\r
+               List<Media> results = (List<Media>)query.list();\r
+               defaultBeanInitializer.initializeAll(results, propertyPaths);           \r
+               return results;\r
+       }\r
+\r
+       @Override\r
+       public void rebuildIndex() {\r
+        FullTextSession fullTextSession = Search.getFullTextSession(getSession());\r
+               \r
+               for(SpecimenOrObservationBase occurrence : list(null,null)) { // re-index all taxon base\r
+\r
+                       for(DeterminationEvent determination : (Set<DeterminationEvent>)occurrence.getDeterminations()) {\r
+                           Hibernate.initialize(determination.getActor());\r
+                           Hibernate.initialize(determination.getTaxon());\r
+                       }\r
+                       Hibernate.initialize(occurrence.getDefinition());\r
+                       if(occurrence instanceof DerivedUnitBase) {\r
+                               DerivedUnitBase derivedUnit = (DerivedUnitBase) occurrence;\r
+                               Hibernate.initialize(derivedUnit.getCollection());\r
+                               if(derivedUnit.getCollection() != null) {\r
+                                       Hibernate.initialize(derivedUnit.getCollection().getSuperCollection());\r
+                                       Hibernate.initialize(derivedUnit.getCollection().getInstitute());\r
+                               }\r
+                               Hibernate.initialize(derivedUnit.getStoredUnder());\r
+                               SpecimenOrObservationBase original = derivedUnit.getOriginalUnit();\r
+                               if(original != null && original.isInstanceOf(FieldObservation.class)) {\r
+                                       FieldObservation fieldObservation = original.deproxy(original, FieldObservation.class);\r
+                                       Hibernate.initialize(fieldObservation.getGatheringEvent());\r
+                                       if(fieldObservation.getGatheringEvent() != null) {\r
+                                               Hibernate.initialize(fieldObservation.getGatheringEvent().getActor());\r
+                                       }\r
+                               }\r
+                       }\r
+                       fullTextSession.index(occurrence);\r
+               }\r
+               fullTextSession.flushToIndexes();\r
+       }\r
+}
\ No newline at end of file