added @Qualifier to help autowiring in cdmlib-remote
[cdmlib.git] / cdmlib-persistence / src / main / java / eu / etaxonomy / cdm / persistence / dao / hibernate / taxon / TaxonDaoHibernateImpl.java
index a8cfec75ede0a4b502b518ff0c29a8fcab06658a..db6d8c18657445d4e9ff1f580ee4f8b95fd2b1e4 100644 (file)
@@ -1,45 +1,43 @@
 /**\r
-* Copyright (C) 2007 EDIT\r
-* European Distributed Institute of Taxonomy \r
-* http://www.e-taxonomy.eu\r
-* \r
-* The contents of this file are subject to the Mozilla Public License Version 1.1\r
-* See LICENSE.TXT at the top of this package for the full license terms.\r
-*/\r
+ * Copyright (C) 2007 EDIT\r
+ * European Distributed Institute of Taxonomy \r
+ * http://www.e-taxonomy.eu\r
+ \r
+ * The contents of this file are subject to the Mozilla Public License Version 1.1\r
+ * See LICENSE.TXT at the top of this package for the full license terms.\r
+ */\r
 package eu.etaxonomy.cdm.persistence.dao.hibernate.taxon;\r
 \r
 import java.util.ArrayList;\r
-import java.util.Collection;\r
 import java.util.List;\r
 import java.util.Set;\r
 import java.util.UUID;\r
 \r
-import javax.persistence.FetchType;\r
-\r
 import org.apache.log4j.Logger;\r
 import org.hibernate.Criteria;\r
 import org.hibernate.FetchMode;\r
 import org.hibernate.LazyInitializationException;\r
 import org.hibernate.Query;\r
-import org.hibernate.Session;\r
 import org.hibernate.criterion.Criterion;\r
 import org.hibernate.criterion.Projections;\r
 import org.hibernate.criterion.Restrictions;\r
+import org.springframework.beans.factory.annotation.Qualifier;\r
 import org.springframework.dao.DataAccessException;\r
 import org.springframework.stereotype.Repository;\r
 \r
 import eu.etaxonomy.cdm.model.common.Annotation;\r
-import eu.etaxonomy.cdm.model.common.CdmBase;\r
-import eu.etaxonomy.cdm.model.common.DefinedTermBase;\r
 import eu.etaxonomy.cdm.model.common.Marker;\r
 import eu.etaxonomy.cdm.model.common.OriginalSource;\r
 import eu.etaxonomy.cdm.model.common.RelationshipBase;\r
+import eu.etaxonomy.cdm.model.name.Rank;\r
 import eu.etaxonomy.cdm.model.reference.ReferenceBase;\r
 import eu.etaxonomy.cdm.model.taxon.Synonym;\r
 import eu.etaxonomy.cdm.model.taxon.SynonymRelationship;\r
+import eu.etaxonomy.cdm.model.taxon.SynonymRelationshipType;\r
 import eu.etaxonomy.cdm.model.taxon.Taxon;\r
 import eu.etaxonomy.cdm.model.taxon.TaxonBase;\r
 import eu.etaxonomy.cdm.model.taxon.TaxonRelationship;\r
+import eu.etaxonomy.cdm.model.taxon.TaxonRelationshipType;\r
 import eu.etaxonomy.cdm.persistence.dao.common.ITitledDao;\r
 import eu.etaxonomy.cdm.persistence.dao.hibernate.common.IdentifiableDaoBase;\r
 import eu.etaxonomy.cdm.persistence.dao.taxon.ITaxonDao;\r
@@ -49,9 +47,22 @@ import eu.etaxonomy.cdm.persistence.fetch.CdmFetch;
  * @author a.mueller\r
  *\r
  */\r
+/**\r
+ * @author a.mueller\r
+ * @created 24.11.2008\r
+ * @version 1.0\r
+ */\r
+/**\r
+ * @author a.mueller\r
+ * @created 24.11.2008\r
+ * @version 1.0\r
+ */\r
 @Repository\r
