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
.reference
;
11 import java
.util
.ArrayList
;
12 import java
.util
.HashSet
;
13 import java
.util
.List
;
15 import java
.util
.UUID
;
17 import org
.apache
.log4j
.Logger
;
18 import org
.hibernate
.Hibernate
;
19 import org
.hibernate
.Query
;
20 import org
.hibernate
.Session
;
21 import org
.hibernate
.search
.FullTextSession
;
22 import org
.hibernate
.search
.Search
;
23 import org
.springframework
.beans
.factory
.annotation
.Qualifier
;
24 import org
.springframework
.stereotype
.Repository
;
26 import eu
.etaxonomy
.cdm
.model
.reference
.IArticle
;
27 import eu
.etaxonomy
.cdm
.model
.reference
.IBookSection
;
28 import eu
.etaxonomy
.cdm
.model
.reference
.IInProceedings
;
29 import eu
.etaxonomy
.cdm
.model
.reference
.IPrintedUnitBase
;
30 import eu
.etaxonomy
.cdm
.model
.reference
.IReport
;
31 import eu
.etaxonomy
.cdm
.model
.reference
.IThesis
;
32 import eu
.etaxonomy
.cdm
.model
.reference
.Reference
;
33 import eu
.etaxonomy
.cdm
.model
.reference
.ReferenceType
;
34 import eu
.etaxonomy
.cdm
.model
.taxon
.TaxonBase
;
35 import eu
.etaxonomy
.cdm
.persistence
.dao
.hibernate
.common
.IdentifiableDaoBase
;
36 import eu
.etaxonomy
.cdm
.persistence
.dao
.reference
.IReferenceDao
;
37 import eu
.etaxonomy
.cdm
.persistence
.dto
.UuidAndTitleCache
;
38 import eu
.etaxonomy
.cdm
.persistence
.query
.OrderHint
;
39 import eu
.etaxonomy
.cdm
.strategy
.cache
.reference
.DefaultReferenceCacheStrategy
;
46 @Qualifier("referenceDaoHibernateImpl")
47 public class ReferenceDaoHibernateImpl
extends IdentifiableDaoBase
<Reference
> implements IReferenceDao
{
48 private static final Logger logger
= Logger
.getLogger(ReferenceDaoHibernateImpl
.class);
50 public ReferenceDaoHibernateImpl() {
51 super(Reference
.class);
55 public void rebuildIndex() {
56 FullTextSession fullTextSession
= Search
.getFullTextSession(getSession());
58 for(Reference reference
: list(null,null)) { // re-index all agents
59 Hibernate
.initialize(reference
.getAuthorship());
61 if(reference
.getType().equals(ReferenceType
.Article
)) {
62 Hibernate
.initialize(((IArticle
)reference
).getInJournal());
63 } else if(reference
.getType().equals(ReferenceType
.BookSection
)) {
64 Hibernate
.initialize(((IBookSection
)reference
).getInBook());
65 } else if(reference
.getType().equals(ReferenceType
.InProceedings
)) {
66 Hibernate
.initialize(((IInProceedings
)reference
).getInProceedings());
67 }else if(reference
.getType().equals(ReferenceType
.Thesis
)) {
68 Hibernate
.initialize(((IThesis
)reference
).getSchool());
69 } else if(reference
.getType().equals(ReferenceType
.Report
)) {
70 Hibernate
.initialize(((IReport
)reference
).getInstitution());
71 } else if(reference
.getType().isPrintedUnit()) {
72 Hibernate
.initialize(((IPrintedUnitBase
)reference
).getInSeries());
74 fullTextSession
.index(reference
);
76 fullTextSession
.flushToIndexes();
80 public List
<UuidAndTitleCache
<Reference
>> getUuidAndTitle(){
81 List
<UuidAndTitleCache
<Reference
>> list
= new ArrayList
<UuidAndTitleCache
<Reference
>>();
82 Session session
= getSession();
84 Query query
= session
.createQuery("select uuid, id, titleCache from " + type
.getSimpleName());
86 @SuppressWarnings("unchecked")
87 List
<Object
[]> result
= query
.list();
89 for(Object
[] object
: result
){
90 list
.add(new UuidAndTitleCache
<Reference
>(type
, (UUID
) object
[0], (Integer
)object
[1], (String
) object
[2]));
97 public List
<UuidAndTitleCache
<Reference
>> getUuidAndTitleCache(Integer limit
, String pattern
) {
98 List
<UuidAndTitleCache
<Reference
>> list
= new ArrayList
<UuidAndTitleCache
<Reference
>>();
99 Session session
= getSession();
101 if (pattern
!= null){
102 query
= session
.createQuery("SELECT " +"r.uuid, r.id, r.titleCache, ab.titleCache FROM " + type
.getSimpleName() + " AS r LEFT OUTER JOIN r.authorship AS ab where r.titleCache like :pattern");
104 query
= session
.createQuery("SELECT " +"r.uuid, r.id, r.titleCache, ab.titleCache FROM " + type
.getSimpleName() + " AS r LEFT OUTER JOIN r.authorship AS ab ");//"select uuid, titleCache from " + type.getSimpleName());
108 query
.setMaxResults(limit
);
110 if (pattern
!= null){
111 pattern
= pattern
.replace("*", "%");
112 pattern
= pattern
.replace("?", "_");
113 pattern
= pattern
+ "%";
114 query
.setParameter("pattern", pattern
);
116 @SuppressWarnings("unchecked")
117 List
<Object
[]> result
= query
.list();
119 for(Object
[] object
: result
){
120 String referenceTitle
= (String
) object
[2];
122 if(referenceTitle
!= null){
123 String teamTitle
= (String
) object
[3];
124 referenceTitle
= DefaultReferenceCacheStrategy
.putAuthorToEndOfString(referenceTitle
, teamTitle
);
126 list
.add(new UuidAndTitleCache
<Reference
>(Reference
.class, (UUID
) object
[0],(Integer
)object
[1], referenceTitle
));
128 logger
.error("title cache of reference is null. UUID: " + object
[0]);
136 public List
<Reference
> getAllReferencesForPublishing(){
137 @SuppressWarnings("unchecked")
138 List
<Reference
> references
= getSession().createQuery("SELECT r FROM Reference r "+
140 "(SELECT m.markedObj.id FROM Marker m WHERE "+
141 "m.markerType.id = "+
142 "(SELECT dtb.id FROM DefinedTermBase dtb, Representation r WHERE r MEMBER OF dtb.representations AND r.text='publish'))").list();
147 public List
<Reference
> getAllNotNomenclaturalReferencesForPublishing(){
149 @SuppressWarnings("unchecked")
150 List
<Reference
> references
= getSession().createQuery("select t.nomenclaturalReference from TaxonNameBase t").list();
151 String queryString
= "from Reference b where b not in (:referenceList) and b in (:publish)" ;
152 Query referenceQuery
= getSession().createQuery(queryString
).setParameterList("referenceList", references
);
153 referenceQuery
.setParameterList("publish", getAllReferencesForPublishing());
154 @SuppressWarnings("unchecked")
155 List
<Reference
> resultRefernces
=referenceQuery
.list();
157 return resultRefernces
;
160 // the result list held doubles therefore I put a "distinct" in the query string
162 public List
<Reference
> getAllNomenclaturalReferences() {
163 @SuppressWarnings("unchecked")
164 List
<Reference
> references
= getSession().createQuery(
165 "SELECT DISTINCT t.nomenclaturalReference FROM TaxonNameBase t").list();
171 public List
<Reference
> getSubordinateReferences(Reference reference
) {
173 List
<Reference
> references
= new ArrayList();
174 List
<Reference
> subordinateReferences
= new ArrayList
<Reference
>();
176 Query query
= getSession().createQuery("select r from Reference r where r.inReference = (:reference)");
177 query
.setParameter("reference", reference
);
179 @SuppressWarnings("unchecked")
180 List
<Reference
> list
= query
.list();
181 references
.addAll(list
);
182 for(Reference ref
: references
){
183 subordinateReferences
.addAll(getSubordinateReferences(ref
));
185 references
.addAll(subordinateReferences
);
190 public List
<TaxonBase
> listCoveredTaxa(Reference reference
, boolean includeSubordinateReferences
, List
<OrderHint
> orderHints
, List
<String
> propertyPaths
) {
193 * <li>taxon.name.nomenclaturalreference</li>
194 * <li>taxon.descriptions.descriptionElement.sources.citation</li>
195 * <li>taxon.descriptions.descriptionSources</li>
196 * <li>taxon.name.descriptions.descriptionElement.sources</li>
197 * <li>taxon.name.descriptions.descriptionSources</li>
200 //TODO implement search in nameDescriptions
201 Set
<Reference
> referenceSet
= new HashSet
<Reference
>();
202 referenceSet
.add(reference
);
203 if(includeSubordinateReferences
){
204 referenceSet
.addAll(getSubordinateReferences(reference
));
208 StringBuilder taxonDescriptionSql
= new StringBuilder();
209 taxonDescriptionSql
.append(
210 "select distinct t from Taxon t " +
212 "left join t.descriptions td " +
213 "left join td.descriptionSources td_s " +
214 "left join td.descriptionElements td_e " +
215 "left join td_e.sources td_e_s " +
216 // TaxonNameDescription
217 "left join t.name n " +
218 "left join n.descriptions nd " +
219 "left join nd.descriptionSources nd_s " +
220 "left join nd.descriptionElements nd_e " +
221 "left join nd_e.sources nd_e_s " +
223 "where td_e_s.citation in (:referenceBase_1) " +
224 "or td_s in (:referenceBase_2) " +
225 "or nd_e_s.citation in (:referenceBase_3) " +
226 "or nd_s in (:referenceBase_4) or " +
227 "n.nomenclaturalReference in (:referenceBase_5) or " +
228 "t.sec in (:referenceBase_6)"
231 if (orderHints
!= null && orderHints
.size() > 0){
232 taxonDescriptionSql
.append(" order by ");
234 for (OrderHint hint
: orderHints
) {
236 taxonDescriptionSql
.append(", ");
238 taxonDescriptionSql
.append("t.").append(hint
.toHql());
246 Query query
= getSession().createQuery(taxonDescriptionSql
.toString());
247 query
.setParameterList("referenceBase_1", referenceSet
);
248 query
.setParameterList("referenceBase_2", referenceSet
);
249 query
.setParameterList("referenceBase_3", referenceSet
);
250 query
.setParameterList("referenceBase_4", referenceSet
);
251 query
.setParameterList("referenceBase_5", referenceSet
);
252 query
.setParameterList("referenceBase_6", referenceSet
);
254 @SuppressWarnings("unchecked")
255 List
<TaxonBase
> taxonBaseList
= query
.list();
257 defaultBeanInitializer
.initializeAll(taxonBaseList
, propertyPaths
);
259 return taxonBaseList
;