2ed348d75267b5a954e0657af21b65deda90ae50
[cdmlib.git] / cdmlib-persistence / src / main / java / eu / etaxonomy / cdm / persistence / dao / hibernate / description / DescriptionElementDaoImpl.java
1 package eu.etaxonomy.cdm.persistence.dao.hibernate.description;
2
3 import java.util.List;
4
5 import org.apache.lucene.analysis.SimpleAnalyzer;
6 import org.apache.lucene.queryParser.ParseException;
7 import org.apache.lucene.queryParser.QueryParser;
8 import org.apache.lucene.search.Sort;
9 import org.apache.lucene.search.SortField;
10 import org.hibernate.Criteria;
11 import org.hibernate.FetchMode;
12 import org.hibernate.Hibernate;
13 import org.hibernate.Query;
14 import org.hibernate.search.FullTextSession;
15 import org.hibernate.search.Search;
16 import org.hibernate.search.SearchFactory;
17 import org.springframework.stereotype.Repository;
18
19 import eu.etaxonomy.cdm.model.description.DescriptionElementBase;
20 import eu.etaxonomy.cdm.model.description.TaxonDescription;
21 import eu.etaxonomy.cdm.model.description.TextData;
22 import eu.etaxonomy.cdm.model.media.Media;
23 import eu.etaxonomy.cdm.persistence.dao.QueryParseException;
24 import eu.etaxonomy.cdm.persistence.dao.description.IDescriptionElementDao;
25 import eu.etaxonomy.cdm.persistence.dao.hibernate.common.AnnotatableDaoImpl;
26
27 @Repository
28 public class DescriptionElementDaoImpl extends AnnotatableDaoImpl<DescriptionElementBase> implements IDescriptionElementDao {
29
30 public DescriptionElementDaoImpl() {
31 super(DescriptionElementBase.class);
32 }
33
34 public int countMedia(DescriptionElementBase descriptionElement) {
35 Query query = getSession().createQuery("select count(media) from DescriptionElementBase descriptionElement join descriptionElement.media media where descriptionElement = :descriptionElement");
36 query.setParameter("descriptionElement", descriptionElement);
37
38 return ((Long)query.uniqueResult()).intValue();
39 }
40
41 public int countTextData(String queryString) {
42 QueryParser queryParser = new QueryParser("multilanguageText.text", new SimpleAnalyzer());
43
44 try {
45 org.apache.lucene.search.Query query = queryParser.parse(queryString);
46
47 FullTextSession fullTextSession = Search.createFullTextSession(getSession());
48 org.hibernate.search.FullTextQuery fullTextQuery = fullTextSession.createFullTextQuery(query, TextData.class);
49 return fullTextQuery.getResultSize();
50 } catch (ParseException e) {
51 throw new QueryParseException(e, queryString);
52 }
53 }
54
55 public List<Media> getMedia(DescriptionElementBase descriptionElement, Integer pageSize, Integer pageNumber) {
56 Query query = getSession().createQuery("select media from DescriptionElementBase descriptionElement join descriptionElement.media media where descriptionElement = :descriptionElement");
57 query.setParameter("descriptionElement", descriptionElement);
58
59 if(pageSize != null) {
60 query.setMaxResults(pageSize);
61 if(pageNumber != null) {
62 query.setFirstResult(pageNumber * pageSize);
63 } else {
64 query.setFirstResult(0);
65 }
66 }
67
68 return (List<Media>)query.list();
69 }
70
71 public List<TextData> searchTextData(String queryString, Integer pageSize, Integer pageNumber) {
72 QueryParser queryParser = new QueryParser("multilanguageText.text", new SimpleAnalyzer());
73
74 try {
75 org.apache.lucene.search.Query query = queryParser.parse(queryString);
76
77 FullTextSession fullTextSession = Search.createFullTextSession(getSession());
78 org.hibernate.search.FullTextQuery fullTextQuery = fullTextSession.createFullTextQuery(query, TextData.class);
79 org.apache.lucene.search.Sort sort = new Sort(new SortField("inDescription.titleCache_forSort"));
80 fullTextQuery.setSort(sort);
81
82 Criteria criteria = getSession().createCriteria(TextData.class);
83 criteria.setFetchMode("inDescription",FetchMode.JOIN);
84 criteria.setFetchMode("feature", FetchMode.JOIN);
85
86 fullTextQuery.setCriteriaQuery(criteria);
87
88 if(pageSize != null) {
89 fullTextQuery.setMaxResults(pageSize);
90 if(pageNumber != null) {
91 fullTextQuery.setFirstResult(pageNumber * pageSize);
92 } else {
93 fullTextQuery.setFirstResult(0);
94 }
95 }
96 List<TextData> textData = fullTextQuery.list();
97
98 for(TextData t : textData) {
99 Hibernate.initialize(t.getMultilanguageText());
100 if(t.getInDescription() instanceof TaxonDescription) {
101 TaxonDescription taxonDescription = (TaxonDescription)t.getInDescription();
102 Hibernate.initialize(taxonDescription.getTaxon());
103 }
104 }
105 return textData;
106
107 } catch (ParseException e) {
108 throw new QueryParseException(e, queryString);
109 }
110 }
111
112 public void purgeIndex() {
113 FullTextSession fullTextSession = Search.createFullTextSession(getSession());
114
115 fullTextSession.purgeAll(type); // remove all description element base from indexes
116 // fullTextSession.flushToIndexes() not implemented in 3.0.0.GA
117 }
118
119 public void rebuildIndex() {
120 FullTextSession fullTextSession = Search.createFullTextSession(getSession());
121
122 for(DescriptionElementBase descriptionElementBase : list(null,null)) { // re-index all descriptionElements
123 Hibernate.initialize(descriptionElementBase.getInDescription());
124 Hibernate.initialize(descriptionElementBase.getFeature());
125 fullTextSession.index(descriptionElementBase);
126 }
127 }
128
129 public void optimizeIndex() {
130 FullTextSession fullTextSession = Search.createFullTextSession(getSession());
131 SearchFactory searchFactory = fullTextSession.getSearchFactory();
132 searchFactory.optimize(type); // optimize the indices ()
133 }
134
135 }