2 * Copyright (C) 2008 EDIT
3 * European Distributed Institute of Taxonomy
4 * http://www.e-taxonomy.eu
7 package eu
.etaxonomy
.cdm
.persistence
.dao
.hibernate
.occurrence
;
9 import java
.util
.ArrayList
;
10 import java
.util
.List
;
13 import org
.apache
.log4j
.Logger
;
14 import org
.apache
.lucene
.analysis
.SimpleAnalyzer
;
15 import org
.apache
.lucene
.queryParser
.ParseException
;
16 import org
.apache
.lucene
.queryParser
.QueryParser
;
17 import org
.hibernate
.Hibernate
;
18 import org
.hibernate
.Query
;
19 import org
.hibernate
.envers
.query
.AuditEntity
;
20 import org
.hibernate
.envers
.query
.AuditQuery
;
21 import org
.hibernate
.search
.FullTextSession
;
22 import org
.hibernate
.search
.Search
;
23 import org
.hibernate
.search
.SearchFactory
;
24 import org
.springframework
.stereotype
.Repository
;
26 import eu
.etaxonomy
.cdm
.model
.media
.Media
;
27 import eu
.etaxonomy
.cdm
.model
.molecular
.DnaSample
;
28 import eu
.etaxonomy
.cdm
.model
.occurrence
.DerivationEvent
;
29 import eu
.etaxonomy
.cdm
.model
.occurrence
.DerivedUnit
;
30 import eu
.etaxonomy
.cdm
.model
.occurrence
.DerivedUnitBase
;
31 import eu
.etaxonomy
.cdm
.model
.occurrence
.DeterminationEvent
;
32 import eu
.etaxonomy
.cdm
.model
.occurrence
.FieldObservation
;
33 import eu
.etaxonomy
.cdm
.model
.occurrence
.LivingBeing
;
34 import eu
.etaxonomy
.cdm
.model
.occurrence
.Observation
;
35 import eu
.etaxonomy
.cdm
.model
.occurrence
.Specimen
;
36 import eu
.etaxonomy
.cdm
.model
.occurrence
.Fossil
;
37 import eu
.etaxonomy
.cdm
.model
.occurrence
.SpecimenOrObservationBase
;
38 import eu
.etaxonomy
.cdm
.model
.taxon
.Synonym
;
39 import eu
.etaxonomy
.cdm
.model
.taxon
.Taxon
;
40 import eu
.etaxonomy
.cdm
.model
.taxon
.TaxonBase
;
41 import eu
.etaxonomy
.cdm
.model
.view
.AuditEvent
;
42 import eu
.etaxonomy
.cdm
.persistence
.dao
.QueryParseException
;
43 import eu
.etaxonomy
.cdm
.persistence
.dao
.common
.ISearchableDao
;
44 import eu
.etaxonomy
.cdm
.persistence
.dao
.hibernate
.common
.IdentifiableDaoBase
;
45 import eu
.etaxonomy
.cdm
.persistence
.dao
.hibernate
.taxon
.TaxonDaoHibernateImpl
;
46 import eu
.etaxonomy
.cdm
.persistence
.dao
.occurrence
.IOccurrenceDao
;
47 import eu
.etaxonomy
.cdm
.persistence
.query
.OrderHint
;
50 * @author a.babadshanjan
54 public class OccurrenceDaoHibernateImpl
extends IdentifiableDaoBase
<SpecimenOrObservationBase
> implements IOccurrenceDao
{
56 @SuppressWarnings("unused")
57 private static final Logger logger
= Logger
.getLogger(TaxonDaoHibernateImpl
.class);
59 private static final String defaultField
= "titleCache";
60 private Class
<?
extends SpecimenOrObservationBase
> indexedClasses
[];
62 public OccurrenceDaoHibernateImpl() {
63 super(SpecimenOrObservationBase
.class);
64 indexedClasses
= new Class
[7];
65 indexedClasses
[0] = FieldObservation
.class;
66 indexedClasses
[1] = DerivedUnit
.class;
67 indexedClasses
[2] = LivingBeing
.class;
68 indexedClasses
[3] = Observation
.class;
69 indexedClasses
[4] = Specimen
.class;
70 indexedClasses
[5] = DnaSample
.class;
71 indexedClasses
[6] = Fossil
.class;
74 public int countDerivationEvents(SpecimenOrObservationBase occurence
) {
75 checkNotInPriorView("OccurrenceDaoHibernateImpl.countDerivationEvents(SpecimenOrObservationBase occurence)");
76 Query query
= getSession().createQuery("select count(distinct derivationEvent) from DerivationEvent derivationEvent join derivationEvent.originals occurence where occurence = :occurence");
77 query
.setParameter("occurence", occurence
);
79 return ((Long
)query
.uniqueResult()).intValue();
82 public int countDeterminations(SpecimenOrObservationBase occurence
) {
83 AuditEvent auditEvent
= getAuditEventFromContext();
84 if(auditEvent
.equals(AuditEvent
.CURRENT_VIEW
)) {
85 Query query
= getSession().createQuery("select count(determination) from DeterminationEvent determination where determination.identifiedUnit = :occurence");
86 query
.setParameter("occurence", occurence
);
87 return ((Long
)query
.uniqueResult()).intValue();
89 AuditQuery query
= getAuditReader().createQuery().forEntitiesAtRevision(DeterminationEvent
.class,auditEvent
.getRevisionNumber());
90 query
.add(AuditEntity
.relatedId("identifiedUnit").eq(occurence
.getId()));
91 query
.addProjection(AuditEntity
.id().count("id"));
93 return ((Long
)query
.getSingleResult()).intValue();
97 public int countMedia(SpecimenOrObservationBase occurence
) {
98 checkNotInPriorView("OccurrenceDaoHibernateImpl.countMedia(SpecimenOrObservationBase occurence)");
99 Query query
= getSession().createQuery("select count(media) from SpecimenOrObservationBase occurence join occurence.media media where occurence = :occurence");
100 query
.setParameter("occurence", occurence
);
102 return ((Long
)query
.uniqueResult()).intValue();
105 public List
<DerivationEvent
> getDerivationEvents(SpecimenOrObservationBase occurence
, Integer pageSize
,Integer pageNumber
, List
<String
> propertyPaths
) {
106 checkNotInPriorView("OccurrenceDaoHibernateImpl.getDerivationEvents(SpecimenOrObservationBase occurence, Integer pageSize,Integer pageNumber)");
107 Query query
= getSession().createQuery("select distinct derivationEvent from DerivationEvent derivationEvent join derivationEvent.originals occurence where occurence = :occurence");
108 query
.setParameter("occurence", occurence
);
110 if(pageSize
!= null) {
111 query
.setMaxResults(pageSize
);
112 if(pageNumber
!= null) {
113 query
.setFirstResult(pageNumber
* pageSize
);
115 query
.setFirstResult(0);
119 List
<DerivationEvent
> result
= (List
<DerivationEvent
>)query
.list();
120 defaultBeanInitializer
.initializeAll(result
, propertyPaths
);
124 public List
<DeterminationEvent
> getDeterminations(SpecimenOrObservationBase occurence
, Integer pageSize
, Integer pageNumber
, List
<String
> propertyPaths
) {
125 AuditEvent auditEvent
= getAuditEventFromContext();
126 if(auditEvent
.equals(AuditEvent
.CURRENT_VIEW
)) {
127 Query query
= getSession().createQuery("select determination from DeterminationEvent determination where determination.identifiedUnit = :occurence");
128 query
.setParameter("occurence", occurence
);
130 if(pageSize
!= null) {
131 query
.setMaxResults(pageSize
);
132 if(pageNumber
!= null) {
133 query
.setFirstResult(pageNumber
* pageSize
);
135 query
.setFirstResult(0);
138 List
<DeterminationEvent
> result
= (List
<DeterminationEvent
>)query
.list();
139 defaultBeanInitializer
.initializeAll(result
, propertyPaths
);
142 AuditQuery query
= getAuditReader().createQuery().forEntitiesAtRevision(DeterminationEvent
.class,auditEvent
.getRevisionNumber());
143 query
.add(AuditEntity
.relatedId("identifiedUnit").eq(occurence
.getId()));
144 if(pageSize
!= null) {
145 query
.setMaxResults(pageSize
);
146 if(pageNumber
!= null) {
147 query
.setFirstResult(pageNumber
* pageSize
);
149 query
.setFirstResult(0);
152 List
<DeterminationEvent
> result
= (List
<DeterminationEvent
>)query
.getResultList();
153 defaultBeanInitializer
.initializeAll(result
, propertyPaths
);
158 public List
<Media
> getMedia(SpecimenOrObservationBase occurence
, Integer pageSize
, Integer pageNumber
, List
<String
> propertyPaths
) {
159 checkNotInPriorView("OccurrenceDaoHibernateImpl.getMedia(SpecimenOrObservationBase occurence, Integer pageSize, Integer pageNumber, List<String> propertyPaths)");
160 Query query
= getSession().createQuery("select media from SpecimenOrObservationBase occurence join occurence.media media where occurence = :occurence");
161 query
.setParameter("occurence", occurence
);
163 if(pageSize
!= null) {
164 query
.setMaxResults(pageSize
);
165 if(pageNumber
!= null) {
166 query
.setFirstResult(pageNumber
* pageSize
);
168 query
.setFirstResult(0);
172 List
<Media
> results
= (List
<Media
>)query
.list();
173 defaultBeanInitializer
.initializeAll(results
, propertyPaths
);
177 public int count(Class clazz
, String queryString
) {
178 checkNotInPriorView("OccurrenceDaoHibernateImpl.count(String queryString, Boolean accepted)");
179 QueryParser queryParser
= new QueryParser(defaultField
, new SimpleAnalyzer());
182 org
.apache
.lucene
.search
.Query query
= queryParser
.parse(queryString
);
184 FullTextSession fullTextSession
= Search
.getFullTextSession(this.getSession());
185 org
.hibernate
.search
.FullTextQuery fullTextQuery
= null;
188 fullTextQuery
= fullTextSession
.createFullTextQuery(query
, type
);
190 fullTextQuery
= fullTextSession
.createFullTextQuery(query
, clazz
);
193 Integer result
= fullTextQuery
.getResultSize();
196 } catch (ParseException e
) {
197 throw new QueryParseException(e
, queryString
);
201 public void optimizeIndex() {
202 FullTextSession fullTextSession
= Search
.getFullTextSession(getSession());
203 SearchFactory searchFactory
= fullTextSession
.getSearchFactory();
204 for(Class clazz
: indexedClasses
) {
205 searchFactory
.optimize(clazz
); // optimize the indices ()
207 fullTextSession
.flushToIndexes();
210 public void purgeIndex() {
211 FullTextSession fullTextSession
= Search
.getFullTextSession(getSession());
212 for(Class clazz
: indexedClasses
) {
213 fullTextSession
.purgeAll(clazz
); // remove all taxon base from indexes
215 fullTextSession
.flushToIndexes();
218 public void rebuildIndex() {
219 FullTextSession fullTextSession
= Search
.getFullTextSession(getSession());
221 for(SpecimenOrObservationBase occurrence
: list(null,null)) { // re-index all taxon base
223 for(DeterminationEvent determination
: (Set
<DeterminationEvent
>)occurrence
.getDeterminations()) {
224 Hibernate
.initialize(determination
.getActor());
225 Hibernate
.initialize(determination
.getTaxon());
227 Hibernate
.initialize(occurrence
.getDefinition());
228 if(occurrence
instanceof DerivedUnitBase
) {
229 DerivedUnitBase derivedUnit
= (DerivedUnitBase
) occurrence
;
230 Hibernate
.initialize(derivedUnit
.getCollection());
231 if(derivedUnit
.getCollection() != null) {
232 Hibernate
.initialize(derivedUnit
.getCollection().getSuperCollection());
233 Hibernate
.initialize(derivedUnit
.getCollection().getInstitute());
235 Hibernate
.initialize(derivedUnit
.getStoredUnder());
236 SpecimenOrObservationBase original
= derivedUnit
.getOriginalUnit();
237 if(original
!= null && original
.isInstanceOf(FieldObservation
.class)) {
238 FieldObservation fieldObservation
= original
.deproxy(original
, FieldObservation
.class);
239 Hibernate
.initialize(fieldObservation
.getGatheringEvent());
240 if(fieldObservation
.getGatheringEvent() != null) {
241 Hibernate
.initialize(fieldObservation
.getGatheringEvent().getActor());
245 fullTextSession
.index(occurrence
);
247 fullTextSession
.flushToIndexes();
250 public List
<SpecimenOrObservationBase
> search(Class
<?
extends SpecimenOrObservationBase
> clazz
, String queryString
,Integer pageSize
, Integer pageNumber
, List
<OrderHint
> orderHints
, List
<String
> propertyPaths
) {
251 checkNotInPriorView("OccurrenceDaoHibernateImpl.searchTaxa(String queryString, Boolean accepted, Integer pageSize, Integer pageNumber)");
252 QueryParser queryParser
= new QueryParser(defaultField
, new SimpleAnalyzer());
253 List
<SpecimenOrObservationBase
> results
= new ArrayList
<SpecimenOrObservationBase
>();
256 org
.apache
.lucene
.search
.Query query
= queryParser
.parse(queryString
);
258 FullTextSession fullTextSession
= Search
.getFullTextSession(getSession());
259 org
.hibernate
.search
.FullTextQuery fullTextQuery
= null;
262 fullTextQuery
= fullTextSession
.createFullTextQuery(query
, SpecimenOrObservationBase
.class);
264 fullTextQuery
= fullTextSession
.createFullTextQuery(query
, clazz
);
267 addOrder(fullTextQuery
,orderHints
);
269 if(pageSize
!= null) {
270 fullTextQuery
.setMaxResults(pageSize
);
271 if(pageNumber
!= null) {
272 fullTextQuery
.setFirstResult(pageNumber
* pageSize
);
274 fullTextQuery
.setFirstResult(0);
278 List
<SpecimenOrObservationBase
> result
= (List
<SpecimenOrObservationBase
>)fullTextQuery
.list();
279 defaultBeanInitializer
.initializeAll(result
, propertyPaths
);
282 } catch (ParseException e
) {
283 throw new QueryParseException(e
, queryString
);
287 public String
suggestQuery(String string
) {
288 throw new UnsupportedOperationException("suggestQuery is not supported for SpecimenOrObservationBase");