Project

General

Profile

Download (8.8 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 long 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
            addPageSizeAndNumber(query, pageSize, pageNumber);
89

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

    
120
    @Override
121
    public List<DescriptionElementBase> search(Class<? extends DescriptionElementBase> clazz, String queryString, Integer pageSize,	Integer pageNumber, List<OrderHint> orderHints, List<String> propertyPaths) {
122
        checkNotInPriorView("DescriptionElementDaoImpl.searchTextData(String queryString, Integer pageSize,	Integer pageNumber)");
123
        QueryParser queryParser = new QueryParser(defaultField, new StandardAnalyzer());
124

    
125
        try {
126
            org.apache.lucene.search.Query query = queryParser.parse(queryString);
127
            org.hibernate.search.FullTextQuery fullTextQuery = null;
128
            FullTextSession fullTextSession = Search.getFullTextSession(getSession());
129
            if(clazz == null) {
130
                fullTextQuery = fullTextSession.createFullTextQuery(query, type);
131
            } else {
132
                fullTextQuery = fullTextSession.createFullTextQuery(query, clazz);
133
            }
134
            addOrder(fullTextQuery,orderHints);
135

    
136
            addPageSizeAndNumber(fullTextQuery, pageSize, pageNumber);
137

    
138
            @SuppressWarnings("unchecked")
139
            List<DescriptionElementBase> results = fullTextQuery.list();
140
            defaultBeanInitializer.initializeAll(results, propertyPaths);
141
            return results;
142

    
143
        } catch (ParseException e) {
144
            throw new QueryParseException(e, queryString);
145
        }
146
    }
147

    
148
    @Override
149
    public void purgeIndex() {
150
        FullTextSession fullTextSession = Search.getFullTextSession(getSession());
151
        for(Class<? extends DescriptionElementBase> clazz : indexedClasses) {
152
            fullTextSession.purgeAll(type); // remove all description element base from indexes
153
        }
154
        fullTextSession.flushToIndexes();
155
    }
156

    
157
    @Override
158
    public void rebuildIndex() {
159
        FullTextSession fullTextSession = Search.getFullTextSession(getSession());
160

    
161
        for(DescriptionElementBase descriptionElementBase : list(null,null)) { // re-index all descriptionElements
162
            Hibernate.initialize(descriptionElementBase.getInDescription());
163
            Hibernate.initialize(descriptionElementBase.getFeature());
164
            fullTextSession.index(descriptionElementBase);
165
        }
166
        fullTextSession.flushToIndexes();
167
    }
168

    
169
    @Override
170
    public void optimizeIndex() {
171
        FullTextSession fullTextSession = Search.getFullTextSession(getSession());
172
        SearchFactory searchFactory = fullTextSession.getSearchFactory();
173
        for(Class<? extends DescriptionElementBase> clazz : indexedClasses) {
174
            searchFactory.optimize(clazz); // optimize the indices ()
175
        }
176
        fullTextSession.flushToIndexes();
177
    }
178

    
179
    public int count(String queryString) {
180
        checkNotInPriorView("DescriptionElementDaoImpl.count(String queryString)");
181
        QueryParser queryParser = new QueryParser(defaultField, new StandardAnalyzer());
182

    
183
        try {
184
            org.apache.lucene.search.Query query = queryParser.parse(queryString);
185

    
186
            FullTextSession fullTextSession = Search.getFullTextSession(this.getSession());
187
            org.hibernate.search.FullTextQuery fullTextQuery = fullTextSession.createFullTextQuery(query, type);
188

    
189
            return fullTextQuery.getResultSize();
190

    
191
        } catch (ParseException e) {
192
            throw new QueryParseException(e, queryString);
193
        }
194
    }
195

    
196
    @Override
197
    public String suggestQuery(String string) {
198
        throw new UnsupportedOperationException("suggest query is not supported yet");
199
    }
200

    
201
}
(2-2/10)