/**\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.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.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.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
import eu.etaxonomy.cdm.persistence.fetch.CdmFetch;\r
* @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
* @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
-// if (! cdmFetch.includes(CdmFetch.FETCH_CHILDTAXA())){\r
-// logger.warn("no child taxa fetch qq");\r
+\r
+\r
+ if (! cdmFetch.includes(CdmFetch.FETCH_CHILDTAXA())){\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
+ crit.setFetchMode("relationsToThisTaxon.fromTaxon", FetchMode.LAZY);\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
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
+ List<Synonym> results = crit.list();\r
+ return results;\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
@Override\r
- public UUID delete(TaxonBase persistentObject) throws DataAccessException{\r
- Set<Annotation> annotations = persistentObject.getAnnotations();\r
- for (Annotation annotation: annotations){\r
- persistentObject.removeAnnotation(annotation);\r
- }\r
- Set<Marker> markers = persistentObject.getMarkers();\r
- for (Marker marker: markers){\r
- persistentObject.removeMarker(marker);\r
- }\r
-// Set<Marker> markers = persistentObject.getMarkers();\r
-// for (Marker marker: markers){\r
-// persistentObject.removeSource(source)(marker);\r
-// }\r
+ public UUID delete(TaxonBase taxonBase) throws DataAccessException{\r
+ //getSession().update(taxonBase); doesn't work with lazy collections\r
+ //annotations\r
+ try {\r
+ Set<Annotation> annotations = taxonBase.getAnnotations();\r
+ for (Annotation annotation: annotations){\r
+ taxonBase.removeAnnotation(annotation);\r
+ }\r
+ } catch (LazyInitializationException e) {\r
+ logger.warn("LazyInitializationException: " + e);\r
+ }\r
+ //markers\r
+ try {\r
+ Set<Marker> markers = taxonBase.getMarkers();\r
+ for (Marker marker: markers){\r
+ taxonBase.removeMarker(marker);\r
+ }\r
+ } catch (LazyInitializationException e) {\r
+ logger.warn("LazyInitializationException: " + e);\r
+ }\r
+ //originalSource\r
+ try {\r
+ Set<OriginalSource> origSources = taxonBase.getSources();\r
+ for (OriginalSource source: origSources){\r
+ taxonBase.removeSource(source);\r
+ }\r
+ } catch (LazyInitializationException e) {\r
+ logger.warn("LazyInitializationException: " + e);\r
+ }\r
+ //is Taxon\r
+ taxonBase.getName().removeTaxonBase(taxonBase);\r
+ if (taxonBase instanceof Taxon){\r
+ //taxonRelationships\r
+ Taxon taxon = (Taxon)taxonBase;\r
+ Set<TaxonRelationship> taxRels = taxon.getTaxonRelations();\r
+ for (TaxonRelationship taxRel: taxRels){\r
+ taxon.removeTaxonRelation(taxRel);\r
+ } ;\r
+ //SynonymRelationships\r
+ Set<SynonymRelationship> synRels = taxon.getSynonymRelations();\r
+ for (SynonymRelationship synRel: synRels){\r
+ taxon.removeSynonymRelation(synRel);\r
+ } ;\r
+ }//is Synonym\r
+ else if (taxonBase instanceof Synonym){\r
+ Synonym synonym = (Synonym)taxonBase;\r
+ Set<SynonymRelationship> synRels = synonym.getSynonymRelations();\r
+ for (SynonymRelationship synRel: synRels){\r
+ synonym.removeSynonymRelation(synRel);\r
+ } ;\r
+ }\r
+ return super.delete(taxonBase);\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
+ }\r
+\r
+ public int countMatchesByName(String queryString, ITitledDao.MATCH_MODE matchMode, boolean onlyAcccepted) {\r
+\r
+ Criteria crit = getSession().createCriteria(type);\r
+ crit.add(Restrictions.ilike("persistentTitleCache", matchMode.queryStringFrom(queryString)));\r
+ crit.setProjection(Projections.rowCount());\r
+ int result = ((Integer)crit.list().get(0)).intValue();\r
+ return result;\r
+ }\r
+\r
+\r
+ public int countMatchesByName(String queryString, ITitledDao.MATCH_MODE matchMode, boolean onlyAcccepted, List<Criterion> criteria) {\r
+\r
+ Criteria crit = getSession().createCriteria(type);\r
+ crit.add(Restrictions.ilike("persistentTitleCache", matchMode.queryStringFrom(queryString)));\r
+ if(criteria != null){\r
+ for (Criterion criterion : criteria) {\r
+ crit.add(criterion);\r
+ }\r
+ }\r
+ crit.setProjection(Projections.rowCount());\r
+ 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 null;\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