+@Qualifier("taxonDaoHibernateImpl")\r
 public class TaxonDaoHibernateImpl extends IdentifiableDaoBase<TaxonBase> implements ITaxonDao {\r
-       static Logger logger = Logger.getLogger(TaxonDaoHibernateImpl.class);\r
+       \r
+       @SuppressWarnings("unused")\r
+       private static final Logger logger = Logger.getLogger(TaxonDaoHibernateImpl.class);\r
 \r
        public TaxonDaoHibernateImpl() {\r
                super(TaxonBase.class);\r
@@ -61,49 +72,58 @@ public class TaxonDaoHibernateImpl extends IdentifiableDaoBase<TaxonBase> implem
         * @see eu.etaxonomy.cdm.persistence.dao.taxon.ITaxonDao#getRootTaxa(eu.etaxonomy.cdm.model.reference.ReferenceBase)\r
         */\r
        public List<Taxon> getRootTaxa(ReferenceBase sec) {\r
-               return getRootTaxa(sec, CdmFetch.FETCH_CHILDTAXA(), true);\r
+               return getRootTaxa(sec, CdmFetch.FETCH_CHILDTAXA(), true, false);\r
        }\r
+       \r
+\r
 \r
        /* (non-Javadoc)\r
-        * @see eu.etaxonomy.cdm.persistence.dao.taxon.ITaxonDao#getRootTaxa(eu.etaxonomy.cdm.model.reference.ReferenceBase, boolean)\r
+        * @see eu.etaxonomy.cdm.persistence.dao.taxon.ITaxonDao#getRootTaxa(eu.etaxonomy.cdm.model.reference.ReferenceBase, eu.etaxonomy.cdm.persistence.fetch.CdmFetch, java.lang.Boolean, java.lang.Boolean)\r
         */\r
-       public List<Taxon> getRootTaxa(ReferenceBase sec, CdmFetch cdmFetch, Boolean onlyWithChildren) {\r
+       public List<Taxon> getRootTaxa(ReferenceBase sec, CdmFetch cdmFetch, Boolean onlyWithChildren, Boolean withMisapplications) {\r
                if (onlyWithChildren == null){\r
                        onlyWithChildren = true;\r
                }\r
+               if (withMisapplications == null){\r
+                       withMisapplications = true;\r
+               }\r
                if (cdmFetch == null){\r
                        cdmFetch = CdmFetch.NO_FETCH();\r
                }\r
-               \r
-               \r
+\r
+\r
 //             String query = "from Taxon root ";\r
 //             query += " where root.taxonomicParentCache is NULL ";\r
 //             if (sec != null){\r
-//                     query += " AND root.sec.id = :sec "; \r
+//             query += " AND root.sec.id = :sec "; \r
 //             }               \r
 //             Query q = getSession().createQuery(query);\r
 //             if (sec != null){\r
-//                     q.setInteger("sec", sec.getId());\r
+//             q.setInteger("sec", sec.getId());\r
 //             }\r
-               \r
-               \r
+\r
+\r
                Criteria crit = getSession().createCriteria(Taxon.class);\r
                crit.add(Restrictions.isNull("taxonomicParentCache"));\r
                if (sec != null){\r
                        crit.add(Restrictions.eq("sec", sec) );\r
                }\r
-               \r
-               \r
+\r
+\r
                if (! cdmFetch.includes(CdmFetch.FETCH_CHILDTAXA())){\r
-                       logger.warn("no child taxa fetch qq");\r
+                       logger.warn("no child taxa fetch");\r
                        //TODO overwrite LAZY (SELECT) does not work (bug in hibernate?)\r
                        crit.setFetchMode("relationsToThisTaxon.fromTaxon", FetchMode.LAZY);\r
                }\r
-               \r
+\r
                List<Taxon> results = new ArrayList<Taxon>();\r
                for(Taxon taxon : (List<Taxon>) crit.list()){\r
+                       //childTaxa\r
+                       //TODO create restriction instead\r
                        if (onlyWithChildren == false || taxon.hasTaxonomicChildren()){\r
-                               results.add(taxon);\r
+                               if (withMisapplications == true || ! taxon.isMisappliedName()){\r
+                                       results.add(taxon);\r
+                               }\r
                        }\r
                }\r
                return results;\r
@@ -112,33 +132,41 @@ public class TaxonDaoHibernateImpl extends IdentifiableDaoBase<TaxonBase> implem
        public List<TaxonBase> getTaxaByName(String name, ReferenceBase sec) {\r
                Criteria crit = getSession().createCriteria(Taxon.class);\r
                if (sec != null){\r
+                       if(sec.getId() == 0){\r
+                               getSession().save(sec);\r
+                       }\r
                        crit.add(Restrictions.eq("sec", sec ) );\r
                }\r
-               crit.createCriteria("name").add(Restrictions.eq("titleCache", name));\r
+               crit.createCriteria("name").add(Restrictions.like("nameCache", name));\r
                List<TaxonBase> results = crit.list();\r
                return results;\r
        }\r
 \r
-       public List<TaxonBase> getAllTaxa(Integer pagesize, Integer page) {\r
+       public List<TaxonBase> getAllTaxonBases(Integer pagesize, Integer page) {\r
                Criteria crit = getSession().createCriteria(TaxonBase.class);\r
                List<TaxonBase> results = crit.list();\r
                // TODO add page & pagesize criteria\r
                return results;\r
        }\r
-       \r
+\r
        public List<Synonym> getAllSynonyms(Integer limit, Integer start) {\r
                Criteria crit = getSession().createCriteria(Synonym.class);\r
-               crit.createCriteria("dtype").add(Restrictions.eq("DTYPE", "Synonym"));\r
                List<Synonym> results = crit.list();\r
                return results;\r
        }\r
-       \r
+\r
+       public List<Taxon> getAllTaxa(Integer limit, Integer start) {\r
+               Criteria crit = getSession().createCriteria(Taxon.class);\r
+               List<Taxon> results = crit.list();\r
+               return results;\r
+       }\r
+\r
        public List<RelationshipBase> getAllRelationships(Integer limit, Integer start) {\r
                Criteria crit = getSession().createCriteria(RelationshipBase.class);\r
                List<RelationshipBase> results = crit.list();\r
                return results;\r
        }\r
-       \r
+\r
        @Override\r
        public UUID delete(TaxonBase taxonBase) throws DataAccessException{\r
                //getSession().update(taxonBase); doesn't work with lazy collections\r
@@ -194,17 +222,17 @@ public class TaxonDaoHibernateImpl extends IdentifiableDaoBase<TaxonBase> implem
                return super.delete(taxonBase);\r
        }\r
 \r
-       \r
+\r
        // TODO add generic return type !!\r
        public List findByName(String queryString, ITitledDao.MATCH_MODE matchMode, int page, int pagesize, boolean onlyAcccepted) {\r
-                       ArrayList<Criterion> criteria = new ArrayList<Criterion>();\r
-                       //TODO ... Restrictions.eq(propertyName, value)\r
-                       return super.findByTitle(queryString, matchMode, page, pagesize, criteria);\r
-               \r
+               ArrayList<Criterion> criteria = new ArrayList<Criterion>();\r
+               //TODO ... Restrictions.eq(propertyName, value)\r
+               return super.findByTitle(queryString, matchMode, page, pagesize, criteria);\r
+\r
        }\r
-       \r
+\r
        public int countMatchesByName(String queryString, ITitledDao.MATCH_MODE matchMode, boolean onlyAcccepted) {\r
-               \r
+\r
                Criteria crit = getSession().createCriteria(type);\r
                crit.add(Restrictions.ilike("persistentTitleCache", matchMode.queryStringFrom(queryString)));\r
                crit.setProjection(Projections.rowCount());\r
@@ -212,9 +240,9 @@ public class TaxonDaoHibernateImpl extends IdentifiableDaoBase<TaxonBase> implem
                return result;\r
        }\r
 \r
-       \r
+\r
        public int countMatchesByName(String queryString, ITitledDao.MATCH_MODE matchMode, boolean onlyAcccepted, List<Criterion> criteria) {\r
-               \r
+\r
                Criteria crit = getSession().createCriteria(type);\r
                crit.add(Restrictions.ilike("persistentTitleCache", matchMode.queryStringFrom(queryString)));\r
                if(criteria != null){\r
@@ -226,5 +254,182 @@ public class TaxonDaoHibernateImpl extends IdentifiableDaoBase<TaxonBase> implem
                int result = ((Integer)crit.list().get(0)).intValue();\r
                return result;\r
        }\r
+\r
+       public int countRelatedTaxa(Taxon taxon, TaxonRelationshipType type) {\r
+               Query query = null;\r
+               \r
+               if(type == null) {\r
+                       query = getSession().createQuery("select count(taxonRelationship) from TaxonRelationship taxonRelationship where taxonRelationship.relatedTo = :relatedTo");\r
+               } else {\r
+                       query = getSession().createQuery("select count(taxonRelationship) from TaxonRelationship taxonRelationship where taxonRelationship.relatedTo = :relatedTo and taxonRelationship.type = :type");\r
+                       query.setParameter("type",type);\r
+               }\r
+               \r
+               query.setParameter("relatedTo", taxon);\r
+               \r
+               return ((Long)query.uniqueResult()).intValue();\r
+       }\r
+\r
+       public int countSynonyms(Taxon taxon, SynonymRelationshipType type) {\r
+        Query query = null;\r
+               \r
+               if(type == null) {\r
+                       query = getSession().createQuery("select count(synonymRelationship) from SynonymRelationship synonymRelationship where synonymRelationship.relatedTo = :relatedTo");\r
+               } else {\r
+                       query = getSession().createQuery("select count(synonymRelationship) from SynonymRelationship synonymRelationship where synonymRelationship.relatedTo = :relatedTo and synonymRelationship.type = :type");\r
+                       query.setParameter("type",type);\r
+               }\r
+               \r
+               query.setParameter("relatedTo", taxon);\r
+               \r
+               return ((Long)query.uniqueResult()).intValue();\r
+       }\r
+\r
+       public int countTaxa(String queryString, Boolean accepted) {\r
+               throw new UnsupportedOperationException("Free text searching isn't implemented yet, sorry!");\r
+       }\r
+\r
+       public int countTaxaByName(Boolean accepted, String genusOrUninomial,   String infraGenericEpithet, String specificEpithet,     String infraSpecificEpithet, Rank rank) {\r
+        Criteria criteria = null;\r
+               \r
+               if(accepted == null) {\r
+                       criteria = getSession().createCriteria(TaxonBase.class);\r
+               } else {\r
+                       if(accepted) {\r
+                               criteria = getSession().createCriteria(Taxon.class);\r
+                       } else {\r
+                               criteria = getSession().createCriteria(Synonym.class);\r
+                       }\r
+               }\r
+               \r
+               criteria.setFetchMode( "name", FetchMode.JOIN );\r
+               criteria.createAlias("name", "name");\r
+               \r
+               if(genusOrUninomial != null) {\r
+                       criteria.add(Restrictions.eq("name.genusOrUninomial", genusOrUninomial));\r
+               }\r
+               \r
+               if(infraGenericEpithet != null) {\r
+                       criteria.add(Restrictions.eq("name.infraGenericEpithet", infraGenericEpithet));\r
+               }\r
+               \r
+               if(specificEpithet != null) {\r
+                       criteria.add(Restrictions.eq("name.specificEpithet", specificEpithet));\r
+               }\r
+               \r
+               if(infraSpecificEpithet != null) {\r
+                       criteria.add(Restrictions.eq("name.infraSpecificEpithet", infraSpecificEpithet));\r
+               }\r
+               \r
+               if(rank != null) {\r
+                       criteria.add(Restrictions.eq("name.rank", rank));\r
+               }\r
+               \r
+               criteria.setProjection(Projections.projectionList().add(Projections.rowCount()));\r
        \r
+               return (Integer)criteria.uniqueResult();\r
+       }\r
+\r
+       public List<TaxonBase> findTaxaByName(Boolean accepted, String genusOrUninomial, String infraGenericEpithet, String specificEpithet, String infraSpecificEpithet, Rank rank, Integer pageSize,  Integer pageNumber) {\r
+               Criteria criteria = null;\r
+               \r
+               if(accepted == null) {\r
+                       criteria = getSession().createCriteria(TaxonBase.class);\r
+               } else {\r
+                       if(accepted) {\r
+                               criteria = getSession().createCriteria(Taxon.class);\r
+                       } else {\r
+                               criteria = getSession().createCriteria(Synonym.class);\r
+                       }\r
+               }\r
+               \r
+               criteria.setFetchMode( "name", FetchMode.JOIN );\r
+               criteria.createAlias("name", "name");\r
+               \r
+               if(genusOrUninomial != null) {\r
+                       criteria.add(Restrictions.eq("name.genusOrUninomial", genusOrUninomial));\r
+               }\r
+               \r
+               if(infraGenericEpithet != null) {\r
+                       criteria.add(Restrictions.eq("name.infraGenericEpithet", infraGenericEpithet));\r
+               } else {\r
+                       criteria.add(Restrictions.isNull("name.infraGenericEpithet"));\r
+               }\r
+               \r
+               if(specificEpithet != null) {\r
+                       criteria.add(Restrictions.eq("name.specificEpithet", specificEpithet));\r
+               }\r
+               \r
+               if(infraSpecificEpithet != null) {\r
+                       criteria.add(Restrictions.eq("name.infraSpecificEpithet", infraSpecificEpithet));\r
+               }\r
+               \r
+               if(rank != null) {\r
+                       criteria.add(Restrictions.eq("name.rank", rank));\r
+               }\r
+               \r
+               if(pageSize != null) {\r
+               criteria.setMaxResults(pageSize);\r
+                   if(pageNumber != null) {\r
+                       criteria.setFirstResult(pageNumber * pageSize);\r
+                   } else {\r
+                       criteria.setFirstResult(0);\r
+                   }\r
+               }\r
+       \r
+               return (List<TaxonBase>)criteria.list();\r
+       }\r
+\r
+       public List<TaxonRelationship> getRelatedTaxa(Taxon taxon,      TaxonRelationshipType type, Integer pageSize, Integer pageNumber) {\r
+        Query query = null;\r
+               \r
+               if(type == null) {\r
+                       query = getSession().createQuery("select taxonRelationship from TaxonRelationship taxonRelationship join fetch taxonRelationship.relatedFrom where taxonRelationship.relatedTo = :relatedTo");\r
+               } else {\r
+                       query = getSession().createQuery("select taxonRelationship from TaxonRelationship taxonRelationship join fetch taxonRelationship.relatedFrom where taxonRelationship.relatedTo = :relatedTo and taxonRelationship.type = :type");\r
+                       query.setParameter("type",type);\r
+               }\r
+               \r
+               query.setParameter("relatedTo", taxon);\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
+               \r
+               return (List<TaxonRelationship>)query.list();\r
+       }\r
+\r
+       public List<SynonymRelationship> getSynonyms(Taxon taxon, SynonymRelationshipType type, Integer pageSize, Integer pageNumber) {\r
+        Query query = null;\r
+               \r
+               if(type == null) {\r
+                       query = getSession().createQuery("select synonymRelationship from SynonymRelationship synonymRelationship join fetch synonymRelationship.relatedFrom where synonymRelationship.relatedTo = :relatedTo");\r
+               } else {\r
+                       query = getSession().createQuery("select synonymRelationship from SynonymRelationship synonymRelationship join fetch synonymRelationship.relatedFrom where synonymRelationship.relatedTo = :relatedTo and synonymRelationship.type = :type");\r
+                       query.setParameter("type",type);\r
+               }\r
+               \r
+               query.setParameter("relatedTo", taxon);\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
+               \r
+               return (List<SynonymRelationship>)query.list();\r
+       }\r
+\r
+       public List<TaxonBase> searchTaxa(String queryString, Boolean accepted, Integer pageSize, Integer pageNumber) {\r
+               throw new UnsupportedOperationException("Free text searching isn't implemented yet, sorry!");\r
+       }\r
+\r
 }
\ No newline at end of file