minor
[cdmlib.git] / cdmlib-persistence / src / main / java / eu / etaxonomy / cdm / persistence / dao / hibernate / name / TaxonNameDaoHibernateImpl.java
index f48cea7f11e31f42992dc80c28aa05a43e1994d9..58d50fe578b61208e7ef8429b749c9bdff1eb52b 100644 (file)
 package eu.etaxonomy.cdm.persistence.dao.hibernate.name;\r
 \r
 import java.util.ArrayList;\r
-import java.util.HashMap;\r
 import java.util.List;\r
-import java.util.Map;\r
+import java.util.Set;\r
 import java.util.UUID;\r
 \r
 import org.apache.log4j.Logger;\r
-import org.apache.lucene.analysis.SimpleAnalyzer;\r
-import org.apache.lucene.queryParser.ParseException;\r
-import org.apache.lucene.queryParser.QueryParser;\r
 import org.hibernate.Criteria;\r
 import org.hibernate.Query;\r
+import org.hibernate.Session;\r
 import org.hibernate.criterion.Criterion;\r
 import org.hibernate.criterion.Order;\r
 import org.hibernate.criterion.Projections;\r
 import org.hibernate.criterion.Restrictions;\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.hibernate.search.SearchFactory;\r
+import org.springframework.beans.factory.annotation.Autowired;\r
 import org.springframework.beans.factory.annotation.Qualifier;\r
 import org.springframework.stereotype.Repository;\r
 \r
+import eu.etaxonomy.cdm.hibernate.HibernateProxyHelper;\r
+import eu.etaxonomy.cdm.model.common.CdmBase;\r
 import eu.etaxonomy.cdm.model.common.RelationshipBase;\r
 import eu.etaxonomy.cdm.model.common.UuidAndTitleCache;\r
 import eu.etaxonomy.cdm.model.name.BacterialName;\r
@@ -50,10 +47,12 @@ import eu.etaxonomy.cdm.model.name.TypeDesignationBase;
 import eu.etaxonomy.cdm.model.name.TypeDesignationStatusBase;\r
 import eu.etaxonomy.cdm.model.name.ViralName;\r
 import eu.etaxonomy.cdm.model.name.ZoologicalName;\r
+import eu.etaxonomy.cdm.model.taxon.Taxon;\r
+import eu.etaxonomy.cdm.model.taxon.TaxonBase;\r
 import eu.etaxonomy.cdm.model.view.AuditEvent;\r
-import eu.etaxonomy.cdm.persistence.dao.QueryParseException;\r
 import eu.etaxonomy.cdm.persistence.dao.hibernate.common.IdentifiableDaoBase;\r
 import eu.etaxonomy.cdm.persistence.dao.name.ITaxonNameDao;\r
+import eu.etaxonomy.cdm.persistence.dao.taxon.ITaxonDao;\r
 import eu.etaxonomy.cdm.persistence.query.MatchMode;\r
 import eu.etaxonomy.cdm.persistence.query.OrderHint;\r
 \r
