Project

General

Profile

Download (9.27 KB) Statistics
| Branch: | Tag: | Revision:
1
package eu.etaxonomy.cdm.persistence.dao.hibernate.description;
2

    
3
import java.util.ArrayList;
4
import java.util.List;
5

    
6
import org.apache.log4j.Logger;
7
import org.apache.lucene.analysis.standard.StandardAnalyzer;
8
import org.apache.lucene.queryparser.classic.ParseException;
9
import org.apache.lucene.queryparser.classic.QueryParser;
10
import org.hibernate.Hibernate;
11
import org.hibernate.Query;
12
import org.hibernate.search.FullTextSession;
13
import org.hibernate.search.Search;
14
import org.hibernate.search.SearchFactory;
15
import org.springframework.stereotype.Repository;
16

    
17
import eu.etaxonomy.cdm.model.description.DescriptionElementBase;
18
import eu.etaxonomy.cdm.model.description.TextData;
19
import eu.etaxonomy.cdm.model.media.Media;
20
import eu.etaxonomy.cdm.model.view.AuditEvent;
21
import eu.etaxonomy.cdm.persistence.dao.QueryParseException;
22
import eu.etaxonomy.cdm.persistence.dao.description.IDescriptionElementDao;
23
import eu.etaxonomy.cdm.persistence.dao.hibernate.common.AnnotatableDaoImpl;
24
import eu.etaxonomy.cdm.persistence.query.OrderHint;
25

    
26
@Repository
27
public class DescriptionElementDaoImpl extends AnnotatableDaoImpl<DescriptionElementBase> implements IDescriptionElementDao {
28
    @SuppressWarnings("unused")
29
    private static final Logger logger = Logger.getLogger(DescriptionElementDaoImpl.class);
30

    
31
    private final String defaultField = "multilanguageText.text";
32

    
33
    private final Class<? extends DescriptionElementBase> indexedClasses[];
34

    
35
    public DescriptionElementDaoImpl() {
36
        super(DescriptionElementBase.class);
37
        indexedClasses = new Class[1];
38
        indexedClasses[0] = TextData.class;
39
    }
40

    
41
    @Override
42
    public int countMedia(DescriptionElementBase descriptionElement) {
43
        AuditEvent auditEvent = getAuditEventFromContext();
44
        if(auditEvent.equals(AuditEvent.CURRENT_VIEW)) {
45
            Query query = getSession().createQuery("select count(media) from DescriptionElementBase descriptionElement join descriptionElement.media media where descriptionElement = :descriptionElement");
46
            query.setParameter("descriptionElement", descriptionElement);
47

    
48
            return ((Long)query.uniqueResult()).intValue();
49
        } else {
50
            // Horribly inefficient, I know, but hard to do at the moment with envers.
51
            // FIXME Improve this (by improving envers)
52
            List<String> propertyPaths = new ArrayList<String>();
53
            propertyPaths.add("media");
54
            DescriptionElementBase d = super.load(descriptionElement.getUuid(), propertyPaths);
55
            return d.getMedia().size();
56
        }
57
    }
58

    
59
    @Override
60
    public int count(Class<? extends DescriptionElementBase> clazz, String queryString) {
61
        checkNotInPriorView("DescriptionElementDaoImpl.countTextData(String queryString)");
62
        QueryParser queryParser = new QueryParser(defaultField, new StandardAnalyzer());
63

    
64
        try {
65
            org.apache.lucene.search.Query query = queryParser.parse(queryString);
66

    
67
            FullTextSession fullTextSession = Search.getFullTextSession(getSession());
68
            org.hibernate.search.FullTextQuery fullTextQuery = null;
69

    
70
            if(clazz == null) {
71
                fullTextQuery = fullTextSession.createFullTextQuery(query, type);
72
            } else {
73
                fullTextQuery = fullTextSession.createFullTextQuery(query, clazz);
74
            }
75
            return  fullTextQuery.getResultSize();
76
        } catch (ParseException e) {
77
            throw new QueryParseException(e, queryString);
78
        }
79
    }
80

    
81
    @Override
82
    public List<Media> getMedia(DescriptionElementBase descriptionElement,	Integer pageSize, Integer pageNumber, List<String> propertyPaths) {
83
        AuditEvent auditEvent = getAuditEventFromContext();
84
        if(auditEvent.equals(AuditEvent.CURRENT_VIEW)) {
85
            Query query = getSession().createQuery("select media from DescriptionElementBase descriptionElement join descriptionElement.media media where descriptionElement = :descriptionElement order by index(media)");
86
            query.setParameter("descriptionElement", descriptionElement);
87

    
88
            if(pageSize != null) {
89
                query.setMaxResults(pageSize);
90
                if(pageNumber != null) {
91
                    query.setFirstResult(pageNumber * pageSize);
92
                } else {
93
                    query.setFirstResult(0);
94
                }
95
            }
96

    
97
            @SuppressWarnings("unchecked")
98
            List<Media> results = query.list();
99
            defaultBeanInitializer.initializeAll(results, propertyPaths);
100
            return results;
101
        } else {
102
            // Horribly inefficient, I know, but hard to do at the moment with envers.
103
            // FIXME Improve this (by improving envers)
104
            List<String> pPaths = new ArrayList<String>();
105
            propertyPaths.add("media");
106
            DescriptionElementBase d = super.load(descriptionElement.getUuid(), pPaths);
107
            List<Media> results = new ArrayList<Media>();
108
            results.addAll(d.getMedia());
109
            if(pageSize != null) {
110
                int fromIndex = 0;
111
                int toIndex = 0;
112
                if(pageNumber != null) {
113
                    // if the page is out of scope
114
                    if(results.size() < (pageNumber * pageSize)) {
115
                        return new ArrayList<Media>();
116
                    }
117
                    fromIndex =   pageNumber * pageSize;
118
                }
119
                toIndex = results.size() < (fromIndex + pageSize) ? results.size() : fromIndex + pageSize;
120
                results = results.subList(fromIndex, toIndex);
121
            }
122
            defaultBeanInitializer.initializeAll(results, propertyPaths);
123
            return results;
124
        }
125
    }
126

    
127
    @Override
128
    public List<DescriptionElementBase> search(Class<? extends DescriptionElementBase> clazz, String queryString, Integer pageSize,	Integer pageNumber, List<OrderHint> orderHints, List<String> propertyPaths) {
129
        checkNotInPriorView("DescriptionElementDaoImpl.searchTextData(String queryString, Integer pageSize,	Integer pageNumber)");
130
        QueryParser queryParser = new QueryParser(defaultField, new StandardAnalyzer());
131

    
132
        try {
133
            org.apache.lucene.search.Query query = queryParser.parse(queryString);
134
            org.hibernate.search.FullTextQuery fullTextQuery = null;
135
            FullTextSession fullTextSession = Search.getFullTextSession(getSession());
136
            if(clazz == null) {
137
                fullTextQuery = fullTextSession.createFullTextQuery(query, type);
138
            } else {
139
                fullTextQuery = fullTextSession.createFullTextQuery(query, clazz);
140
            }
141
            addOrder(fullTextQuery,orderHints);
142

    
143
            if(pageSize != null) {
144
                fullTextQuery.setMaxResults(pageSize);
145
                if(pageNumber != null) {
146
                    fullTextQuery.setFirstResult(pageNumber * pageSize);
147
                } else {
148
                    fullTextQuery.setFirstResult(0);
149
                }
150
            }
151

    
152
            @SuppressWarnings("unchecked")
153
            List<DescriptionElementBase> results = fullTextQuery.list();
154
            defaultBeanInitializer.initializeAll(results, propertyPaths);
155
            return results;
156

    
157
        } catch (ParseException e) {
158
            throw new QueryParseException(e, queryString);
159
        }
160
    }
161

    
162
    @Override
163
    public void purgeIndex() {
164
        FullTextSession fullTextSession = Search.getFullTextSession(getSession());
165
        for(Class<? extends DescriptionElementBase> clazz : indexedClasses) {
166
            fullTextSession.purgeAll(type); // remove all description element base from indexes
167
        }
168
        fullTextSession.flushToIndexes();
169
    }
170

    
171
    @Override
172
    public void rebuildIndex() {
173
        FullTextSession fullTextSession = Search.getFullTextSession(getSession());
174

    
175
        for(DescriptionElementBase descriptionElementBase : list(null,null)) { // re-index all descriptionElements
176
            Hibernate.initialize(descriptionElementBase.getInDescription());
177
            Hibernate.initialize(descriptionElementBase.getFeature());
178
            fullTextSession.index(descriptionElementBase);
179
        }
180
        fullTextSession.flushToIndexes();
181
    }
182

    
183
    @Override
184
    public void optimizeIndex() {
185
        FullTextSession fullTextSession = Search.getFullTextSession(getSession());
186
        SearchFactory searchFactory = fullTextSession.getSearchFactory();
187
        for(Class<? extends DescriptionElementBase> clazz : indexedClasses) {
188
            searchFactory.optimize(clazz); // optimize the indices ()
189
        }
190
        fullTextSession.flushToIndexes();
191
    }
192

    
193
    public int count(String queryString) {
194
        checkNotInPriorView("DescriptionElementDaoImpl.count(String queryString)");
195
        QueryParser queryParser = new QueryParser(defaultField, new StandardAnalyzer());
196

    
197
        try {
198
            org.apache.lucene.search.Query query = queryParser.parse(queryString);
199

    
200
            FullTextSession fullTextSession = Search.getFullTextSession(this.getSession());
201
            org.hibernate.search.FullTextQuery fullTextQuery = fullTextSession.createFullTextQuery(query, type);
202

    
203
            return fullTextQuery.getResultSize();
204

    
205
        } catch (ParseException e) {
206
            throw new QueryParseException(e, queryString);
207
        }
208
    }
209

    
210
    @Override
211
    public String suggestQuery(String string) {
212
        throw new UnsupportedOperationException("suggest query is not supported yet");
213
    }
214

    
215
}
(2-2/10)