2 * Copyright (C) 2007 EDIT
3 * European Distributed Institute of Taxonomy
4 * http://www.e-taxonomy.eu
6 * The contents of this file are subject to the Mozilla Public License Version 1.1
7 * See LICENSE.TXT at the top of this package for the full license terms.
10 package eu
.etaxonomy
.cdm
.persistence
.dao
.hibernate
.name
;
12 import java
.util
.List
;
14 import org
.apache
.log4j
.Logger
;
15 import org
.hibernate
.Criteria
;
16 import org
.hibernate
.Query
;
17 import org
.hibernate
.criterion
.Criterion
;
18 import org
.hibernate
.criterion
.Order
;
19 import org
.hibernate
.criterion
.Projections
;
20 import org
.hibernate
.criterion
.Restrictions
;
21 import org
.hibernate
.envers
.query
.AuditEntity
;
22 import org
.hibernate
.envers
.query
.AuditQuery
;
23 import org
.springframework
.beans
.factory
.annotation
.Qualifier
;
24 import org
.springframework
.stereotype
.Repository
;
26 import eu
.etaxonomy
.cdm
.model
.common
.RelationshipBase
;
27 import eu
.etaxonomy
.cdm
.model
.name
.BotanicalName
;
28 import eu
.etaxonomy
.cdm
.model
.name
.HybridRelationship
;
29 import eu
.etaxonomy
.cdm
.model
.name
.HybridRelationshipType
;
30 import eu
.etaxonomy
.cdm
.model
.name
.NameRelationship
;
31 import eu
.etaxonomy
.cdm
.model
.name
.NameRelationshipType
;
32 import eu
.etaxonomy
.cdm
.model
.name
.NonViralName
;
33 import eu
.etaxonomy
.cdm
.model
.name
.Rank
;
34 import eu
.etaxonomy
.cdm
.model
.name
.TaxonNameBase
;
35 import eu
.etaxonomy
.cdm
.model
.name
.TypeDesignationBase
;
36 import eu
.etaxonomy
.cdm
.model
.name
.SpecimenTypeDesignationStatus
;
37 import eu
.etaxonomy
.cdm
.model
.name
.TypeDesignationStatusBase
;
38 import eu
.etaxonomy
.cdm
.model
.view
.AuditEvent
;
39 import eu
.etaxonomy
.cdm
.persistence
.dao
.hibernate
.common
.IdentifiableDaoBase
;
40 import eu
.etaxonomy
.cdm
.persistence
.dao
.name
.ITaxonNameDao
;
41 import eu
.etaxonomy
.cdm
.persistence
.query
.MatchMode
;
42 import eu
.etaxonomy
.cdm
.persistence
.query
.OrderHint
;
49 @Qualifier("taxonNameDaoHibernateImpl")
50 public class TaxonNameDaoHibernateImpl
51 extends IdentifiableDaoBase
<TaxonNameBase
> implements ITaxonNameDao
{
53 @SuppressWarnings("unused")
54 private static final Logger logger
= Logger
.getLogger(TaxonNameDaoHibernateImpl
.class);
56 public TaxonNameDaoHibernateImpl() {
57 super(TaxonNameBase
.class);
60 public int countHybridNames(BotanicalName name
, HybridRelationshipType type
) {
61 AuditEvent auditEvent
= getAuditEventFromContext();
62 if(auditEvent
.equals(AuditEvent
.CURRENT_VIEW
)) {
65 query
= getSession().createQuery("select count(relation) from HybridRelationship relation where relation.relatedFrom = :name");
67 query
= getSession().createQuery("select count(relation) from HybridRelationship relation where relation.relatedFrom = :name and relation.type = :type");
68 query
.setParameter("type", type
);
70 query
.setParameter("name",name
);
71 return ((Long
)query
.uniqueResult()).intValue();
73 AuditQuery query
= getAuditReader().createQuery().forEntitiesAtRevision(HybridRelationship
.class,auditEvent
.getRevisionNumber());
74 query
.add(AuditEntity
.relatedId("relatedFrom").eq(name
.getId()));
75 query
.addProjection(AuditEntity
.id().count("id"));
78 query
.add(AuditEntity
.relatedId("type").eq(type
.getId()));
81 return ((Long
)query
.getSingleResult()).intValue();
85 public int countNames(String queryString
) {
86 checkNotInPriorView("TaxonNameDaoHibernateImpl.countNames(String queryString)");
87 Criteria criteria
= getSession().createCriteria(TaxonNameBase
.class);
89 if (queryString
!= null) {
90 criteria
.add(Restrictions
.ilike("nameCache", queryString
));
92 criteria
.setProjection(Projections
.projectionList().add(Projections
.rowCount()));
94 return (Integer
)criteria
.uniqueResult();
97 public int countNames(String genusOrUninomial
, String infraGenericEpithet
, String specificEpithet
, String infraSpecificEpithet
, Rank rank
) {
98 AuditEvent auditEvent
= getAuditEventFromContext();
99 if(auditEvent
.equals(AuditEvent
.CURRENT_VIEW
)) {
100 Criteria criteria
= getSession().createCriteria(TaxonNameBase
.class);
103 * Given HHH-2951 - "Restrictions.eq when passed null, should create a NullRestriction"
104 * We need to convert nulls to NullRestrictions for now
106 if(genusOrUninomial
!= null) {
107 criteria
.add(Restrictions
.eq("genusOrUninomial",genusOrUninomial
));
109 criteria
.add(Restrictions
.isNull("genusOrUninomial"));
112 if(infraGenericEpithet
!= null) {
113 criteria
.add(Restrictions
.eq("infraGenericEpithet", infraGenericEpithet
));
115 criteria
.add(Restrictions
.isNull("infraGenericEpithet"));
118 if(specificEpithet
!= null) {
119 criteria
.add(Restrictions
.eq("specificEpithet", specificEpithet
));
121 criteria
.add(Restrictions
.isNull("specificEpithet"));
124 if(infraSpecificEpithet
!= null) {
125 criteria
.add(Restrictions
.eq("infraSpecificEpithet",infraSpecificEpithet
));
127 criteria
.add(Restrictions
.isNull("infraSpecificEpithet"));
131 criteria
.add(Restrictions
.eq("rank", rank
));
134 criteria
.setProjection(Projections
.rowCount());
135 return (Integer
)criteria
.uniqueResult();
137 AuditQuery query
= getAuditReader().createQuery().forEntitiesAtRevision(TaxonNameBase
.class,auditEvent
.getRevisionNumber());
139 if(genusOrUninomial
!= null) {
140 query
.add(AuditEntity
.property("genusOrUninomial").eq(genusOrUninomial
));
142 query
.add(AuditEntity
.property("genusOrUninomial").isNull());
145 if(infraGenericEpithet
!= null) {
146 query
.add(AuditEntity
.property("infraGenericEpithet").eq(infraGenericEpithet
));
148 query
.add(AuditEntity
.property("infraGenericEpithet").isNull());
151 if(specificEpithet
!= null) {
152 query
.add(AuditEntity
.property("specificEpithet").eq(specificEpithet
));
154 query
.add(AuditEntity
.property("specificEpithet").isNull());
157 if(infraSpecificEpithet
!= null) {
158 query
.add(AuditEntity
.property("infraSpecificEpithet").eq(infraSpecificEpithet
));
160 query
.add(AuditEntity
.property("infraSpecificEpithet").isNull());
164 query
.add(AuditEntity
.relatedId("rank").eq(rank
.getId()));
167 query
.addProjection(AuditEntity
.id().count("id"));
168 return ((Long
)query
.getSingleResult()).intValue();
172 public int countRelatedNames(TaxonNameBase name
, NameRelationshipType type
) {
173 AuditEvent auditEvent
= getAuditEventFromContext();
174 if(auditEvent
.equals(AuditEvent
.CURRENT_VIEW
)) {
177 query
= getSession().createQuery("select count(relation) from NameRelationship relation where relation.relatedFrom = :name");
179 query
= getSession().createQuery("select count(relation) from NameRelationship relation where relation.relatedFrom = :name and relation.type = :type");
180 query
.setParameter("type", type
);
182 query
.setParameter("name",name
);
183 return ((Long
)query
.uniqueResult()).intValue();
185 AuditQuery query
= getAuditReader().createQuery().forEntitiesAtRevision(NameRelationship
.class,auditEvent
.getRevisionNumber());
186 query
.add(AuditEntity
.relatedId("relatedFrom").eq(name
.getId()));
187 query
.addProjection(AuditEntity
.id().count("id"));
190 query
.add(AuditEntity
.relatedId("type").eq(type
.getId()));
193 return ((Long
)query
.getSingleResult()).intValue();
197 public int countTypeDesignations(TaxonNameBase name
, SpecimenTypeDesignationStatus status
) {
198 AuditEvent auditEvent
= getAuditEventFromContext();
199 if(auditEvent
.equals(AuditEvent
.CURRENT_VIEW
)) {
202 query
= getSession().createQuery("select count(designation) from TypeDesignationBase designation join designation.typifiedNames name where name = :name");
204 query
= getSession().createQuery("select count(designation) from TypeDesignationBase designation join designation.typifiedNames name where name = :name and designation.typeStatus = :status");
205 query
.setParameter("status", status
);
207 query
.setParameter("name",name
);
208 return ((Long
)query
.uniqueResult()).intValue();
210 AuditQuery query
= getAuditReader().createQuery().forEntitiesAtRevision(TypeDesignationBase
.class,auditEvent
.getRevisionNumber());
211 query
.add(AuditEntity
.relatedId("typifiedNames").eq(name
.getId()));
212 query
.addProjection(AuditEntity
.id().count("id"));
215 query
.add(AuditEntity
.relatedId("typeStatus").eq(status
.getId()));
218 return ((Long
)query
.getSingleResult()).intValue();
222 public List
<HybridRelationship
> getHybridNames(BotanicalName name
, HybridRelationshipType type
, Integer pageSize
, Integer pageNumber
, List
<OrderHint
> orderHints
, List
<String
> propertyPaths
) {
223 AuditEvent auditEvent
= getAuditEventFromContext();
224 if(auditEvent
.equals(AuditEvent
.CURRENT_VIEW
)) {
225 Criteria criteria
= getSession().createCriteria(HybridRelationship
.class);
226 criteria
.add(Restrictions
.eq("relatedFrom", name
));
228 criteria
.add(Restrictions
.eq("type", type
));
231 if(pageSize
!= null) {
232 criteria
.setMaxResults(pageSize
);
233 if(pageNumber
!= null) {
234 criteria
.setFirstResult(pageNumber
* pageSize
);
236 criteria
.setFirstResult(0);
240 addOrder(criteria
, orderHints
);
242 List
<HybridRelationship
> results
= (List
<HybridRelationship
>)criteria
.list();
243 defaultBeanInitializer
.initializeAll(results
, propertyPaths
);
246 AuditQuery query
= getAuditReader().createQuery().forEntitiesAtRevision(HybridRelationship
.class,auditEvent
.getRevisionNumber());
247 query
.add(AuditEntity
.relatedId("relatedFrom").eq(name
.getId()));
250 query
.add(AuditEntity
.relatedId("type").eq(type
.getId()));
253 if(pageSize
!= null) {
254 query
.setMaxResults(pageSize
);
255 if(pageNumber
!= null) {
256 query
.setFirstResult(pageNumber
* pageSize
);
258 query
.setFirstResult(0);
262 List
<HybridRelationship
> results
= (List
<HybridRelationship
>)query
.getResultList();
263 defaultBeanInitializer
.initializeAll(results
, propertyPaths
);
268 public List
<NameRelationship
> getRelatedNames(TaxonNameBase name
, NameRelationshipType type
, Integer pageSize
, Integer pageNumber
, List
<OrderHint
> orderHints
, List
<String
> propertyPaths
) {
269 AuditEvent auditEvent
= getAuditEventFromContext();
270 if(auditEvent
.equals(AuditEvent
.CURRENT_VIEW
)) {
271 Criteria criteria
= getSession().createCriteria(NameRelationship
.class);
272 criteria
.add(Restrictions
.eq("relatedFrom", name
));
274 criteria
.add(Restrictions
.eq("type", type
));
277 if(pageSize
!= null) {
278 criteria
.setMaxResults(pageSize
);
279 if(pageNumber
!= null) {
280 criteria
.setFirstResult(pageNumber
* pageSize
);
282 criteria
.setFirstResult(0);
285 addOrder(criteria
, orderHints
);
287 List
<NameRelationship
> results
= (List
<NameRelationship
>)criteria
.list();
288 defaultBeanInitializer
.initializeAll(results
, propertyPaths
);
291 AuditQuery query
= getAuditReader().createQuery().forEntitiesAtRevision(NameRelationship
.class,auditEvent
.getRevisionNumber());
292 query
.add(AuditEntity
.relatedId("relatedFrom").eq(name
.getId()));
295 query
.add(AuditEntity
.relatedId("type").eq(type
.getId()));
298 if(pageSize
!= null) {
299 query
.setMaxResults(pageSize
);
300 if(pageNumber
!= null) {
301 query
.setFirstResult(pageNumber
* pageSize
);
303 query
.setFirstResult(0);
307 List
<NameRelationship
> results
= (List
<NameRelationship
>)query
.getResultList();
308 defaultBeanInitializer
.initializeAll(results
, propertyPaths
);
313 public List
<TypeDesignationBase
> getTypeDesignations(TaxonNameBase name
,
314 TypeDesignationStatusBase status
, Integer pageSize
, Integer pageNumber
) {
315 return getTypeDesignations(name
, status
, pageSize
, pageNumber
, null);
318 public List
<TypeDesignationBase
> getTypeDesignations(TaxonNameBase name
,
319 TypeDesignationStatusBase status
, Integer pageSize
, Integer pageNumber
,
320 List
<String
> propertyPaths
){
321 AuditEvent auditEvent
= getAuditEventFromContext();
322 if(auditEvent
.equals(AuditEvent
.CURRENT_VIEW
)) {
325 query
= getSession().createQuery("select designation from TypeDesignationBase designation join designation.typifiedNames name where name = :name");
327 query
= getSession().createQuery("select designation from TypeDesignationBase designation join designation.typifiedNames name where name = :name and designation.typeStatus = :status");
328 query
.setParameter("status", status
);
330 query
.setParameter("name",name
);
332 if(pageSize
!= null) {
333 query
.setMaxResults(pageSize
);
334 if(pageNumber
!= null) {
335 query
.setFirstResult(pageNumber
* pageSize
);
337 query
.setFirstResult(0);
340 return defaultBeanInitializer
.initializeAll((List
<TypeDesignationBase
>)query
.list(), propertyPaths
);
342 AuditQuery query
= getAuditReader().createQuery().forEntitiesAtRevision(TypeDesignationBase
.class,auditEvent
.getRevisionNumber());
343 query
.add(AuditEntity
.relatedId("typifiedNames").eq(name
.getId()));
346 query
.add(AuditEntity
.relatedId("typeStatus").eq(status
.getId()));
349 if(pageSize
!= null) {
350 query
.setMaxResults(pageSize
);
351 if(pageNumber
!= null) {
352 query
.setFirstResult(pageNumber
* pageSize
);
354 query
.setFirstResult(0);
358 return (List
<TypeDesignationBase
>)query
.getResultList();
363 public List
<TaxonNameBase
<?
,?
>> searchNames(String queryString
, MatchMode matchMode
, Integer pageSize
, Integer pageNumber
) {
364 checkNotInPriorView("TaxonNameDaoHibernateImpl.searchNames(String queryString, Integer pageSize, Integer pageNumber)");
365 Criteria criteria
= getSession().createCriteria(TaxonNameBase
.class);
367 if (queryString
!= null) {
368 criteria
.add(Restrictions
.ilike("nameCache", queryString
));
370 if(pageSize
!= null) {
371 criteria
.setMaxResults(pageSize
);
372 if(pageNumber
!= null) {
373 criteria
.setFirstResult(pageNumber
* pageSize
);
375 criteria
.setFirstResult(0);
378 List
<TaxonNameBase
<?
,?
>> results
= criteria
.list();
383 public List
<TaxonNameBase
<?
,?
>> searchNames(String queryString
, Integer pageSize
, Integer pageNumber
) {
384 return searchNames(queryString
, MatchMode
.BEGINNING
, pageSize
, pageNumber
);
388 public List
<TaxonNameBase
> searchNames(String genusOrUninomial
,String infraGenericEpithet
, String specificEpithet
, String infraSpecificEpithet
, Rank rank
, Integer pageSize
,Integer pageNumber
) {
389 AuditEvent auditEvent
= getAuditEventFromContext();
390 if(auditEvent
.equals(AuditEvent
.CURRENT_VIEW
)) {
391 Criteria criteria
= getSession().createCriteria(TaxonNameBase
.class);
394 * Given HHH-2951 - "Restrictions.eq when passed null, should create a NullRestriction"
395 * We need to convert nulls to NullRestrictions for now
397 if(genusOrUninomial
!= null) {
398 criteria
.add(Restrictions
.eq("genusOrUninomial",genusOrUninomial
));
400 criteria
.add(Restrictions
.isNull("genusOrUninomial"));
403 if(infraGenericEpithet
!= null) {
404 criteria
.add(Restrictions
.eq("infraGenericEpithet", infraGenericEpithet
));
406 criteria
.add(Restrictions
.isNull("infraGenericEpithet"));
409 if(specificEpithet
!= null) {
410 criteria
.add(Restrictions
.eq("specificEpithet", specificEpithet
));
412 criteria
.add(Restrictions
.isNull("specificEpithet"));
415 if(infraSpecificEpithet
!= null) {
416 criteria
.add(Restrictions
.eq("infraSpecificEpithet",infraSpecificEpithet
));
418 criteria
.add(Restrictions
.isNull("infraSpecificEpithet"));
422 criteria
.add(Restrictions
.eq("rank", rank
));
425 if(pageSize
!= null) {
426 criteria
.setMaxResults(pageSize
);
427 if(pageNumber
!= null) {
428 criteria
.setFirstResult(pageNumber
* pageSize
);
430 criteria
.setFirstResult(0);
434 return (List
<TaxonNameBase
>)criteria
.list();
436 AuditQuery query
= getAuditReader().createQuery().forEntitiesAtRevision(TaxonNameBase
.class,auditEvent
.getRevisionNumber());
438 if(genusOrUninomial
!= null) {
439 query
.add(AuditEntity
.property("genusOrUninomial").eq(genusOrUninomial
));
441 query
.add(AuditEntity
.property("genusOrUninomial").isNull());
444 if(infraGenericEpithet
!= null) {
445 query
.add(AuditEntity
.property("infraGenericEpithet").eq(infraGenericEpithet
));
447 query
.add(AuditEntity
.property("infraGenericEpithet").isNull());
450 if(specificEpithet
!= null) {
451 query
.add(AuditEntity
.property("specificEpithet").eq(specificEpithet
));
453 query
.add(AuditEntity
.property("specificEpithet").isNull());
456 if(infraSpecificEpithet
!= null) {
457 query
.add(AuditEntity
.property("infraSpecificEpithet").eq(infraSpecificEpithet
));
459 query
.add(AuditEntity
.property("infraSpecificEpithet").isNull());
463 query
.add(AuditEntity
.relatedId("rank").eq(rank
.getId()));
466 if(pageSize
!= null) {
467 query
.setMaxResults(pageSize
);
468 if(pageNumber
!= null) {
469 query
.setFirstResult(pageNumber
* pageSize
);
471 query
.setFirstResult(0);
475 return (List
<TaxonNameBase
>)query
.getResultList();
479 public List
<?
extends TaxonNameBase
<?
,?
>> findByName(String queryString
,
480 MatchMode matchmode
, Integer pageSize
, Integer pageNumber
, List
<Criterion
> criteria
) {
482 Criteria crit
= getSession().createCriteria(type
);
483 if (matchmode
== MatchMode
.EXACT
) {
484 crit
.add(Restrictions
.eq("nameCache", matchmode
.queryStringFrom(queryString
)));
486 crit
.add(Restrictions
.ilike("nameCache", matchmode
.queryStringFrom(queryString
)));
488 if(criteria
!= null){
489 for (Criterion criterion
: criteria
) {
493 crit
.addOrder(Order
.asc("nameCache"));
495 if(pageSize
!= null) {
496 crit
.setMaxResults(pageSize
);
497 if(pageNumber
!= null) {
498 crit
.setFirstResult(pageNumber
* pageSize
);
502 List
<?
extends TaxonNameBase
<?
,?
>> results
= crit
.list();
506 public List
<RelationshipBase
> getAllRelationships(Integer limit
, Integer start
) {
507 AuditEvent auditEvent
= getAuditEventFromContext();
508 if(auditEvent
.equals(AuditEvent
.CURRENT_VIEW
)) {
509 //FIXME only NameRelationships
510 Criteria criteria
= getSession().createCriteria(RelationshipBase
.class);
511 return (List
<RelationshipBase
>)criteria
.list();
513 AuditQuery query
= getAuditReader().createQuery().forEntitiesAtRevision(RelationshipBase
.class,auditEvent
.getRevisionNumber());
514 return (List
<RelationshipBase
>)query
.getResultList();
519 public Integer
countByName(String queryString
,
520 MatchMode matchmode
, List
<Criterion
> criteria
) {
521 //TODO improve performance
522 List
<?
extends TaxonNameBase
<?
,?
>> results
= findByName(queryString
, matchmode
, null, null, criteria
);
523 return results
.size();