@@ -69,6 +68,9 @@ extends IdentifiableDaoBase<TaxonNameBase> implements ITaxonNameDao {
        @SuppressWarnings("unused")\r
        private static final Logger logger = Logger.getLogger(TaxonNameDaoHibernateImpl.class);\r
 \r
+       @Autowired\r
+       private ITaxonDao taxonDao;\r
+\r
        public TaxonNameDaoHibernateImpl() {\r
                super(TaxonNameBase.class); \r
                indexedClasses = new Class[6];\r
@@ -79,11 +81,8 @@ extends IdentifiableDaoBase<TaxonNameBase> implements ITaxonNameDao {
                indexedClasses[4] = ViralName.class;\r
                indexedClasses[5] = ZoologicalName.class;\r
        }\r
-       \r
-       private String defaultField = "titleCache";\r
-       private Class<? extends TaxonNameBase> indexedClasses[]; \r
 \r
-       public int countHybridNames(BotanicalName name, HybridRelationshipType type) {\r
+       public int countHybridNames(NonViralName name, HybridRelationshipType type) {\r
                AuditEvent auditEvent = getAuditEventFromContext();\r
                if(auditEvent.equals(AuditEvent.CURRENT_VIEW)) {\r
                        Query query = null;\r
@@ -240,31 +239,19 @@ extends IdentifiableDaoBase<TaxonNameBase> implements ITaxonNameDao {
        }\r
 \r
        public int countTypeDesignations(TaxonNameBase name, SpecimenTypeDesignationStatus status) {\r
-               AuditEvent auditEvent = getAuditEventFromContext();\r
-               if(auditEvent.equals(AuditEvent.CURRENT_VIEW)) {\r
-                       Query query = null;\r
-                       if(status == null) {\r
-                               query = getSession().createQuery("select count(designation) from TypeDesignationBase designation join designation.typifiedNames name where name = :name");\r
-                       } else {\r
-                               query = getSession().createQuery("select count(designation) from TypeDesignationBase designation join designation.typifiedNames name where name = :name and designation.typeStatus = :status");\r
-                               query.setParameter("status", status);\r
-                       }\r
-                       query.setParameter("name",name);\r
-                       return ((Long)query.uniqueResult()).intValue();\r
+               checkNotInPriorView("countTypeDesignations(TaxonNameBase name, SpecimenTypeDesignationStatus status)");\r
+               Query query = null;\r
+               if(status == null) {\r
+                       query = getSession().createQuery("select count(designation) from TypeDesignationBase designation join designation.typifiedNames name where name = :name");\r
                } else {\r
-                       AuditQuery query = getAuditReader().createQuery().forEntitiesAtRevision(TypeDesignationBase.class,auditEvent.getRevisionNumber());\r
-                       query.add(AuditEntity.relatedId("typifiedNames").eq(name.getId()));\r
-                       query.addProjection(AuditEntity.id().count("id"));\r
-\r
-                       if(type != null) {\r
-                               query.add(AuditEntity.relatedId("typeStatus").eq(status.getId()));\r
-                       }\r
-\r
-                       return ((Long)query.getSingleResult()).intValue();\r
+                       query = getSession().createQuery("select count(designation) from TypeDesignationBase designation join designation.typifiedNames name where name = :name and designation.typeStatus = :status");\r
+                       query.setParameter("status", status);\r
                }\r
+               query.setParameter("name",name);\r
+               return ((Long)query.uniqueResult()).intValue();\r
        }\r
 \r
-       public List<HybridRelationship> getHybridNames(BotanicalName name, HybridRelationshipType type, Integer pageSize, Integer pageNumber, List<OrderHint> orderHints, List<String> propertyPaths) {\r
+       public List<HybridRelationship> getHybridNames(NonViralName name, HybridRelationshipType type, Integer pageSize, Integer pageNumber, List<OrderHint> orderHints, List<String> propertyPaths) {\r
                AuditEvent auditEvent = getAuditEventFromContext();\r
                if(auditEvent.equals(AuditEvent.CURRENT_VIEW)) {\r
                        Criteria criteria = getSession().createCriteria(HybridRelationship.class);\r
@@ -317,6 +304,7 @@ extends IdentifiableDaoBase<TaxonNameBase> implements ITaxonNameDao {
                AuditEvent auditEvent = getAuditEventFromContext();\r
                if(auditEvent.equals(AuditEvent.CURRENT_VIEW)) {\r
                        Criteria criteria = getSession().createCriteria(NameRelationship.class);\r
+//                     if (name != null)\r
                        criteria.add(Restrictions.eq(direction.toString(), name));\r
                        if(type != null) {\r
                                criteria.add(Restrictions.eq("type", type));\r
@@ -357,54 +345,46 @@ extends IdentifiableDaoBase<TaxonNameBase> implements ITaxonNameDao {
                        return results;\r
                }\r
        }\r
-\r
-       public List<TypeDesignationBase> getTypeDesignations(TaxonNameBase name, \r
-                       TypeDesignationStatusBase status, Integer pageSize, Integer pageNumber) {\r
-               return getTypeDesignations(name, status, pageSize, pageNumber, null);\r
+       \r
+       public List<TypeDesignationBase> getTypeDesignations(TaxonNameBase name, TypeDesignationStatusBase status, Integer pageSize, Integer pageNumber,        List<String> propertyPaths){\r
+               return getTypeDesignations(name, null, status, pageSize, pageNumber, propertyPaths);\r
        }\r
        \r
-       public List<TypeDesignationBase> getTypeDesignations(TaxonNameBase name,\r
+       public <T extends TypeDesignationBase> List<T> getTypeDesignations(TaxonNameBase name, \r
+                               Class<T> type,\r
                                TypeDesignationStatusBase status, Integer pageSize, Integer pageNumber,\r
                                List<String> propertyPaths){\r
-               AuditEvent auditEvent = getAuditEventFromContext();\r
-               if(auditEvent.equals(AuditEvent.CURRENT_VIEW)) {\r
-                       Query query = null;\r
-                       if(status == null) {\r
-                               query = getSession().createQuery("select designation from TypeDesignationBase designation join designation.typifiedNames name where name = :name");\r
-                       } else {\r
-                               query = getSession().createQuery("select designation from TypeDesignationBase designation join designation.typifiedNames name where name = :name and designation.typeStatus = :status");\r
-                               query.setParameter("status", status);\r
-                       }\r
-                       query.setParameter("name",name);\r
+               checkNotInPriorView("getTypeDesignations(TaxonNameBase name,TypeDesignationStatusBase status, Integer pageSize, Integer pageNumber,     List<String> propertyPaths)");\r
+               Query query = null;\r
+               String queryString = "select designation from TypeDesignationBase designation join designation.typifiedNames name where name = :name";\r
 \r
-                       if(pageSize != null) {\r
-                               query.setMaxResults(pageSize);\r
-                               if(pageNumber != null) {\r
-                                       query.setFirstResult(pageNumber * pageSize);\r
-                               } else {\r
-                                       query.setFirstResult(0);\r
-                               }\r
-                       }\r
-                       return defaultBeanInitializer.initializeAll((List<TypeDesignationBase>)query.list(), propertyPaths);\r
-               } else {\r
-                       AuditQuery query = getAuditReader().createQuery().forEntitiesAtRevision(TypeDesignationBase.class,auditEvent.getRevisionNumber());\r
-                       query.add(AuditEntity.relatedId("typifiedNames").eq(name.getId()));\r
+               if(status != null) {\r
+                       queryString +=  " and designation.typeStatus = :status";\r
+               }\r
+               if(type != null){\r
+                       queryString +=  " and designation.class = :type";\r
+               }\r
 \r
-                       if(type != null) {\r
-                               query.add(AuditEntity.relatedId("typeStatus").eq(status.getId()));\r
-                       }\r
-                       \r
-                       if(pageSize != null) {\r
-                               query.setMaxResults(pageSize);\r
-                               if(pageNumber != null) {\r
-                                       query.setFirstResult(pageNumber * pageSize);\r
-                               } else {\r
-                                       query.setFirstResult(0);\r
-                               }\r
-                       }\r
+               query = getSession().createQuery(queryString);\r
+               \r
+               if(status != null) {            \r
+                       query.setParameter("status", status);\r
+               }\r
+               if(type != null){\r
+                       query.setParameter("type", type.getSimpleName());\r
+               }\r
+               \r
+               query.setParameter("name",name);\r
 \r
-                       return (List<TypeDesignationBase>)query.getResultList();\r
+               if(pageSize != null) {\r
+                       query.setMaxResults(pageSize);\r
+                       if(pageNumber != null) {\r
+                               query.setFirstResult(pageNumber * pageSize);\r
+                       } else {\r
+                               query.setFirstResult(0);\r
+                       }\r
                }\r
+               return defaultBeanInitializer.initializeAll((List<T>)query.list(), propertyPaths);\r
        }\r
 \r
        \r
@@ -580,98 +560,6 @@ extends IdentifiableDaoBase<TaxonNameBase> implements ITaxonNameDao {
                \r
        }\r
 \r
-\r
-       public int count(Class<? extends TaxonNameBase> clazz, String queryString) {\r
-               checkNotInPriorView("TaxonNameDaoHibernateImpl.count(String queryString, Boolean accepted)");\r
-        QueryParser queryParser = new QueryParser(defaultField, new SimpleAnalyzer());\r
-               \r
-               try {\r
-                       org.apache.lucene.search.Query query = queryParser.parse(queryString);\r
-                       \r
-                       FullTextSession fullTextSession = Search.getFullTextSession(this.getSession());\r
-                       org.hibernate.search.FullTextQuery fullTextQuery = null;\r
-                       \r
-                       if(clazz == null) {\r
-                               fullTextQuery = fullTextSession.createFullTextQuery(query, type);\r
-                       } else {\r
-                               fullTextQuery = fullTextSession.createFullTextQuery(query, clazz);\r
-                       }\r
-                       \r
-                   Integer  result = fullTextQuery.getResultSize();\r
-                   return result;\r
-\r
-               } catch (ParseException e) {\r
-                       throw new QueryParseException(e, queryString);\r
-               }\r
-       }\r
-\r
-       public void optimizeIndex() {\r
-               FullTextSession fullTextSession = Search.getFullTextSession(getSession());\r
-               SearchFactory searchFactory = fullTextSession.getSearchFactory();\r
-               for(Class clazz : indexedClasses) {\r
-               searchFactory.optimize(clazz); // optimize the indices ()\r
-               }\r
-           fullTextSession.flushToIndexes();\r
-       }\r
-\r
-       public void purgeIndex() {\r
-               FullTextSession fullTextSession = Search.getFullTextSession(getSession());\r
-               for(Class clazz : indexedClasses) {\r
-                   fullTextSession.purgeAll(clazz); // remove all taxon base from indexes\r
-               }\r
-               fullTextSession.flushToIndexes();\r
-       }\r
-\r
-       public void rebuildIndex() {\r
-        FullTextSession fullTextSession = Search.getFullTextSession(getSession());\r
-               \r
-               for(TaxonNameBase name : list(null,null)) { // re-index all taxon base\r
-                       fullTextSession.index(name);\r
-               }\r
-               fullTextSession.flushToIndexes();\r
-       }\r
-\r
-       public List<TaxonNameBase> search(Class<? extends TaxonNameBase> clazz, String queryString, Integer pageSize, Integer pageNumber, List<OrderHint> orderHints, List<String> propertyPaths) {\r
-               checkNotInPriorView("TaxonNameDaoHibernateImpl.searchTaxa(String queryString, Boolean accepted, Integer pageSize, Integer pageNumber)");\r
-               QueryParser queryParser = new QueryParser(defaultField, new SimpleAnalyzer());\r
-               List<TaxonNameBase> results = new ArrayList<TaxonNameBase>();\r
-                \r
-               try {\r
-                       org.apache.lucene.search.Query query = queryParser.parse(queryString);\r
-                       \r
-                       FullTextSession fullTextSession = Search.getFullTextSession(getSession());\r
-                       org.hibernate.search.FullTextQuery fullTextQuery = null;\r
-                       \r
-                       if(clazz == null) {\r
-                               fullTextQuery = fullTextSession.createFullTextQuery(query, TaxonNameBase.class);\r
-                       } else {\r
-                               fullTextQuery = fullTextSession.createFullTextQuery(query, clazz);\r
-                       }\r
-                       \r
-                       addOrder(fullTextQuery,orderHints);\r
-                       \r
-                   if(pageSize != null) {\r
-                       fullTextQuery.setMaxResults(pageSize);\r
-                           if(pageNumber != null) {\r
-                               fullTextQuery.setFirstResult(pageNumber * pageSize);\r
-                           } else {\r
-                               fullTextQuery.setFirstResult(0);\r
-                           }\r
-                       }\r
-                   \r
-                   List<TaxonNameBase> result = (List<TaxonNameBase>)fullTextQuery.list();\r
-                   defaultBeanInitializer.initializeAll(result, propertyPaths);\r
-                   return result;\r
-\r
-               } catch (ParseException e) {\r
-                       throw new QueryParseException(e, queryString);\r
-               }\r
-       }\r
-\r
-       public String suggestQuery(String string) {\r
-               throw new UnsupportedOperationException("suggestQuery is not supported for TaxonNameBase");\r
-       }\r
-\r
        /* (non-Javadoc)\r
         * @see eu.etaxonomy.cdm.persistence.dao.name.ITaxonNameDao#getUuidAndTitleCacheOfNames()\r
         */\r
@@ -706,4 +594,52 @@ extends IdentifiableDaoBase<TaxonNameBase> implements ITaxonNameDao {
        public List<TaxonNameBase> findByName(Class<? extends TaxonNameBase> clazz,     String queryString, MatchMode matchmode, List<Criterion> criteria,Integer pageSize, Integer pageNumber, List<OrderHint> orderHints,     List<String> propertyPaths) {\r
                return super.findByParam(clazz, "nameCache", queryString, matchmode, criteria, pageSize, pageNumber, orderHints, propertyPaths);\r
        }\r
+       \r
+       public UUID delete (TaxonNameBase persistentObject){\r
+               Set<TaxonBase> taxonBases = persistentObject.getTaxonBases();\r
+               super.delete(persistentObject);\r
+                               \r
+               for (TaxonBase taxonBase: taxonBases){\r
+                       taxonDao.delete(taxonBase);\r
+               }\r
+               return persistentObject.getUuid();\r
+       }\r
+       \r
+       public List<ZoologicalName> getAllZoologicalNames(Integer limit, Integer start){\r
+               List <TaxonNameBase> names = new ArrayList<TaxonNameBase>();\r
+               List <ZoologicalName> zooNames = new ArrayList<ZoologicalName>();\r
+               names = super.list(ZoologicalName.class, limit, start);\r
+               for (TaxonNameBase name: names){\r
+                       zooNames.add((ZoologicalName)name);\r
+               }\r
+               return zooNames;\r
+       }\r
+       \r
+       public ZoologicalName findZoologicalNameByUUID(UUID uuid){\r
+               Criteria criteria = getSession().createCriteria(type);\r
+               if (uuid != null) {\r
+                       criteria.add(Restrictions.eq("uuid", uuid));\r
+               } else {\r
+                       logger.error("UUID is NULL");\r
+                       return null;\r
+               }\r
+               \r
+               List<? extends TaxonNameBase<?,?>> results = criteria.list();\r
+               if (results.size() == 1) {\r
+                       defaultBeanInitializer.initializeAll(results, null);\r
+                       TaxonNameBase<?, ?> taxonName = results.iterator().next();\r
+                       if (taxonName.isInstanceOf(ZoologicalName.class)) {\r
+                               ZoologicalName zoologicalName = CdmBase.deproxy(taxonName, ZoologicalName.class);\r
+                               return zoologicalName;\r
+                       } else {\r
+                               logger.warn("This UUID (" + uuid + ") does not belong to a ZoologicalName. It belongs to: " + taxonName.getUuid() + " (" + taxonName.getTitleCache() + ")");\r
+                       }\r
+               } else if (results.size() > 1) {\r
+                       logger.warn("Multiple results for UUID: " + uuid);\r
+               } else if (results.size() == 0) {\r
+                       logger.warn("No results for UUID: " + uuid);\r
+               }\r
+               return null;\r
+       }\r
+\r
 }
\ No newline at end of file