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
.common
;
12 import java
.util
.ArrayList
;
13 import java
.util
.Enumeration
;
14 import java
.util
.List
;
15 import java
.util
.Locale
;
18 import org
.apache
.log4j
.Logger
;
19 import org
.hibernate
.Criteria
;
20 import org
.hibernate
.Query
;
21 import org
.hibernate
.Session
;
22 import org
.hibernate
.criterion
.Criterion
;
23 import org
.hibernate
.criterion
.Projections
;
24 import org
.hibernate
.criterion
.Restrictions
;
25 import org
.hibernate
.envers
.query
.AuditEntity
;
26 import org
.hibernate
.envers
.query
.AuditQuery
;
27 import org
.springframework
.stereotype
.Repository
;
29 import eu
.etaxonomy
.cdm
.model
.common
.CdmBase
;
30 import eu
.etaxonomy
.cdm
.model
.common
.DefinedTermBase
;
31 import eu
.etaxonomy
.cdm
.model
.common
.Language
;
32 import eu
.etaxonomy
.cdm
.model
.location
.NamedArea
;
33 import eu
.etaxonomy
.cdm
.model
.location
.NamedAreaLevel
;
34 import eu
.etaxonomy
.cdm
.model
.location
.NamedAreaType
;
35 import eu
.etaxonomy
.cdm
.model
.location
.WaterbodyOrCountry
;
36 import eu
.etaxonomy
.cdm
.model
.media
.Media
;
37 import eu
.etaxonomy
.cdm
.model
.view
.AuditEvent
;
38 import eu
.etaxonomy
.cdm
.persistence
.dao
.common
.IDefinedTermDao
;
39 import eu
.etaxonomy
.cdm
.persistence
.dao
.common
.ITitledDao
;
42 * @author a.kohlbecker
47 public class DefinedTermDaoImpl
extends VersionableDaoBase
<DefinedTermBase
> implements IDefinedTermDao
{
48 private static final Logger logger
= Logger
.getLogger(DefinedTermDaoImpl
.class);
50 public DefinedTermDaoImpl() {
51 super(DefinedTermBase
.class);
54 public List
<DefinedTermBase
> findByTitle(String queryString
) {
55 return findByTitle(queryString
, null);
59 * @see eu.etaxonomy.cdm.persistence.dao.common.ITitledDao#findByTitle(java.lang.String, eu.etaxonomy.cdm.model.common.CdmBase)
61 public List
<DefinedTermBase
> findByTitle(String queryString
, CdmBase sessionObject
) {
62 checkNotInPriorView("DefinedTermDaoImpl.findByTitle(String queryString, CdmBase sessionObject)");
63 Session session
= getSession();
64 if ( sessionObject
!= null ) {// FIXME is this needed?
65 session
.update(sessionObject
);
67 Query query
= session
.createQuery("select term from DefinedTermBase term join fetch term.representations representation where representation.label = :label");
68 query
.setParameter("label", queryString
);
69 return (List
<DefinedTermBase
>) query
.list();
73 public List
<DefinedTermBase
> findByTitleAndClass(String queryString
, Class
<DefinedTermBase
> clazz
) {
74 checkNotInPriorView("DefinedTermDaoImpl.findByTitleAndClass(String queryString, Class<DefinedTermBase> clazz)");
75 Session session
= getSession();
76 Criteria crit
= session
.createCriteria(clazz
);
77 crit
.add(Restrictions
.ilike("persistentTitleCache", queryString
));
78 List
<DefinedTermBase
> results
= crit
.list();
83 * @see eu.etaxonomy.cdm.persistence.dao.common.ITitledDao#findByTitle(java.lang.String, eu.etaxonomy.cdm.persistence.dao.common.ITitledDao.MATCH_MODE, int, int, java.util.List)
85 public List
<DefinedTermBase
> findByTitle(String queryString
, ITitledDao
.MATCH_MODE matchMode
, int page
, int pagesize
, List
<Criterion
> criteria
) {
86 //FIXME is query parametrised?
87 checkNotInPriorView("DefinedTermDaoImpl.findByTitle(String queryString, ITitledDao.MATCH_MODE matchMode, int page, int pagesize, List<Criterion> criteria)");
88 Criteria crit
= getSession().createCriteria(type
);
89 crit
.add(Restrictions
.ilike("titleCache", matchMode
.queryStringFrom(queryString
)));
90 crit
.setMaxResults(pagesize
);
91 int firstItem
= (page
- 1) * pagesize
+ 1;
92 crit
.setFirstResult(firstItem
);
93 List
<DefinedTermBase
> results
= crit
.list();
98 public WaterbodyOrCountry
getCountryByIso(String iso639
) {
99 // If iso639 = "" query returns non-unique result. We prevent this here:
100 if (iso639
.equals("") ) { return null; }
101 AuditEvent auditEvent
= getAuditEventFromContext();
102 if(auditEvent
.equals(AuditEvent
.CURRENT_VIEW
)) {
103 Query query
= getSession().createQuery("from WaterbodyOrCountry where iso3166_A2 = :isoCode");
104 query
.setParameter("isoCode", iso639
);
105 return (WaterbodyOrCountry
) query
.uniqueResult();
107 AuditQuery query
= getAuditReader().createQuery().forEntitiesAtRevision(WaterbodyOrCountry
.class,auditEvent
.getRevisionNumber());
108 query
.add(AuditEntity
.property("iso3166_A2").eq(iso639
));
109 return (WaterbodyOrCountry
) query
.getSingleResult();
113 public <T
extends DefinedTermBase
> List
<T
> getDefinedTermByRepresentationText(String text
, Class
<T
> clazz
) {
114 Query query
= getSession().createQuery("from "+ clazz
.getName()+" as wc where wc.representations.text like '"+text
+"'");
115 return (List
<T
>) query
.list();
119 * @see eu.etaxonomy.cdm.persistence.dao.common.IDefinedTermDao#getLangaugeByIso(java.lang.String)
121 public Language
getLanguageByIso(String iso639
) {
122 if (iso639
.length() < 2 || iso639
.length() > 3) {
123 logger
.warn("Invalid length " + iso639
.length() + " of ISO code. Length must be 2 or 3.");
126 String isoStandart
= "iso639_" + (iso639
.length() - 1);
127 AuditEvent auditEvent
= getAuditEventFromContext();
128 if(auditEvent
.equals(AuditEvent
.CURRENT_VIEW
)) {
129 Query query
= getSession().createQuery("from Language where " + isoStandart
+ "= :isoCode");
130 query
.setParameter("isoCode", iso639
);
131 return (Language
) query
.uniqueResult();
133 AuditQuery query
= getAuditReader().createQuery().forEntitiesAtRevision(Language
.class,auditEvent
.getRevisionNumber());
134 query
.add(AuditEntity
.property(isoStandart
).eq(iso639
));
135 return (Language
)query
.getSingleResult();
140 * FIXME this will result in a query per language - could you, given that iso codes
141 * are unique, use from Language where iso639_1 in (:isoCode) or iso639_2 in (:isoCode)
143 public List
<Language
> getLanguagesByIso(List
<String
> iso639List
) {
144 List
<Language
> languages
= new ArrayList
<Language
>(iso639List
.size());
145 for (String iso639
: iso639List
) {
146 languages
.add(getLanguageByIso(iso639
));
151 public List
<Language
> getLanguagesByLocale(Enumeration
<Locale
> locales
) {
152 List
<Language
> languages
= new ArrayList
<Language
>();
153 while(locales
.hasMoreElements()) {
154 Locale locale
= locales
.nextElement();
155 languages
.add(getLanguageByIso(locale
.getLanguage()));
160 public int count(NamedAreaLevel level
, NamedAreaType type
) {
161 AuditEvent auditEvent
= getAuditEventFromContext();
162 if(auditEvent
.equals(AuditEvent
.CURRENT_VIEW
)) {
163 Criteria criteria
= getSession().createCriteria(NamedArea
.class);
166 criteria
.add(Restrictions
.eq("level",level
));
170 criteria
.add(Restrictions
.eq("type", type
));
173 criteria
.setProjection(Projections
.rowCount());
175 return (Integer
)criteria
.uniqueResult();
177 AuditQuery query
= getAuditReader().createQuery().forEntitiesAtRevision(NamedArea
.class,auditEvent
.getRevisionNumber());
180 query
.add(AuditEntity
.relatedId("level").eq(level
.getId()));
184 query
.add(AuditEntity
.relatedId("type").eq(type
.getId()));
186 query
.addProjection(AuditEntity
.id().count("id"));
187 return ((Long
)query
.getSingleResult()).intValue();
191 public int countMedia(DefinedTermBase definedTerm
) {
192 checkNotInPriorView("DefinedTermDaoImpl.countMedia(DefinedTermBase definedTerm)");
193 Query query
= getSession().createQuery("select count(media) from DefinedTermBase definedTerm join definedTerm.media media where definedTerm = :definedTerm");
194 query
.setParameter("definedTerm", definedTerm
);
196 return ((Long
)query
.uniqueResult()).intValue();
199 public List
<Media
> getMedia(DefinedTermBase definedTerm
, Integer pageSize
, Integer pageNumber
) {
200 checkNotInPriorView("DefinedTermDaoImpl.getMedia(DefinedTermBase definedTerm, Integer pageSize, Integer pageNumber)");
201 Query query
= getSession().createQuery("select media from DefinedTermBase definedTerm join definedTerm.media media where definedTerm = :definedTerm");
202 query
.setParameter("definedTerm", definedTerm
);
204 if(pageSize
!= null) {
205 query
.setMaxResults(pageSize
);
206 if(pageNumber
!= null) {
207 query
.setFirstResult(pageNumber
* pageSize
);
211 return (List
<Media
>)query
.list();
214 public List
<NamedArea
> list(NamedAreaLevel level
, NamedAreaType type
, Integer pageSize
, Integer pageNumber
) {
215 AuditEvent auditEvent
= getAuditEventFromContext();
216 if(auditEvent
.equals(AuditEvent
.CURRENT_VIEW
)) {
217 Criteria criteria
= getSession().createCriteria(NamedArea
.class);
220 criteria
.add(Restrictions
.eq("level",level
));
224 criteria
.add(Restrictions
.eq("type", type
));
227 if(pageSize
!= null) {
228 criteria
.setMaxResults(pageSize
);
229 if(pageNumber
!= null) {
230 criteria
.setFirstResult(pageNumber
* pageSize
);
234 return (List
<NamedArea
>)criteria
.list();
236 AuditQuery query
= getAuditReader().createQuery().forEntitiesAtRevision(NamedArea
.class,auditEvent
.getRevisionNumber());
239 query
.add(AuditEntity
.relatedId("level").eq(level
.getId()));
243 query
.add(AuditEntity
.relatedId("type").eq(type
.getId()));
246 return (List
<NamedArea
>)query
.getResultList();
250 public <T
extends DefinedTermBase
> int countGeneralizationOf(T kindOf
) {
251 AuditEvent auditEvent
= getAuditEventFromContext();
252 if(auditEvent
.equals(AuditEvent
.CURRENT_VIEW
)) {
253 Query query
= getSession().createQuery("select count(term) from DefinedTermBase term where term.kindOf = :kindOf");
254 query
.setParameter("kindOf", kindOf
);
255 return ((Long
)query
.uniqueResult()).intValue();
257 AuditQuery query
= getAuditReader().createQuery().forEntitiesAtRevision(DefinedTermBase
.class,auditEvent
.getRevisionNumber());
258 query
.add(AuditEntity
.relatedId("kindOf").eq(kindOf
.getId()));
259 query
.addProjection(AuditEntity
.id().count("id"));
260 return ((Long
)query
.getSingleResult()).intValue();
264 public <T
extends DefinedTermBase
> int countIncludes(Set
<T
> partOf
) {
265 AuditEvent auditEvent
= getAuditEventFromContext();
266 if(auditEvent
.equals(AuditEvent
.CURRENT_VIEW
)) {
267 Query query
= getSession().createQuery("select count(term) from DefinedTermBase term where term.partOf in (:partOf)");
268 query
.setParameterList("partOf", partOf
);
269 return ((Long
)query
.uniqueResult()).intValue();
273 AuditQuery query
= getAuditReader().createQuery().forEntitiesAtRevision(DefinedTermBase
.class,auditEvent
.getRevisionNumber());
274 query
.add(AuditEntity
.relatedId("partOf").eq(t
.getId()));
275 query
.addProjection(AuditEntity
.id().count("id"));
276 count
+= ((Long
)query
.getSingleResult()).intValue();
282 public <T
extends DefinedTermBase
> List
<T
> getGeneralizationOf(T kindOf
, Integer pageSize
, Integer pageNumber
) {
283 AuditEvent auditEvent
= getAuditEventFromContext();
284 if(auditEvent
.equals(AuditEvent
.CURRENT_VIEW
)) {
285 Query query
= getSession().createQuery("select term from DefinedTermBase term where term.kindOf = :kindOf");
286 query
.setParameter("kindOf", kindOf
);
288 if(pageSize
!= null) {
289 query
.setMaxResults(pageSize
);
290 if(pageNumber
!= null) {
291 query
.setFirstResult(pageNumber
* pageSize
);
295 return (List
<T
>)query
.list();
297 AuditQuery query
= getAuditReader().createQuery().forEntitiesAtRevision(DefinedTermBase
.class,auditEvent
.getRevisionNumber());
298 query
.add(AuditEntity
.relatedId("kindOf").eq(kindOf
.getId()));
300 if(pageSize
!= null) {
301 query
.setMaxResults(pageSize
);
302 if(pageNumber
!= null) {
303 query
.setFirstResult(pageNumber
* pageSize
);
307 return (List
<T
>)query
.getResultList();
311 public <T
extends DefinedTermBase
> List
<T
> getIncludes(Set
<T
> partOf
, Integer pageSize
, Integer pageNumber
) {
312 AuditEvent auditEvent
= getAuditEventFromContext();
313 if(auditEvent
.equals(AuditEvent
.CURRENT_VIEW
)) {
314 Query query
= getSession().createQuery("select term from DefinedTermBase term where term.partOf in (:partOf)");
315 query
.setParameterList("partOf", partOf
);
317 if(pageSize
!= null) {
318 query
.setMaxResults(pageSize
);
319 if(pageNumber
!= null) {
320 query
.setFirstResult(pageNumber
* pageSize
);
324 return (List
<T
>)query
.list();
326 List
<T
> result
= new ArrayList
<T
>();
328 AuditQuery query
= getAuditReader().createQuery().forEntitiesAtRevision(DefinedTermBase
.class,auditEvent
.getRevisionNumber());
329 query
.add(AuditEntity
.relatedId("partOf").eq(t
.getId()));
330 if(pageSize
!= null) {
331 query
.setMaxResults(pageSize
);
332 if(pageNumber
!= null) {
333 query
.setFirstResult(pageNumber
* pageSize
);
337 result
.addAll((List
<T
>)query
.getResultList());
343 public <T
extends DefinedTermBase
> int countPartOf(Set
<T
> definedTerms
) {
344 checkNotInPriorView("DefinedTermDaoImpl.countPartOf(Set<T> definedTerms)");
345 Query query
= getSession().createQuery("select count(distinct partOf) from DefinedTermBase definedTerm join definedTerm.partOf partOf where definedTerm in (:definedTerms)");
346 query
.setParameterList("definedTerms", definedTerms
);
347 return ((Long
)query
.uniqueResult()).intValue();
350 public <T
extends DefinedTermBase
> List
<T
> getPartOf(Set
<T
> definedTerms
, Integer pageSize
, Integer pageNumber
) {
351 checkNotInPriorView("DefinedTermDaoImpl.getPartOf(Set<T> definedTerms, Integer pageSize, Integer pageNumber)");
352 Query query
= getSession().createQuery("select distinct partOf from DefinedTermBase definedTerm join definedTerm.partOf partOf where definedTerm in (:definedTerms)");
353 query
.setParameterList("definedTerms", definedTerms
);
355 if(pageSize
!= null) {
356 query
.setMaxResults(pageSize
);
357 if(pageNumber
!= null) {
358 query
.setFirstResult(pageNumber
* pageSize
);
362 return (List
<T
>)query
.list();
365 public DefinedTermBase
findByUri(String uri
) {
366 AuditEvent auditEvent
= getAuditEventFromContext();
367 if(auditEvent
.equals(AuditEvent
.CURRENT_VIEW
)) {
368 Query query
= getSession().createQuery("select term from DefinedTermBase term where term.uri = :uri");
369 query
.setParameter("uri", uri
);
370 return (DefinedTermBase
)query
.uniqueResult();
372 AuditQuery query
= getAuditReader().createQuery().forEntitiesAtRevision(DefinedTermBase
.class,auditEvent
.getRevisionNumber());
373 query
.add(AuditEntity
.property("uri").eq(uri
));
374 return (DefinedTermBase
)query
.getSingleResult();
380 // public List<DefinedTermBase> list(int limit, int start) {
381 // Query query = getSession().createQuery("select term from DefinedTermBase term join fetch term.representations representation ");
382 // query.setMaxResults(limit);
383 // query.setFirstResult(start);
384 // return (List<DefinedTermBase>) query.list();