6562d57abc5dc752e97b3f27431d1e99f1dcf144
[cdmlib.git] / cdmlib-persistence / src / main / java / eu / etaxonomy / cdm / persistence / dao / hibernate / description / DescriptionElementDaoImpl.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.description;
10
11 import java.util.ArrayList;
12 import java.util.List;
13
14 import org.apache.logging.log4j.LogManager;
15 import org.apache.logging.log4j.Logger;
16 import org.apache.lucene.analysis.standard.StandardAnalyzer;
17 import org.apache.lucene.queryparser.classic.ParseException;
18 import org.apache.lucene.queryparser.classic.QueryParser;
19 import org.hibernate.Hibernate;
20 import org.hibernate.query.Query;
21 import org.hibernate.search.FullTextQuery;
22 import org.hibernate.search.FullTextSession;
23 import org.hibernate.search.Search;
24 import org.hibernate.search.SearchFactory;
25 import org.springframework.stereotype.Repository;
26
27 import eu.etaxonomy.cdm.model.description.DescriptionElementBase;
28 import eu.etaxonomy.cdm.model.description.TextData;
29 import eu.etaxonomy.cdm.model.media.Media;
30 import eu.etaxonomy.cdm.model.view.AuditEvent;
31 import eu.etaxonomy.cdm.persistence.dao.QueryParseException;
32 import eu.etaxonomy.cdm.persistence.dao.description.IDescriptionElementDao;
33 import eu.etaxonomy.cdm.persistence.dao.hibernate.common.AnnotatableDaoBaseImpl;
34 import eu.etaxonomy.cdm.persistence.query.OrderHint;
35
36 @Repository
37 public class DescriptionElementDaoImpl
38 extends AnnotatableDaoBaseImpl<DescriptionElementBase>
39 implements IDescriptionElementDao {
40
41 @SuppressWarnings("unused")
42 private static final Logger logger = LogManager.getLogger();
43
44 private final String defaultField = "multilanguageText.text";
45
46 private final Class<? extends DescriptionElementBase> indexedClasses[];
47
48 public DescriptionElementDaoImpl() {
49 super(DescriptionElementBase.class);
50 indexedClasses = new Class[1];
51 indexedClasses[0] = TextData.class;
52 }
53
54 @Override
55 public long countMedia(DescriptionElementBase descriptionElement) {
56 AuditEvent auditEvent = getAuditEventFromContext();
57 if(auditEvent.equals(AuditEvent.CURRENT_VIEW)) {
58 Query<Long> query = getSession().createQuery("select count(media) from DescriptionElementBase descriptionElement join descriptionElement.media media where descriptionElement = :descriptionElement", Long.class);
59 query.setParameter("descriptionElement", descriptionElement);
60
61 return (query.uniqueResult());
62 } else {
63 // Horribly inefficient, I know, but hard to do at the moment with envers.
64 // FIXME Improve this (by improving envers)
65 List<String> propertyPaths = new ArrayList<>();
66 propertyPaths.add("media");
67 DescriptionElementBase d = super.load(descriptionElement.getUuid(), propertyPaths);
68 return d.getMedia().size();
69 }
70 }
71
72 @Override
73 public long count(Class<? extends DescriptionElementBase> clazz, String queryString) {
74 checkNotInPriorView("DescriptionElementDaoImpl.countTextData(String queryString)");
75 QueryParser queryParser = new QueryParser(defaultField, new StandardAnalyzer());
76
77 try {
78 org.apache.lucene.search.Query query = queryParser.parse(queryString);
79
80 FullTextSession fullTextSession = Search.getFullTextSession(getSession());
81 FullTextQuery fullTextQuery = null;
82
83 if(clazz == null) {
84 fullTextQuery = fullTextSession.createFullTextQuery(query, type);
85 } else {
86 fullTextQuery = fullTextSession.createFullTextQuery(query, clazz);
87 }
88 return fullTextQuery.getResultSize();
89 } catch (ParseException e) {
90 throw new QueryParseException(e, queryString);
91 }
92 }
93
94 @Override
95 public List<Media> getMedia(DescriptionElementBase descriptionElement, Integer pageSize, Integer pageNumber, List<String> propertyPaths) {
96 AuditEvent auditEvent = getAuditEventFromContext();
97 if(auditEvent.equals(AuditEvent.CURRENT_VIEW)) {
98 Query<Media> query = getSession().createQuery("select media from DescriptionElementBase descriptionElement join descriptionElement.media media where descriptionElement = :descriptionElement order by index(media)", Media.class);
99 query.setParameter("descriptionElement", descriptionElement);
100
101 addPageSizeAndNumber(query, pageSize, pageNumber);
102
103 List<Media> results = query.list();
104 defaultBeanInitializer.initializeAll(results, propertyPaths);
105 return results;
106 } else {
107 // Horribly inefficient, I know, but hard to do at the moment with envers.
108 // FIXME Improve this (by improving envers)
109 List<String> pPaths = new ArrayList<>();
110 propertyPaths.add("media");
111 DescriptionElementBase d = super.load(descriptionElement.getUuid(), pPaths);
112 List<Media> results = new ArrayList<>();
113 results.addAll(d.getMedia());
114 if(pageSize != null) {
115 int fromIndex = 0;
116 int toIndex = 0;
117 if(pageNumber != null) {
118 // if the page is out of scope
119 if(results.size() < (pageNumber * pageSize)) {
120 return new ArrayList<>();
121 }
122 fromIndex = pageNumber * pageSize;
123 }
124 toIndex = results.size() < (fromIndex + pageSize) ? results.size() : fromIndex + pageSize;
125 results = results.subList(fromIndex, toIndex);
126 }
127 defaultBeanInitializer.initializeAll(results, propertyPaths);
128 return results;
129 }
130 }
131
132 @Override
133 public List<DescriptionElementBase> search(Class<? extends DescriptionElementBase> clazz, String queryString, Integer pageSize, Integer pageNumber, List<OrderHint> orderHints, List<String> propertyPaths) {
134 // public <S extends DescriptionElementBase> List<S> search(Class<S> clazz, String queryString, Integer pageSize, Integer pageNumber, List<OrderHint> orderHints, List<String> propertyPaths) {
135 checkNotInPriorView("DescriptionElementDaoImpl.searchTextData(String queryString, Integer pageSize, Integer pageNumber)");
136 QueryParser queryParser = new QueryParser(defaultField, new StandardAnalyzer());
137
138 try {
139 org.apache.lucene.search.Query query = queryParser.parse(queryString);
140 FullTextQuery fullTextQuery = null;
141 FullTextSession fullTextSession = Search.getFullTextSession(getSession());
142 if(clazz == null) {
143 fullTextQuery = fullTextSession.createFullTextQuery(query, type);
144 } else {
145 fullTextQuery = fullTextSession.createFullTextQuery(query, clazz);
146 }
147 addOrder(fullTextQuery,orderHints);
148
149 this.addPageSizeAndNumber(fullTextQuery, pageSize, pageNumber);
150
151 @SuppressWarnings("unchecked")
152 List<DescriptionElementBase> results = fullTextQuery.list();
153 defaultBeanInitializer.initializeAll(results, propertyPaths);
154 return results;
155
156 } catch (ParseException e) {
157 throw new QueryParseException(e, queryString);
158 }
159 }
160
161 @Override
162 public void purgeIndex() {
163 FullTextSession fullTextSession = Search.getFullTextSession(getSession());
164 for(Class<? extends DescriptionElementBase> clazz : indexedClasses) {
165 fullTextSession.purgeAll(clazz); // remove all description element base from indexes
166 }
167 fullTextSession.flushToIndexes();
168 }
169
170 @Override
171 public void rebuildIndex() {
172 FullTextSession fullTextSession = Search.getFullTextSession(getSession());
173
174 for(DescriptionElementBase descriptionElementBase : list(null,null)) { // re-index all descriptionElements
175 Hibernate.initialize(descriptionElementBase.getInDescription());
176 Hibernate.initialize(descriptionElementBase.getFeature());
177 fullTextSession.index(descriptionElementBase);
178 }
179 fullTextSession.flushToIndexes();
180 }
181
182 @Override
183 public void optimizeIndex() {
184 FullTextSession fullTextSession = Search.getFullTextSession(getSession());
185 SearchFactory searchFactory = fullTextSession.getSearchFactory();
186 for(Class<? extends DescriptionElementBase> clazz : indexedClasses) {
187 searchFactory.optimize(clazz); // optimize the indices ()
188 }
189 fullTextSession.flushToIndexes();
190 }
191
192 public int count(String queryString) {
193 checkNotInPriorView("DescriptionElementDaoImpl.count(String queryString)");
194 QueryParser queryParser = new QueryParser(defaultField, new StandardAnalyzer());
195
196 try {
197 org.apache.lucene.search.Query query = queryParser.parse(queryString);
198
199 FullTextSession fullTextSession = Search.getFullTextSession(this.getSession());
200 org.hibernate.search.FullTextQuery fullTextQuery = fullTextSession.createFullTextQuery(query, type);
201
202 return fullTextQuery.getResultSize();
203
204 } catch (ParseException e) {
205 throw new QueryParseException(e, queryString);
206 }
207 }
208
209 @Override
210 public String suggestQuery(String string) {
211 throw new UnsupportedOperationException("suggest query is not supported yet");
212 }
213
214 }