b57e6af0c6bf7fdd31636faf785e191bda96559c
[cdmlib.git] / cdmlib-persistence / src / main / java / eu / etaxonomy / cdm / persistence / dao / hibernate / reference / ReferenceDaoHibernateImpl.java
1 /**
2 * Copyright (C) 2007 EDIT
3 * European Distributed Institute of Taxonomy
4 * http://www.e-taxonomy.eu
5 *
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.
8 */
9 package eu.etaxonomy.cdm.persistence.dao.hibernate.reference;
10
11 import java.util.ArrayList;
12 import java.util.List;
13 import java.util.UUID;
14
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;
27
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;
59
60 /**
61 * @author a.mueller
62 *
63 */
64 @Repository
65 @Qualifier("referenceDaoHibernateImpl")
66 public class ReferenceDaoHibernateImpl extends IdentifiableDaoBase<ReferenceBase> implements IReferenceDao {
67
68 private String defaultField = "titleCache";
69 private Class<? extends ReferenceBase> indexedClasses[];
70
71 @SuppressWarnings("unused")
72 private static final Logger logger = Logger.getLogger(ReferenceDaoHibernateImpl.class);
73
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;*/
92 }
93
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());
97
98 try {
99 org.apache.lucene.search.Query query = queryParser.parse(queryString);
100
101 FullTextSession fullTextSession = Search.getFullTextSession(this.getSession());
102 org.hibernate.search.FullTextQuery fullTextQuery = null;
103
104 if(clazz == null) {
105 fullTextQuery = fullTextSession.createFullTextQuery(query, type);
106 } else {
107 fullTextQuery = fullTextSession.createFullTextQuery(query, clazz);
108 }
109
110 Integer result = fullTextQuery.getResultSize();
111 return result;
112
113 } catch (ParseException e) {
114 throw new QueryParseException(e, queryString);
115 }
116 }
117
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 ()
123 }
124 fullTextSession.flushToIndexes();
125 }
126
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
131 }
132 fullTextSession.flushToIndexes();
133 }
134
135 public void rebuildIndex() {
136 FullTextSession fullTextSession = Search.getFullTextSession(getSession());
137
138 for(ReferenceBase reference : list(null,null)) { // re-index all agents
139 Hibernate.initialize(reference.getAuthorTeam());
140
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());
153 }
154 fullTextSession.index(reference);
155 }
156 fullTextSession.flushToIndexes();
157 }
158
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>();
163
164 try {
165 org.apache.lucene.search.Query query = queryParser.parse(queryString);
166
167 FullTextSession fullTextSession = Search.getFullTextSession(getSession());
168 org.hibernate.search.FullTextQuery fullTextQuery = null;
169
170 if(clazz == null) {
171 fullTextQuery = fullTextSession.createFullTextQuery(query, type);
172 } else {
173 fullTextQuery = fullTextSession.createFullTextQuery(query, clazz);
174 }
175
176 addOrder(fullTextQuery,orderHints);
177
178 if(pageSize != null) {
179 fullTextQuery.setMaxResults(pageSize);
180 if(pageNumber != null) {
181 fullTextQuery.setFirstResult(pageNumber * pageSize);
182 } else {
183 fullTextQuery.setFirstResult(0);
184 }
185 }
186
187 List<ReferenceBase> result = (List<ReferenceBase>)fullTextQuery.list();
188 defaultBeanInitializer.initializeAll(result, propertyPaths);
189 return result;
190
191 } catch (ParseException e) {
192 throw new QueryParseException(e, queryString);
193 }
194 }
195
196 public String suggestQuery(String string) {
197 throw new UnsupportedOperationException("suggestQuery is not supported for ReferenceBase");
198 }
199
200 public List<UuidAndTitleCache<ReferenceBase>> getUuidAndTitle(){
201 List<UuidAndTitleCache<ReferenceBase>> list = new ArrayList<UuidAndTitleCache<ReferenceBase>>();
202 Session session = getSession();
203
204 Query query = session.createQuery("select uuid, title from " + type.getSimpleName());
205
206 List<Object[]> result = query.list();
207
208 for(Object[] object : result){
209 list.add(new UuidAndTitleCache<ReferenceBase>(type, (UUID) object[0], (String) object[1]));
210 }
211
212 return list;
213 }
214
215 public List<ReferenceBase> getAllReferencesForPublishing(){
216 List<ReferenceBase> references = getSession().createQuery("Select r from ReferenceBase r "+
217 "where r.id IN "+
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();
221 return references;
222 }
223
224 public List<ReferenceBase> getAllNotNomenclaturalReferencesForPublishing(){
225
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();
231
232 return resultRefernces;
233 }
234 public List<ReferenceBase> getAllNomenclaturalReferences(){
235
236 List<ReferenceBase> references = getSession().createQuery("select t.nomenclaturalReference from TaxonNameBase t").list();
237 return references;
238 }
239 }