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
.List
;
13 import java
.util
.UUID
;
15 import org
.apache
.log4j
.Logger
;
16 import org
.apache
.lucene
.analysis
.SimpleAnalyzer
;
17 import org
.apache
.lucene
.queryParser
.ParseException
;
18 import org
.apache
.lucene
.queryParser
.QueryParser
;
19 import org
.hibernate
.Hibernate
;
20 import org
.hibernate
.Query
;
21 import org
.hibernate
.Session
;
22 import org
.hibernate
.search
.FullTextSession
;
23 import org
.hibernate
.search
.Search
;
24 import org
.hibernate
.search
.SearchFactory
;
25 import org
.springframework
.beans
.factory
.annotation
.Qualifier
;
26 import org
.springframework
.stereotype
.Repository
;
28 import eu
.etaxonomy
.cdm
.model
.common
.UuidAndTitleCache
;
29 /*import eu.etaxonomy.cdm.model.reference.Article;
30 import eu.etaxonomy.cdm.model.reference.Book;
31 import eu.etaxonomy.cdm.model.reference.BookSection;
32 import eu.etaxonomy.cdm.model.reference.CdDvd;
33 import eu.etaxonomy.cdm.model.reference.Database;
34 import eu.etaxonomy.cdm.model.reference.Generic;
35 import eu.etaxonomy.cdm.model.reference.InProceedings;
36 import eu.etaxonomy.cdm.model.reference.Journal;
37 import eu.etaxonomy.cdm.model.reference.Map;
38 import eu.etaxonomy.cdm.model.reference.Patent;
39 import eu.etaxonomy.cdm.model.reference.PersonalCommunication;
40 import eu.etaxonomy.cdm.model.reference.PrintedUnitBase;
41 import eu.etaxonomy.cdm.model.reference.Proceedings;
42 import eu.etaxonomy.cdm.model.reference.PublicationBase;*/
43 import eu
.etaxonomy
.cdm
.model
.reference
.IArticle
;
44 import eu
.etaxonomy
.cdm
.model
.reference
.IBookSection
;
45 import eu
.etaxonomy
.cdm
.model
.reference
.IInProceedings
;
46 import eu
.etaxonomy
.cdm
.model
.reference
.IPrintedUnitBase
;
47 import eu
.etaxonomy
.cdm
.model
.reference
.IReport
;
48 import eu
.etaxonomy
.cdm
.model
.reference
.IThesis
;
49 import eu
.etaxonomy
.cdm
.model
.reference
.ReferenceBase
;
50 import eu
.etaxonomy
.cdm
.model
.reference
.ReferenceType
;
51 /*import eu.etaxonomy.cdm.model.reference.Report;
52 import eu.etaxonomy.cdm.model.reference.SectionBase;
53 import eu.etaxonomy.cdm.model.reference.Thesis;
54 import eu.etaxonomy.cdm.model.reference.WebPage;*/
55 import eu
.etaxonomy
.cdm
.persistence
.dao
.QueryParseException
;
56 import eu
.etaxonomy
.cdm
.persistence
.dao
.hibernate
.common
.IdentifiableDaoBase
;
57 import eu
.etaxonomy
.cdm
.persistence
.dao
.reference
.IReferenceDao
;
58 import eu
.etaxonomy
.cdm
.persistence
.query
.OrderHint
;
65 @Qualifier("referenceDaoHibernateImpl")
66 public class ReferenceDaoHibernateImpl
extends IdentifiableDaoBase
<ReferenceBase
> implements IReferenceDao
{
68 private String defaultField
= "titleCache";
69 private Class
<?
extends ReferenceBase
> indexedClasses
[];
71 @SuppressWarnings("unused")
72 private static final Logger logger
= Logger
.getLogger(ReferenceDaoHibernateImpl
.class);
74 public ReferenceDaoHibernateImpl() {
75 super(ReferenceBase
.class);
76 /*indexedClasses = new Class[15];
77 indexedClasses[0] = Article.class;
78 indexedClasses[1] = Patent.class;
79 indexedClasses[2] = PersonalCommunication.class;
80 indexedClasses[3] = BookSection.class;
81 indexedClasses[4] = InProceedings.class;
82 indexedClasses[5] = CdDvd.class;
83 indexedClasses[6] = Database.class;
84 indexedClasses[7] = Generic.class;
85 indexedClasses[8] = Journal.class;
86 indexedClasses[9] = Map.class;
87 indexedClasses[10] = WebPage.class;
88 indexedClasses[11] = Book.class;
89 indexedClasses[12] = Proceedings.class;
90 indexedClasses[13] = Report.class;
91 indexedClasses[14] = Thesis.class;*/
94 public int count(Class
<?
extends ReferenceBase
> clazz
, String queryString
) {
95 checkNotInPriorView("ReferenceDaoHibernateImpl.count(String queryString, Boolean accepted)");
96 QueryParser queryParser
= new QueryParser(defaultField
, new SimpleAnalyzer());
99 org
.apache
.lucene
.search
.Query query
= queryParser
.parse(queryString
);
101 FullTextSession fullTextSession
= Search
.getFullTextSession(this.getSession());
102 org
.hibernate
.search
.FullTextQuery fullTextQuery
= null;
105 fullTextQuery
= fullTextSession
.createFullTextQuery(query
, type
);
107 fullTextQuery
= fullTextSession
.createFullTextQuery(query
, clazz
);
110 Integer result
= fullTextQuery
.getResultSize();
113 } catch (ParseException e
) {
114 throw new QueryParseException(e
, queryString
);
118 public void optimizeIndex() {
119 FullTextSession fullTextSession
= Search
.getFullTextSession(getSession());
120 SearchFactory searchFactory
= fullTextSession
.getSearchFactory();
121 for(Class clazz
: indexedClasses
) {
122 searchFactory
.optimize(clazz
); // optimize the indices ()
124 fullTextSession
.flushToIndexes();
127 public void purgeIndex() {
128 FullTextSession fullTextSession
= Search
.getFullTextSession(getSession());
129 for(Class clazz
: indexedClasses
) {
130 fullTextSession
.purgeAll(clazz
); // remove all taxon base from indexes
132 fullTextSession
.flushToIndexes();
135 public void rebuildIndex() {
136 FullTextSession fullTextSession
= Search
.getFullTextSession(getSession());
138 for(ReferenceBase reference
: list(null,null)) { // re-index all agents
139 Hibernate
.initialize(reference
.getAuthorTeam());
141 if(reference
.getType().equals(ReferenceType
.Article
)) {
142 Hibernate
.initialize(((IArticle
)reference
).getInJournal());
143 } else if(reference
.getType().equals(ReferenceType
.BookSection
)) {
144 Hibernate
.initialize(((IBookSection
)reference
).getInBook());
145 } else if(reference
.getType().equals(ReferenceType
.InProceedings
)) {
146 Hibernate
.initialize(((IInProceedings
)reference
).getInProceedings());
147 }else if(reference
.getType().equals(ReferenceType
.Thesis
)) {
148 Hibernate
.initialize(((IThesis
)reference
).getSchool());
149 } else if(reference
.getType().equals(ReferenceType
.Report
)) {
150 Hibernate
.initialize(((IReport
)reference
).getInstitution());
151 } else if(reference
.getType().equals(ReferenceType
.PrintedUnitBase
)) {
152 Hibernate
.initialize(((IPrintedUnitBase
)reference
).getInSeries());
154 fullTextSession
.index(reference
);
156 fullTextSession
.flushToIndexes();
159 public List
<ReferenceBase
> search(Class
<?
extends ReferenceBase
> clazz
, String queryString
, Integer pageSize
, Integer pageNumber
,List
<OrderHint
> orderHints
, List
<String
> propertyPaths
) {
160 checkNotInPriorView("ReferenceDaoHibernateImpl.searchTaxa(String queryString, Boolean accepted, Integer pageSize, Integer pageNumber)");
161 QueryParser queryParser
= new QueryParser(defaultField
, new SimpleAnalyzer());
162 List
<ReferenceBase
> results
= new ArrayList
<ReferenceBase
>();
165 org
.apache
.lucene
.search
.Query query
= queryParser
.parse(queryString
);
167 FullTextSession fullTextSession
= Search
.getFullTextSession(getSession());
168 org
.hibernate
.search
.FullTextQuery fullTextQuery
= null;
171 fullTextQuery
= fullTextSession
.createFullTextQuery(query
, type
);
173 fullTextQuery
= fullTextSession
.createFullTextQuery(query
, clazz
);
176 addOrder(fullTextQuery
,orderHints
);
178 if(pageSize
!= null) {
179 fullTextQuery
.setMaxResults(pageSize
);
180 if(pageNumber
!= null) {
181 fullTextQuery
.setFirstResult(pageNumber
* pageSize
);
183 fullTextQuery
.setFirstResult(0);
187 List
<ReferenceBase
> result
= (List
<ReferenceBase
>)fullTextQuery
.list();
188 defaultBeanInitializer
.initializeAll(result
, propertyPaths
);
191 } catch (ParseException e
) {
192 throw new QueryParseException(e
, queryString
);
196 public String
suggestQuery(String string
) {
197 throw new UnsupportedOperationException("suggestQuery is not supported for ReferenceBase");
200 public List
<UuidAndTitleCache
<ReferenceBase
>> getUuidAndTitle(){
201 List
<UuidAndTitleCache
<ReferenceBase
>> list
= new ArrayList
<UuidAndTitleCache
<ReferenceBase
>>();
202 Session session
= getSession();
204 Query query
= session
.createQuery("select uuid, title from " + type
.getSimpleName());
206 List
<Object
[]> result
= query
.list();
208 for(Object
[] object
: result
){
209 list
.add(new UuidAndTitleCache
<ReferenceBase
>(type
, (UUID
) object
[0], (String
) object
[1]));
215 public List
<ReferenceBase
> getAllReferencesForPublishing(){
216 List
<ReferenceBase
> references
= getSession().createQuery("Select r from ReferenceBase r "+
218 "(Select m.markedObj.id from Marker m where "+
219 "m.markerType.id = "+
220 "(Select dtb.id from DefinedTermBase dtb, Representation r where r member of dtb.representations and r.text='publish'))").list();
224 public List
<ReferenceBase
> getAllNotNomenclaturalReferencesForPublishing(){
226 List
<ReferenceBase
> references
= getSession().createQuery("select t.nomenclaturalReference from TaxonNameBase t").list();
227 String queryString
= "from ReferenceBase b where b not in (:referenceList) and b in (:publish)" ;
228 Query referenceQuery
= getSession().createQuery(queryString
).setParameterList("referenceList", references
);
229 referenceQuery
.setParameterList("publish", getAllReferencesForPublishing());
230 List
<ReferenceBase
> resultRefernces
=referenceQuery
.list();
232 return resultRefernces
;
234 public List
<ReferenceBase
> getAllNomenclaturalReferences(){
236 List
<ReferenceBase
> references
= getSession().createQuery("select t.nomenclaturalReference from TaxonNameBase t").list();