+\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