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
.description
;
12 import java
.util
.ArrayList
;
13 import java
.util
.HashSet
;
14 import java
.util
.ArrayList
;
15 import java
.util
.List
;
18 import org
.apache
.log4j
.Logger
;
19 import org
.hibernate
.Criteria
;
20 import org
.hibernate
.Query
;
21 import org
.hibernate
.criterion
.Projections
;
22 import org
.hibernate
.criterion
.Restrictions
;
23 import org
.hibernate
.envers
.query
.AuditEntity
;
24 import org
.hibernate
.envers
.query
.AuditQuery
;
25 import org
.springframework
.beans
.factory
.annotation
.Qualifier
;
26 import org
.springframework
.stereotype
.Repository
;
28 import eu
.etaxonomy
.cdm
.model
.common
.DefinedTermBase
;
29 import eu
.etaxonomy
.cdm
.model
.description
.DescriptionBase
;
30 import eu
.etaxonomy
.cdm
.model
.description
.DescriptionElementBase
;
31 import eu
.etaxonomy
.cdm
.model
.description
.Feature
;
32 import eu
.etaxonomy
.cdm
.model
.description
.PresenceAbsenceTermBase
;
33 import eu
.etaxonomy
.cdm
.model
.description
.Scope
;
34 import eu
.etaxonomy
.cdm
.model
.description
.TaxonDescription
;
35 import eu
.etaxonomy
.cdm
.model
.description
.TaxonNameDescription
;
36 import eu
.etaxonomy
.cdm
.model
.location
.NamedArea
;
37 import eu
.etaxonomy
.cdm
.model
.name
.TaxonNameBase
;
38 import eu
.etaxonomy
.cdm
.model
.taxon
.Taxon
;
39 import eu
.etaxonomy
.cdm
.model
.view
.AuditEvent
;
40 import eu
.etaxonomy
.cdm
.persistence
.dao
.description
.IDescriptionDao
;
41 import eu
.etaxonomy
.cdm
.persistence
.dao
.hibernate
.common
.IdentifiableDaoBase
;
45 @Qualifier("descriptionDaoImpl")
46 public class DescriptionDaoImpl
extends IdentifiableDaoBase
<DescriptionBase
> implements IDescriptionDao
{
48 @SuppressWarnings("unused")
49 private static final Logger logger
= Logger
.getLogger(DescriptionDaoImpl
.class);
51 public DescriptionDaoImpl() {
52 super(DescriptionBase
.class);
55 public int countDescriptionByDistribution(Set
<NamedArea
> namedAreas
, PresenceAbsenceTermBase status
) {
56 checkNotInPriorView("DescriptionDaoImpl.countDescriptionByDistribution(Set<NamedArea> namedAreas, PresenceAbsenceTermBase status)");
60 query
= getSession().createQuery("select count(distinct description) from TaxonDescription description left join description.elements element join element.area area where area in (:namedAreas)");
62 query
= getSession().createQuery("select count(distinct description) from TaxonDescription description left join description.elements element join element.area area join element.status status where area in (:namedAreas) and status = :status");
63 query
.setParameter("status", status
);
65 query
.setParameterList("namedAreas", namedAreas
);
67 return ((Long
)query
.uniqueResult()).intValue();
70 public <TYPE
extends DescriptionElementBase
> int countDescriptionElements(DescriptionBase description
, Set
<Feature
> features
, Class
<TYPE
> type
) {
71 AuditEvent auditEvent
= getAuditEventFromContext();
72 if(auditEvent
.equals(AuditEvent
.CURRENT_VIEW
)) {
73 Criteria criteria
= getSession().createCriteria(type
);
75 if(description
!= null) {
76 criteria
.add(Restrictions
.eq("inDescription", description
));
79 if(features
!= null && !features
.isEmpty()) {
80 criteria
.add(Restrictions
.in("feature", features
));
83 criteria
.setProjection(Projections
.rowCount());
85 return (Integer
)criteria
.uniqueResult();
87 if(features
!= null && !features
.isEmpty()) {
89 for(Feature f
: features
) {
90 AuditQuery query
= getAuditReader().createQuery().forEntitiesAtRevision(type
,auditEvent
.getRevisionNumber());
92 if(description
!= null) {
93 query
.add(AuditEntity
.relatedId("inDescription").eq(description
.getId()));
96 query
.add(AuditEntity
.relatedId("feature").eq(f
.getId()));
97 query
.addProjection(AuditEntity
.id().count("id"));
98 count
+= ((Long
)query
.getSingleResult()).intValue();
103 AuditQuery query
= getAuditReader().createQuery().forEntitiesAtRevision(type
,auditEvent
.getRevisionNumber());
105 if(description
!= null) {
106 query
.add(AuditEntity
.relatedId("inDescription").eq(description
.getId()));
108 query
.addProjection(AuditEntity
.id().count("id"));
109 return ((Long
)query
.getSingleResult()).intValue();
114 public <TYPE
extends DescriptionBase
> int countDescriptions(Class
<TYPE
> type
, Boolean hasImages
, Boolean hasText
, Set
<Feature
> features
) {
115 checkNotInPriorView("DescriptionDaoImpl.countDescriptions(Class<TYPE> type, Boolean hasImages, Boolean hasText, Set<Feature> features)");
116 Criteria inner
= getSession().createCriteria(type
);
117 Criteria elementsCriteria
= inner
.createCriteria("elements");
118 if(hasText
!= null) {
120 elementsCriteria
.add(Restrictions
.isNotEmpty("multilanguageText"));
122 elementsCriteria
.add(Restrictions
.isEmpty("multilanguageText"));
126 if(hasImages
!= null) {
128 elementsCriteria
.add(Restrictions
.isNotEmpty("media"));
130 elementsCriteria
.add(Restrictions
.isEmpty("media"));
134 if(features
!= null && !features
.isEmpty()) {
135 elementsCriteria
.add(Restrictions
.in("feature", features
));
138 inner
.setProjection(Projections
.countDistinct("id"));
140 return (Integer
) inner
.uniqueResult();
143 public int countTaxonDescriptions(Taxon taxon
, Set
<Scope
> scopes
,Set
<NamedArea
> geographicalScopes
) {
144 checkNotInPriorView("DescriptionDaoImpl.countTaxonDescriptions(Taxon taxon, Set<Scope> scopes,Set<NamedArea> geographicalScopes)");
145 Criteria criteria
= getSession().createCriteria(TaxonDescription
.class);
148 criteria
.add(Restrictions
.eq("taxon", taxon
));
151 if(scopes
!= null && !scopes
.isEmpty()) {
152 Set
<Integer
> scopeIds
= new HashSet
<Integer
>();
153 for(Scope s
: scopes
) {
154 scopeIds
.add(s
.getId());
156 criteria
.createCriteria("scopes").add(Restrictions
.in("id", scopeIds
));
159 if(geographicalScopes
!= null && !geographicalScopes
.isEmpty()) {
160 Set
<Integer
> geoScopeIds
= new HashSet
<Integer
>();
161 for(NamedArea n
: geographicalScopes
) {
162 geoScopeIds
.add(n
.getId());
164 criteria
.createCriteria("geoScopes").add(Restrictions
.in("id", geoScopeIds
));
167 criteria
.setProjection(Projections
.rowCount());
169 return (Integer
)criteria
.uniqueResult();
172 public <TYPE
extends DescriptionElementBase
> List
<TYPE
> getDescriptionElements(DescriptionBase description
, Set
<Feature
> features
, Class
<TYPE
> type
, Integer pageSize
, Integer pageNumber
) {
173 AuditEvent auditEvent
= getAuditEventFromContext();
174 if(auditEvent
.equals(AuditEvent
.CURRENT_VIEW
)) {
175 Criteria criteria
= getSession().createCriteria(type
);
177 if(description
!= null) {
178 criteria
.add(Restrictions
.eq("inDescription", description
));
181 if(features
!= null && !features
.isEmpty()) {
182 criteria
.add(Restrictions
.in("feature", features
));
185 if(pageSize
!= null) {
186 criteria
.setMaxResults(pageSize
);
187 if(pageNumber
!= null) {
188 criteria
.setFirstResult(pageNumber
* pageSize
);
192 return (List
<TYPE
>)criteria
.list();
194 if(features
!= null && !features
.isEmpty()) {
195 List
<TYPE
> result
= new ArrayList
<TYPE
>();
196 for(Feature f
: features
) {
197 AuditQuery query
= getAuditReader().createQuery().forEntitiesAtRevision(type
,auditEvent
.getRevisionNumber());
199 if(description
!= null) {
200 query
.add(AuditEntity
.relatedId("inDescription").eq(description
.getId()));
203 query
.add(AuditEntity
.relatedId("feature").eq(f
.getId()));
204 result
.addAll((List
<TYPE
>)query
.getResultList());
209 AuditQuery query
= getAuditReader().createQuery().forEntitiesAtRevision(type
,auditEvent
.getRevisionNumber());
211 if(description
!= null) {
212 query
.add(AuditEntity
.relatedId("inDescription").eq(description
.getId()));
215 return (List
<TYPE
>)query
.getResultList();
220 public List
<TaxonDescription
> getTaxonDescriptions(Taxon taxon
, Set
<Scope
> scopes
, Set
<NamedArea
> geographicalScopes
,Integer pageSize
, Integer pageNumber
) {
221 checkNotInPriorView("DescriptionDaoImpl.getTaxonDescriptions(Taxon taxon, Set<Scope> scopes, Set<NamedArea> geographicalScopes,Integer pageSize, Integer pageNumber)");
222 Criteria criteria
= getSession().createCriteria(TaxonDescription
.class);
225 criteria
.add(Restrictions
.eq("taxon", taxon
));
228 if(scopes
!= null && !scopes
.isEmpty()) {
229 Set
<Integer
> scopeIds
= new HashSet
<Integer
>();
230 for(Scope s
: scopes
) {
231 scopeIds
.add(s
.getId());
233 criteria
.createCriteria("scopes").add(Restrictions
.in("id", scopeIds
));
236 if(geographicalScopes
!= null && !geographicalScopes
.isEmpty()) {
237 Set
<Integer
> geoScopeIds
= new HashSet
<Integer
>();
238 for(NamedArea n
: geographicalScopes
) {
239 geoScopeIds
.add(n
.getId());
241 criteria
.createCriteria("geoScopes").add(Restrictions
.in("id", geoScopeIds
));
244 if(pageSize
!= null) {
245 criteria
.setMaxResults(pageSize
);
246 if(pageNumber
!= null) {
247 criteria
.setFirstResult(pageNumber
* pageSize
);
251 return (List
<TaxonDescription
>)criteria
.list();
254 public List
<TaxonNameDescription
> getTaxonNameDescriptions(TaxonNameBase name
, Integer pageSize
, Integer pageNumber
) {
255 AuditEvent auditEvent
= getAuditEventFromContext();
256 if(auditEvent
.equals(AuditEvent
.CURRENT_VIEW
)) {
257 Criteria criteria
= getSession().createCriteria(TaxonNameDescription
.class);
260 criteria
.add(Restrictions
.eq("taxonName", name
));
263 if(pageSize
!= null) {
264 criteria
.setMaxResults(pageSize
);
265 if(pageNumber
!= null) {
266 criteria
.setFirstResult(pageNumber
* pageSize
);
270 return (List
<TaxonNameDescription
>)criteria
.list();
272 AuditQuery query
= getAuditReader().createQuery().forEntitiesAtRevision(TaxonNameDescription
.class,auditEvent
.getRevisionNumber());
275 query
.add(AuditEntity
.relatedId("taxonName").eq(name
.getId()));
278 if(pageSize
!= null) {
279 query
.setMaxResults(pageSize
);
280 if(pageNumber
!= null) {
281 query
.setFirstResult(pageNumber
* pageSize
);
284 return (List
<TaxonNameDescription
>)query
.getResultList();
289 public int countTaxonNameDescriptions(TaxonNameBase name
) {
290 AuditEvent auditEvent
= getAuditEventFromContext();
291 if(auditEvent
.equals(AuditEvent
.CURRENT_VIEW
)) {
292 Criteria criteria
= getSession().createCriteria(TaxonNameDescription
.class);
295 criteria
.add(Restrictions
.eq("taxonName", name
));
298 criteria
.setProjection(Projections
.rowCount());
300 return (Integer
)criteria
.uniqueResult();
302 AuditQuery query
= getAuditReader().createQuery().forEntitiesAtRevision(TaxonNameDescription
.class,auditEvent
.getRevisionNumber());
305 query
.add(AuditEntity
.relatedId("taxonName").eq(name
.getId()));
308 query
.addProjection(AuditEntity
.id().count("id"));
309 return ((Long
)query
.getSingleResult()).intValue();
314 * Should use a DetachedCriteria & subquery, but HHH-158 prevents this, for now.
316 * e.g. DetachedCriteria inner = DestachedCriteria.forClass(type);
318 * outer.add(Subqueries.propertyIn("id", inner));
320 public <TYPE
extends DescriptionBase
> List
<TYPE
> listDescriptions(Class
<TYPE
> type
, Boolean hasImages
, Boolean hasText
, Set
<Feature
> features
, Integer pageSize
, Integer pageNumber
) {
321 checkNotInPriorView("DescriptionDaoImpl.listDescriptions(Class<TYPE> type, Boolean hasImages, Boolean hasText, Set<Feature> features, Integer pageSize, Integer pageNumber)");
322 Criteria inner
= getSession().createCriteria(type
);
323 Criteria elementsCriteria
= inner
.createCriteria("elements");
324 if(hasText
!= null) {
326 elementsCriteria
.add(Restrictions
.isNotEmpty("multilanguageText"));
328 elementsCriteria
.add(Restrictions
.isEmpty("multilanguageText"));
332 if(hasImages
!= null) {
334 elementsCriteria
.add(Restrictions
.isNotEmpty("media"));
336 elementsCriteria
.add(Restrictions
.isEmpty("media"));
340 if(features
!= null && !features
.isEmpty()) {
341 elementsCriteria
.add(Restrictions
.in("feature", features
));
344 inner
.setProjection(Projections
.distinct(Projections
.id()));
346 List
<Integer
> ids
= (List
<Integer
>)inner
.list();
349 return new ArrayList
<TYPE
>();
352 Criteria outer
= getSession().createCriteria(type
);
353 outer
.add(Restrictions
.in("id", ids
));
355 if(pageSize
!= null) {
356 outer
.setMaxResults(pageSize
);
357 if(pageNumber
!= null) {
358 outer
.setFirstResult(pageNumber
* pageSize
);
362 return (List
<TYPE
>)outer
.list();
365 public List
<TaxonDescription
> searchDescriptionByDistribution(Set
<NamedArea
> namedAreas
, PresenceAbsenceTermBase status
, Integer pageSize
, Integer pageNumber
) {
366 checkNotInPriorView("DescriptionDaoImpl.searchDescriptionByDistribution(Set<NamedArea> namedAreas, PresenceAbsenceTermBase status, Integer pageSize, Integer pageNumber)");
370 query
= getSession().createQuery("select distinct description from TaxonDescription description left join description.elements element join element.area area where area in (:namedAreas)");
372 query
= getSession().createQuery("select distinct description from TaxonDescription description left join description.elements element join element.area area join element.status status where area in (:namedAreas) and status = :status");
373 query
.setParameter("status", status
);
375 query
.setParameterList("namedAreas", namedAreas
);
377 if(pageSize
!= null) {
378 query
.setMaxResults(pageSize
);
379 if(pageNumber
!= null) {
380 query
.setFirstResult(pageNumber
* pageSize
);
384 return (List
<TaxonDescription
>)query
.list();