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.
9 package eu
.etaxonomy
.cdm
.persistence
.dao
.hibernate
.taxon
;
11 import java
.util
.ArrayList
;
12 import java
.util
.Collections
;
13 import java
.util
.HashSet
;
14 import java
.util
.Iterator
;
15 import java
.util
.List
;
17 import java
.util
.UUID
;
19 import org
.apache
.log4j
.Logger
;
20 import org
.apache
.lucene
.analysis
.SimpleAnalyzer
;
21 import org
.apache
.lucene
.queryParser
.ParseException
;
22 import org
.apache
.lucene
.queryParser
.QueryParser
;
23 import org
.apache
.lucene
.search
.Sort
;
24 import org
.apache
.lucene
.search
.SortField
;
25 import org
.hibernate
.Criteria
;
26 import org
.hibernate
.FetchMode
;
27 import org
.hibernate
.Hibernate
;
28 import org
.hibernate
.LazyInitializationException
;
29 import org
.hibernate
.Query
;
30 import org
.hibernate
.Transaction
;
31 import org
.hibernate
.criterion
.Criterion
;
32 import org
.hibernate
.criterion
.Projections
;
33 import org
.hibernate
.criterion
.Restrictions
;
34 import org
.hibernate
.envers
.query
.AuditEntity
;
35 import org
.hibernate
.envers
.query
.AuditQuery
;
36 import org
.hibernate
.search
.FullTextQuery
;
37 import org
.hibernate
.search
.FullTextSession
;
38 import org
.hibernate
.search
.Search
;
39 import org
.hibernate
.search
.SearchFactory
;
40 import org
.springframework
.beans
.factory
.annotation
.Autowired
;
41 import org
.springframework
.beans
.factory
.annotation
.Qualifier
;
42 import org
.springframework
.dao
.DataAccessException
;
43 import org
.springframework
.stereotype
.Repository
;
45 import eu
.etaxonomy
.cdm
.model
.common
.Annotation
;
46 import eu
.etaxonomy
.cdm
.model
.common
.Extension
;
47 import eu
.etaxonomy
.cdm
.model
.common
.Marker
;
48 import eu
.etaxonomy
.cdm
.model
.common
.OriginalSource
;
49 import eu
.etaxonomy
.cdm
.model
.common
.RelationshipBase
;
50 import eu
.etaxonomy
.cdm
.model
.location
.WaterbodyOrCountry
;
51 import eu
.etaxonomy
.cdm
.model
.media
.Rights
;
52 import eu
.etaxonomy
.cdm
.model
.name
.Rank
;
53 import eu
.etaxonomy
.cdm
.model
.name
.TaxonNameBase
;
54 import eu
.etaxonomy
.cdm
.model
.occurrence
.Collection
;
55 import eu
.etaxonomy
.cdm
.model
.occurrence
.DeterminationEvent
;
56 import eu
.etaxonomy
.cdm
.model
.reference
.ReferenceBase
;
57 import eu
.etaxonomy
.cdm
.model
.taxon
.Synonym
;
58 import eu
.etaxonomy
.cdm
.model
.taxon
.SynonymRelationship
;
59 import eu
.etaxonomy
.cdm
.model
.taxon
.SynonymRelationshipType
;
60 import eu
.etaxonomy
.cdm
.model
.taxon
.Taxon
;
61 import eu
.etaxonomy
.cdm
.model
.taxon
.TaxonBase
;
62 import eu
.etaxonomy
.cdm
.model
.taxon
.TaxonRelationship
;
63 import eu
.etaxonomy
.cdm
.model
.taxon
.TaxonRelationshipType
;
64 import eu
.etaxonomy
.cdm
.model
.view
.AuditEvent
;
65 import eu
.etaxonomy
.cdm
.persistence
.dao
.QueryParseException
;
66 import eu
.etaxonomy
.cdm
.persistence
.dao
.common
.ITitledDao
;
67 import eu
.etaxonomy
.cdm
.persistence
.dao
.hibernate
.AlternativeSpellingSuggestionParser
;
68 import eu
.etaxonomy
.cdm
.persistence
.dao
.hibernate
.common
.IdentifiableDaoBase
;
69 import eu
.etaxonomy
.cdm
.persistence
.dao
.taxon
.ITaxonDao
;
70 import eu
.etaxonomy
.cdm
.persistence
.fetch
.CdmFetch
;
87 @Qualifier("taxonDaoHibernateImpl")
88 public class TaxonDaoHibernateImpl
extends IdentifiableDaoBase
<TaxonBase
> implements ITaxonDao
{
89 private AlternativeSpellingSuggestionParser
<TaxonBase
> alternativeSpellingSuggestionParser
;
92 @SuppressWarnings("unused")
93 private static final Logger logger
= Logger
.getLogger(TaxonDaoHibernateImpl
.class);
95 public TaxonDaoHibernateImpl() {
96 super(TaxonBase
.class);
99 @Autowired(required
= false) //TODO switched of because it caused problems when starting CdmApplicationController
100 public void setAlternativeSpellingSuggestionParser(AlternativeSpellingSuggestionParser
<TaxonBase
> alternativeSpellingSuggestionParser
) {
101 this.alternativeSpellingSuggestionParser
= alternativeSpellingSuggestionParser
;
105 * @see eu.etaxonomy.cdm.persistence.dao.taxon.ITaxonDao#getRootTaxa(eu.etaxonomy.cdm.model.reference.ReferenceBase)
107 public List
<Taxon
> getRootTaxa(ReferenceBase sec
) {
108 return getRootTaxa(sec
, CdmFetch
.FETCH_CHILDTAXA(), true, false);
112 public TaxonBase
findByUuid(UUID uuid
) {
113 TaxonBase taxonBase
= super.findByUuid(uuid
);
114 if(taxonBase
== null)
117 Hibernate
.initialize(taxonBase
.getName());
118 Hibernate
.initialize(taxonBase
.getSec());
124 * @see eu.etaxonomy.cdm.persistence.dao.taxon.ITaxonDao#getRootTaxa(eu.etaxonomy.cdm.model.reference.ReferenceBase, eu.etaxonomy.cdm.persistence.fetch.CdmFetch, java.lang.Boolean, java.lang.Boolean)
126 public List
<Taxon
> getRootTaxa(ReferenceBase sec
, CdmFetch cdmFetch
, Boolean onlyWithChildren
, Boolean withMisapplications
) {
127 checkNotInPriorView("TaxonDaoHibernateImpl.getRootTaxa(ReferenceBase sec, CdmFetch cdmFetch, Boolean onlyWithChildren, Boolean withMisapplications)");
128 if (onlyWithChildren
== null){
129 onlyWithChildren
= true;
131 if (withMisapplications
== null){
132 withMisapplications
= true;
134 if (cdmFetch
== null){
135 cdmFetch
= CdmFetch
.NO_FETCH();
138 // String query = "from Taxon root ";
139 // query += " where root.taxonomicParentCache is NULL ";
141 // query += " AND root.sec.id = :sec ";
143 // Query q = getSession().createQuery(query);
145 // q.setInteger("sec", sec.getId());
148 Criteria crit
= getSession().createCriteria(Taxon
.class);
149 crit
.add(Restrictions
.isNull("taxonomicParentCache"));
151 crit
.add(Restrictions
.eq("sec", sec
) );
154 if (! cdmFetch
.includes(CdmFetch
.FETCH_CHILDTAXA())){
155 logger
.warn("no child taxa fetch");
156 //TODO overwrite LAZY (SELECT) does not work (bug in hibernate?)
157 crit
.setFetchMode("relationsToThisTaxon.fromTaxon", FetchMode
.LAZY
);
160 List
<Taxon
> results
= new ArrayList
<Taxon
>();
161 for(Taxon taxon
: (List
<Taxon
>) crit
.list()){
163 //TODO create restriction instead
164 if (onlyWithChildren
== false || taxon
.hasTaxonomicChildren()){
165 if (withMisapplications
== true || ! taxon
.isMisappliedName()){
173 public List
<TaxonBase
> getTaxaByName(String queryString
, ReferenceBase sec
) {
175 return getTaxaByName(queryString
, true, sec
);
178 public List
<TaxonBase
> getTaxaByName(String queryString
, Boolean accepted
, ReferenceBase sec
) {
179 checkNotInPriorView("TaxonDaoHibernateImpl.getTaxaByName(String name, ReferenceBase sec)");
181 Criteria criteria
= null;
182 if (accepted
== true) {
183 criteria
= getSession().createCriteria(Taxon
.class);
185 criteria
= getSession().createCriteria(Synonym
.class);
188 criteria
.setFetchMode( "name", FetchMode
.JOIN
);
189 criteria
.createAlias("name", "name");
192 // FIXME I don't think that we should be saving objects in get methods
193 if(sec
.getId() == 0){
194 getSession().save(sec
);
196 criteria
.add(Restrictions
.eq("sec", sec
) );
198 if (queryString
!= null) {
199 criteria
.add(Restrictions
.ilike("name.nameCache", queryString
));
202 return (List
<TaxonBase
>)criteria
.list();
205 public List
<TaxonBase
> getAllTaxonBases(Integer pagesize
, Integer page
) {
206 return super.list(pagesize
, page
);
209 public List
<Synonym
> getAllSynonyms(Integer limit
, Integer start
) {
210 return super.list(Synonym
.class, limit
, start
);
213 public List
<Taxon
> getAllTaxa(Integer limit
, Integer start
) {
214 return super.list(Taxon
.class, limit
, start
);
217 public List
<RelationshipBase
> getAllRelationships(Integer limit
, Integer start
) {
218 AuditEvent auditEvent
= getAuditEventFromContext();
219 if(auditEvent
.equals(AuditEvent
.CURRENT_VIEW
)) {
220 Criteria criteria
= getSession().createCriteria(RelationshipBase
.class);
221 return (List
<RelationshipBase
>)criteria
.list();
223 AuditQuery query
= getAuditReader().createQuery().forEntitiesAtRevision(RelationshipBase
.class,auditEvent
.getRevisionNumber());
224 return (List
<RelationshipBase
>)query
.getResultList();
229 public UUID
delete(TaxonBase taxonBase
) throws DataAccessException
{
230 if (taxonBase
== null){
231 logger
.warn("TaxonBase was 'null'");
235 // Merge the object in if it is detached
237 // I think this is preferable to catching lazy initialization errors
238 // as that solution only swallows and hides the exception, but doesn't
239 // actually solve it.
240 getSession().merge(taxonBase
);
242 for(Iterator
<Annotation
> iterator
= taxonBase
.getAnnotations().iterator(); iterator
.hasNext();) {
243 Annotation annotation
= iterator
.next();
244 annotation
.setAnnotatedObj(null);
246 getSession().delete(annotation
);
249 for(Iterator
<Marker
> iterator
= taxonBase
.getMarkers().iterator(); iterator
.hasNext();) {
250 Marker marker
= iterator
.next();
251 marker
.setMarkedObj(null);
253 getSession().delete(marker
);
256 for(Iterator
<Extension
> iterator
= taxonBase
.getExtensions().iterator(); iterator
.hasNext();) {
257 Extension extension
= iterator
.next();
258 extension
.setExtendedObj(null);
260 getSession().delete(extension
);
263 for(Iterator
<OriginalSource
> iterator
= taxonBase
.getSources().iterator(); iterator
.hasNext();) {
264 OriginalSource source
= iterator
.next();
265 source
.setSourcedObj(null);
267 getSession().delete(source
);
270 for(Iterator
<Rights
> iterator
= taxonBase
.getRights().iterator(); iterator
.hasNext();) {
271 Rights rights
= iterator
.next();
273 getSession().delete(rights
);
276 if (taxonBase
instanceof Taxon
){ // is Taxon
278 Taxon taxon
= (Taxon
)taxonBase
;
280 for (Iterator
<TaxonRelationship
> iterator
= taxon
.getRelationsFromThisTaxon().iterator(); iterator
.hasNext();){
281 TaxonRelationship relationToThisTaxon
= iterator
.next();
283 relationToThisTaxon
.setFromTaxon(null);
284 relationToThisTaxon
.setToTaxon(null);
285 getSession().delete(relationToThisTaxon
);
288 for (Iterator
<TaxonRelationship
> iterator
= taxon
.getRelationsToThisTaxon().iterator(); iterator
.hasNext();){
289 TaxonRelationship relationFromThisTaxon
= iterator
.next();
291 relationFromThisTaxon
.setToTaxon(null);
292 relationFromThisTaxon
.setFromTaxon(null);
293 getSession().delete(relationFromThisTaxon
);
296 //SynonymRelationships
297 for (Iterator
<SynonymRelationship
> iterator
= taxon
.getSynonymRelations().iterator(); iterator
.hasNext();){
298 SynonymRelationship synonymRelation
= iterator
.next();
300 synonymRelation
.setAcceptedTaxon(null);
301 synonymRelation
.setSynonym(null);
302 getSession().delete(synonymRelation
);
304 } else if (taxonBase
instanceof Synonym
){ //is Synonym
305 Synonym synonym
= (Synonym
)taxonBase
;
306 for (Iterator
<SynonymRelationship
> iterator
= synonym
.getSynonymRelations().iterator(); iterator
.hasNext();){
307 SynonymRelationship synonymRelation
= iterator
.next();
309 synonymRelation
.setAcceptedTaxon(null);
310 synonymRelation
.setSynonym(null);
313 return super.delete(taxonBase
);
317 // TODO add generic return type !!
318 public List
findByName(String queryString
, ITitledDao
.MATCH_MODE matchMode
, int page
, int pagesize
, boolean onlyAcccepted
) {
319 ArrayList
<Criterion
> criteria
= new ArrayList
<Criterion
>();
320 //TODO ... Restrictions.eq(propertyName, value)
321 return super.findByTitle(queryString
, matchMode
, page
, pagesize
, criteria
);
325 public int countMatchesByName(String queryString
, ITitledDao
.MATCH_MODE matchMode
, boolean onlyAcccepted
) {
326 checkNotInPriorView("TaxonDaoHibernateImpl.countMatchesByName(String queryString, ITitledDao.MATCH_MODE matchMode, boolean onlyAcccepted)");
327 Criteria crit
= getSession().createCriteria(type
);
328 crit
.add(Restrictions
.ilike("titleCache", matchMode
.queryStringFrom(queryString
)));
329 crit
.setProjection(Projections
.rowCount());
330 int result
= ((Integer
)crit
.list().get(0)).intValue();
335 public int countMatchesByName(String queryString
, ITitledDao
.MATCH_MODE matchMode
, boolean onlyAcccepted
, List
<Criterion
> criteria
) {
336 checkNotInPriorView("TaxonDaoHibernateImpl.countMatchesByName(String queryString, ITitledDao.MATCH_MODE matchMode, boolean onlyAcccepted, List<Criterion> criteria)");
337 Criteria crit
= getSession().createCriteria(type
);
338 crit
.add(Restrictions
.ilike("titleCache", matchMode
.queryStringFrom(queryString
)));
339 if(criteria
!= null){
340 for (Criterion criterion
: criteria
) {
344 crit
.setProjection(Projections
.rowCount());
345 int result
= ((Integer
)crit
.list().get(0)).intValue();
349 public int countRelatedTaxa(Taxon taxon
, TaxonRelationshipType type
) {
350 AuditEvent auditEvent
= getAuditEventFromContext();
351 if(auditEvent
.equals(AuditEvent
.CURRENT_VIEW
)) {
355 query
= getSession().createQuery("select count(taxonRelationship) from TaxonRelationship taxonRelationship where taxonRelationship.relatedTo = :relatedTo");
357 query
= getSession().createQuery("select count(taxonRelationship) from TaxonRelationship taxonRelationship where taxonRelationship.relatedTo = :relatedTo and taxonRelationship.type = :type");
358 query
.setParameter("type",type
);
361 query
.setParameter("relatedTo", taxon
);
363 return ((Long
)query
.uniqueResult()).intValue();
365 AuditQuery query
= getAuditReader().createQuery().forEntitiesAtRevision(TaxonRelationship
.class,auditEvent
.getRevisionNumber());
366 query
.add(AuditEntity
.relatedId("relatedTo").eq(taxon
.getId()));
367 query
.addProjection(AuditEntity
.id().count("id"));
370 query
.add(AuditEntity
.relatedId("type").eq(type
.getId()));
373 return ((Long
)query
.getSingleResult()).intValue();
377 public int countSynonyms(Taxon taxon
, SynonymRelationshipType type
) {
378 AuditEvent auditEvent
= getAuditEventFromContext();
379 if(auditEvent
.equals(AuditEvent
.CURRENT_VIEW
)) {
383 query
= getSession().createQuery("select count(synonymRelationship) from SynonymRelationship synonymRelationship where synonymRelationship.relatedTo = :relatedTo");
385 query
= getSession().createQuery("select count(synonymRelationship) from SynonymRelationship synonymRelationship where synonymRelationship.relatedTo = :relatedTo and synonymRelationship.type = :type");
386 query
.setParameter("type",type
);
389 query
.setParameter("relatedTo", taxon
);
391 return ((Long
)query
.uniqueResult()).intValue();
393 AuditQuery query
= getAuditReader().createQuery().forEntitiesAtRevision(SynonymRelationship
.class,auditEvent
.getRevisionNumber());
394 query
.add(AuditEntity
.relatedId("relatedTo").eq(taxon
.getId()));
395 query
.addProjection(AuditEntity
.id().count("id"));
398 query
.add(AuditEntity
.relatedId("type").eq(type
.getId()));
401 return ((Long
)query
.getSingleResult()).intValue();
405 public int countTaxa(String queryString
, Boolean accepted
) {
406 checkNotInPriorView("TaxonDaoHibernateImpl.countTaxa(String queryString, Boolean accepted)");
407 QueryParser queryParser
= new QueryParser("name.titleCache", new SimpleAnalyzer());
410 org
.apache
.lucene
.search
.Query query
= queryParser
.parse(queryString
);
412 FullTextSession fullTextSession
= Search
.createFullTextSession(this.getSession());
413 org
.hibernate
.search
.FullTextQuery fullTextQuery
= null;
415 if(accepted
== null) {
416 fullTextQuery
= fullTextSession
.createFullTextQuery(query
, TaxonBase
.class);
419 fullTextQuery
= fullTextSession
.createFullTextQuery(query
, Taxon
.class);
421 fullTextQuery
= fullTextSession
.createFullTextQuery(query
, Synonym
.class);
425 Integer result
= fullTextQuery
.getResultSize();
428 } catch (ParseException e
) {
429 throw new QueryParseException(e
, queryString
);
433 public int countTaxaByName(String queryString
, Boolean accepted
, ReferenceBase sec
) {
434 checkNotInPriorView("TaxonDaoHibernateImpl.countTaxaByName(String queryString, Boolean accepted, ReferenceBase sec)");
435 Criteria criteria
= null;
437 if (accepted
== true) {
438 criteria
= getSession().createCriteria(Taxon
.class);
440 criteria
= getSession().createCriteria(Synonym
.class);
443 criteria
.setFetchMode( "name", FetchMode
.JOIN
);
444 criteria
.createAlias("name", "name");
447 if(sec
.getId() == 0){
448 getSession().save(sec
);
450 criteria
.add(Restrictions
.eq("sec", sec
) );
452 if (queryString
!= null) {
453 criteria
.add(Restrictions
.ilike("name.nameCache", queryString
));
455 criteria
.setProjection(Projections
.projectionList().add(Projections
.rowCount()));
457 return (Integer
)criteria
.uniqueResult();
460 public int countTaxaByName(Boolean accepted
, String genusOrUninomial
, String infraGenericEpithet
, String specificEpithet
, String infraSpecificEpithet
, Rank rank
) {
461 checkNotInPriorView("TaxonDaoHibernateImpl.countTaxaByName(Boolean accepted, String genusOrUninomial, String infraGenericEpithet, String specificEpithet, String infraSpecificEpithet, Rank rank)");
462 Criteria criteria
= null;
464 if(accepted
== null) {
465 criteria
= getSession().createCriteria(TaxonBase
.class);
468 criteria
= getSession().createCriteria(Taxon
.class);
470 criteria
= getSession().createCriteria(Synonym
.class);
474 criteria
.setFetchMode( "name", FetchMode
.JOIN
);
475 criteria
.createAlias("name", "name");
477 if(genusOrUninomial
!= null) {
478 criteria
.add(Restrictions
.eq("name.genusOrUninomial", genusOrUninomial
));
481 if(infraGenericEpithet
!= null) {
482 criteria
.add(Restrictions
.eq("name.infraGenericEpithet", infraGenericEpithet
));
485 if(specificEpithet
!= null) {
486 criteria
.add(Restrictions
.eq("name.specificEpithet", specificEpithet
));
489 if(infraSpecificEpithet
!= null) {
490 criteria
.add(Restrictions
.eq("name.infraSpecificEpithet", infraSpecificEpithet
));
494 criteria
.add(Restrictions
.eq("name.rank", rank
));
497 criteria
.setProjection(Projections
.projectionList().add(Projections
.rowCount()));
499 return (Integer
)criteria
.uniqueResult();
502 public List
<TaxonBase
> findTaxaByName(Boolean accepted
, String genusOrUninomial
, String infraGenericEpithet
, String specificEpithet
, String infraSpecificEpithet
, Rank rank
, Integer pageSize
, Integer pageNumber
) {
503 checkNotInPriorView("TaxonDaoHibernateImpl.findTaxaByName(Boolean accepted, String genusOrUninomial, String infraGenericEpithet, String specificEpithet, String infraSpecificEpithet, Rank rank, Integer pageSize, Integer pageNumber)");
504 Criteria criteria
= null;
506 if(accepted
== null) {
507 criteria
= getSession().createCriteria(TaxonBase
.class);
510 criteria
= getSession().createCriteria(Taxon
.class);
512 criteria
= getSession().createCriteria(Synonym
.class);
516 criteria
.setFetchMode( "name", FetchMode
.JOIN
);
517 criteria
.createAlias("name", "name");
519 if(genusOrUninomial
!= null) {
520 criteria
.add(Restrictions
.eq("name.genusOrUninomial", genusOrUninomial
));
523 if(infraGenericEpithet
!= null) {
524 criteria
.add(Restrictions
.eq("name.infraGenericEpithet", infraGenericEpithet
));
526 criteria
.add(Restrictions
.isNull("name.infraGenericEpithet"));
529 if(specificEpithet
!= null) {
530 criteria
.add(Restrictions
.eq("name.specificEpithet", specificEpithet
));
533 if(infraSpecificEpithet
!= null) {
534 criteria
.add(Restrictions
.eq("name.infraSpecificEpithet", infraSpecificEpithet
));
538 criteria
.add(Restrictions
.eq("name.rank", rank
));
541 if(pageSize
!= null) {
542 criteria
.setMaxResults(pageSize
);
543 if(pageNumber
!= null) {
544 criteria
.setFirstResult(pageNumber
* pageSize
);
546 criteria
.setFirstResult(0);
550 return (List
<TaxonBase
>)criteria
.list();
553 public List
<TaxonRelationship
> getRelatedTaxa(Taxon taxon
, TaxonRelationshipType type
, Integer pageSize
, Integer pageNumber
) {
554 AuditEvent auditEvent
= getAuditEventFromContext();
555 if(auditEvent
.equals(AuditEvent
.CURRENT_VIEW
)) {
559 query
= getSession().createQuery("select taxonRelationship from TaxonRelationship taxonRelationship join fetch taxonRelationship.relatedFrom where taxonRelationship.relatedTo = :relatedTo");
561 query
= getSession().createQuery("select taxonRelationship from TaxonRelationship taxonRelationship join fetch taxonRelationship.relatedFrom where taxonRelationship.relatedTo = :relatedTo and taxonRelationship.type = :type");
562 query
.setParameter("type",type
);
565 query
.setParameter("relatedTo", taxon
);
567 if(pageSize
!= null) {
568 query
.setMaxResults(pageSize
);
569 if(pageNumber
!= null) {
570 query
.setFirstResult(pageNumber
* pageSize
);
572 query
.setFirstResult(0);
576 return (List
<TaxonRelationship
>)query
.list();
578 AuditQuery query
= getAuditReader().createQuery().forEntitiesAtRevision(TaxonRelationship
.class,auditEvent
.getRevisionNumber());
579 query
.add(AuditEntity
.relatedId("relatedTo").eq(taxon
.getId()));
582 query
.add(AuditEntity
.relatedId("type").eq(type
.getId()));
585 if(pageSize
!= null) {
586 query
.setMaxResults(pageSize
);
587 if(pageNumber
!= null) {
588 query
.setFirstResult(pageNumber
* pageSize
);
590 query
.setFirstResult(0);
594 List
<TaxonRelationship
> result
= (List
<TaxonRelationship
>)query
.getResultList();
595 for(TaxonRelationship relationship
: result
) {
596 Hibernate
.initialize(relationship
.getFromTaxon());
603 public List
<SynonymRelationship
> getSynonyms(Taxon taxon
, SynonymRelationshipType type
, Integer pageSize
, Integer pageNumber
) {
604 AuditEvent auditEvent
= getAuditEventFromContext();
605 if(auditEvent
.equals(AuditEvent
.CURRENT_VIEW
)) {
609 query
= getSession().createQuery("select synonymRelationship from SynonymRelationship synonymRelationship join fetch synonymRelationship.relatedFrom where synonymRelationship.relatedTo = :relatedTo");
611 query
= getSession().createQuery("select synonymRelationship from SynonymRelationship synonymRelationship join fetch synonymRelationship.relatedFrom where synonymRelationship.relatedTo = :relatedTo and synonymRelationship.type = :type");
612 query
.setParameter("type",type
);
615 query
.setParameter("relatedTo", taxon
);
617 if(pageSize
!= null) {
618 query
.setMaxResults(pageSize
);
619 if(pageNumber
!= null) {
620 query
.setFirstResult(pageNumber
* pageSize
);
622 query
.setFirstResult(0);
626 return (List
<SynonymRelationship
>)query
.list();
628 AuditQuery query
= getAuditReader().createQuery().forEntitiesAtRevision(SynonymRelationship
.class,auditEvent
.getRevisionNumber());
629 query
.add(AuditEntity
.relatedId("relatedTo").eq(taxon
.getId()));
632 query
.add(AuditEntity
.relatedId("type").eq(type
.getId()));
635 if(pageSize
!= null) {
636 query
.setMaxResults(pageSize
);
637 if(pageNumber
!= null) {
638 query
.setFirstResult(pageNumber
* pageSize
);
640 query
.setFirstResult(0);
644 List
<SynonymRelationship
> result
= (List
<SynonymRelationship
>)query
.getResultList();
645 for(SynonymRelationship relationship
: result
) {
646 Hibernate
.initialize(relationship
.getSynonym());
653 public List
<TaxonBase
> searchTaxa(String queryString
, Boolean accepted
, Integer pageSize
, Integer pageNumber
) {
654 checkNotInPriorView("TaxonDaoHibernateImpl.searchTaxa(String queryString, Boolean accepted, Integer pageSize, Integer pageNumber)");
655 QueryParser queryParser
= new QueryParser("name.titleCache", new SimpleAnalyzer());
656 List
<TaxonBase
> results
= new ArrayList
<TaxonBase
>();
659 org
.apache
.lucene
.search
.Query query
= queryParser
.parse(queryString
);
661 FullTextSession fullTextSession
= Search
.createFullTextSession(getSession());
662 org
.hibernate
.search
.FullTextQuery fullTextQuery
= null;
663 Criteria criteria
= null;
665 if(accepted
== null) {
666 fullTextQuery
= fullTextSession
.createFullTextQuery(query
, TaxonBase
.class);
667 criteria
= getSession().createCriteria( TaxonBase
.class );
670 fullTextQuery
= fullTextSession
.createFullTextQuery(query
, Taxon
.class);
671 criteria
= getSession().createCriteria( Taxon
.class );
673 fullTextQuery
= fullTextSession
.createFullTextQuery(query
, Synonym
.class);
674 criteria
= getSession().createCriteria( Synonym
.class );
678 org
.apache
.lucene
.search
.Sort sort
= new Sort(new SortField("name.titleCache_forSort"));
679 fullTextQuery
.setSort(sort
);
681 criteria
.setFetchMode( "name", FetchMode
.JOIN
);
682 fullTextQuery
.setCriteriaQuery(criteria
);
684 if(pageSize
!= null) {
685 fullTextQuery
.setMaxResults(pageSize
);
686 if(pageNumber
!= null) {
687 fullTextQuery
.setFirstResult(pageNumber
* pageSize
);
689 fullTextQuery
.setFirstResult(0);
693 return (List
<TaxonBase
>)fullTextQuery
.list();
695 } catch (ParseException e
) {
696 throw new QueryParseException(e
, queryString
);
700 public void purgeIndex() {
701 FullTextSession fullTextSession
= Search
.createFullTextSession(getSession());
703 fullTextSession
.purgeAll(type
); // remove all taxon base from indexes
704 // fullTextSession.flushToIndexes() not implemented in 3.0.0.GA
707 public void rebuildIndex() {
708 FullTextSession fullTextSession
= Search
.createFullTextSession(getSession());
710 for(TaxonBase taxonBase
: list(null,null)) { // re-index all taxon base
711 Hibernate
.initialize(taxonBase
.getName());
712 fullTextSession
.index(taxonBase
);
714 // fullTextSession.flushToIndexes() not implemented in 3.0.0.GA
717 public void optimizeIndex() {
718 FullTextSession fullTextSession
= Search
.createFullTextSession(getSession());
719 SearchFactory searchFactory
= fullTextSession
.getSearchFactory();
720 searchFactory
.optimize(type
); // optimize the indices ()
721 // fullTextSession.flushToIndexes() not implemented in 3.0.0.GA
724 public String
suggestQuery(String queryString
) {
725 checkNotInPriorView("TaxonDaoHibernateImpl.suggestQuery(String queryString)");
726 String alternativeQueryString
= null;
727 if (alternativeSpellingSuggestionParser
!= null) {
730 alternativeSpellingSuggestionParser
.parse(queryString
);
731 org
.apache
.lucene
.search
.Query alternativeQuery
= alternativeSpellingSuggestionParser
732 .suggest(queryString
);
733 if (alternativeQuery
!= null) {
734 alternativeQueryString
= alternativeQuery
735 .toString("name.titleCache");
738 } catch (ParseException e
) {
739 throw new QueryParseException(e
, queryString
);
742 return alternativeQueryString
;