Project

General

Profile

Download (10.9 KB) Statistics
| Branch: | Tag: | Revision:
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.HashSet;
13
import java.util.List;
14
import java.util.Set;
15
import java.util.UUID;
16

    
17
import org.apache.log4j.Logger;
18
import org.hibernate.Hibernate;
19
import org.hibernate.Query;
20
import org.hibernate.Session;
21
import org.hibernate.search.FullTextSession;
22
import org.hibernate.search.Search;
23
import org.springframework.beans.factory.annotation.Qualifier;
24
import org.springframework.stereotype.Repository;
25

    
26
import eu.etaxonomy.cdm.model.reference.IArticle;
27
import eu.etaxonomy.cdm.model.reference.IBookSection;
28
import eu.etaxonomy.cdm.model.reference.IInProceedings;
29
import eu.etaxonomy.cdm.model.reference.IPrintedUnitBase;
30
import eu.etaxonomy.cdm.model.reference.IReport;
31
import eu.etaxonomy.cdm.model.reference.IThesis;
32
import eu.etaxonomy.cdm.model.reference.Reference;
33
import eu.etaxonomy.cdm.model.reference.ReferenceFactory;
34
import eu.etaxonomy.cdm.model.reference.ReferenceType;
35
import eu.etaxonomy.cdm.model.taxon.TaxonBase;
36
import eu.etaxonomy.cdm.persistence.dao.hibernate.common.IdentifiableDaoBase;
37
import eu.etaxonomy.cdm.persistence.dao.reference.IReferenceDao;
38
import eu.etaxonomy.cdm.persistence.dto.UuidAndTitleCache;
39
import eu.etaxonomy.cdm.persistence.query.OrderHint;
40
import eu.etaxonomy.cdm.strategy.cache.reference.DefaultReferenceCacheStrategy;
41

    
42
/**
43
 * @author a.mueller
44
 *
45
 */
46
@Repository
47
@Qualifier("referenceDaoHibernateImpl")
48
public class ReferenceDaoHibernateImpl extends IdentifiableDaoBase<Reference> implements IReferenceDao {
49
	private static final Logger logger = Logger.getLogger(ReferenceDaoHibernateImpl.class);
50

    
51
	public ReferenceDaoHibernateImpl() {
52
		super(Reference.class);
53
	}
54

    
55
	@Override
56
	public void rebuildIndex() {
57
		FullTextSession fullTextSession = Search.getFullTextSession(getSession());
58

    
59
		for(Reference reference : list(null,null)) { // re-index all agents
60
			Hibernate.initialize(reference.getAuthorship());
61

    
62
			if(reference.getType().equals(ReferenceType.Article)) {
63
				Hibernate.initialize(((IArticle)reference).getInJournal());
64
			} else if(reference.getType().equals(ReferenceType.BookSection)) {
65
				   Hibernate.initialize(((IBookSection)reference).getInBook());
66
			} else if(reference.getType().equals(ReferenceType.InProceedings)) {
67
					Hibernate.initialize(((IInProceedings)reference).getInProceedings());
68
			}else if(reference.getType().equals(ReferenceType.Thesis)) {
69
				Hibernate.initialize(((IThesis)reference).getSchool());
70
			} else if(reference.getType().equals(ReferenceType.Report)) {
71
				Hibernate.initialize(((IReport)reference).getInstitution());
72
			} else if(reference.getType().isPrintedUnit()) {
73
				Hibernate.initialize(((IPrintedUnitBase)reference).getInSeries());
74
			}
75
			fullTextSession.index(reference);
76
		}
77
		fullTextSession.flushToIndexes();
78
	}
79

    
80
	@Override
81
    public List<UuidAndTitleCache<Reference>> getUuidAndTitle(){
82
		List<UuidAndTitleCache<Reference>> list = new ArrayList<UuidAndTitleCache<Reference>>();
83
		Session session = getSession();
84

    
85
		Query query = session.createQuery("select uuid, id, titleCache from " + type.getSimpleName());
86

    
87
		@SuppressWarnings("unchecked")
88
        List<Object[]> result = query.list();
89

    
90
		for(Object[] object : result){
91
			list.add(new UuidAndTitleCache<Reference>(type, (UUID) object[0], (Integer)object[1], (String) object[2]));
92
		}
93

    
94
		return list;
95
	}
96

    
97
	@Override
98
	public List<UuidAndTitleCache<Reference>> getUuidAndTitleCache(Integer limit, String pattern) {
99
		List<UuidAndTitleCache<Reference>> list = new ArrayList<UuidAndTitleCache<Reference>>();
100
		Session session = getSession();
101
		 Query query;
102
		if (pattern != null){
103
		    query = session.createQuery("SELECT " +"r.uuid, r.id, r.titleCache, ab.titleCache FROM " + type.getSimpleName() + " AS r LEFT OUTER JOIN r.authorship AS ab where r.titleCache like :pattern");
104
		}else{
105
		    query = session.createQuery("SELECT " +"r.uuid, r.id, r.titleCache, ab.titleCache FROM " + type.getSimpleName() + " AS r LEFT OUTER JOIN r.authorship AS ab ");//"select uuid, titleCache from " + type.getSimpleName());
106
		}
107

    
108
		if (limit != null){
109
		    query.setMaxResults(limit);
110
		}
111
		if (pattern != null){
112
		      pattern = pattern.replace("*", "%");
113
		      pattern = pattern.replace("?", "_");
114
		      pattern = pattern + "%";
115
	          query.setParameter("pattern", pattern);
116
	    }
117
		@SuppressWarnings("unchecked")
118
        List<Object[]> result = query.list();
119

    
120
		for(Object[] object : result){
121
			String referenceTitle = (String) object[2];
122

    
123
			if(referenceTitle != null){
124
				String teamTitle = (String) object[3];
125
				referenceTitle = DefaultReferenceCacheStrategy.putAuthorToEndOfString(referenceTitle, teamTitle);
126

    
127
				list.add(new UuidAndTitleCache<Reference>(Reference.class, (UUID) object[0],(Integer)object[1], referenceTitle));
128
			}else{
129
				logger.error("title cache of reference is null. UUID: " + object[0]);
130
			}
131
		}
132

    
133
		return list;
134
	}
135

    
136
	@Override
137
    public List<Reference> getAllReferencesForPublishing(){
138
		@SuppressWarnings("unchecked")
139
        List<Reference> references = getSession().createQuery("SELECT r FROM Reference r "+
140
				"WHERE r.id IN "+
141
					"(SELECT m.markedObj.id FROM Marker m WHERE "+
142
						"m.markerType.id = "+
143
							"(SELECT dtb.id FROM DefinedTermBase dtb, Representation r WHERE r MEMBER OF dtb.representations AND r.text='publish'))").list();
144
		return references;
145
	}
146

    
147
	@Override
148
    public List<Reference> getAllNotNomenclaturalReferencesForPublishing(){
149

    
150
		@SuppressWarnings("unchecked")
151
        List<Reference> references = getSession().createQuery("select t.nomenclaturalReference from TaxonNameBase t").list();
152
		String queryString = "from Reference b where b not in (:referenceList) and b in (:publish)" ;
153
		Query referenceQuery = getSession().createQuery(queryString).setParameterList("referenceList", references);
154
		referenceQuery.setParameterList("publish", getAllReferencesForPublishing());
155
		@SuppressWarnings("unchecked")
156
        List<Reference> resultRefernces =referenceQuery.list();
157

    
158
		return resultRefernces;
159
	}
160

    
161
	// the result list held doubles therefore I put a "distinct" in the query string
162
	@Override
163
    public List<Reference> getAllNomenclaturalReferences() {
164
		@SuppressWarnings("unchecked")
165
        List<Reference> references = getSession().createQuery(
166
				"SELECT DISTINCT t.nomenclaturalReference FROM TaxonNameBase t").list();
167
		return references;
168
	}
169

    
170

    
171
    @Override
172
	public List<Reference> getSubordinateReferences(Reference reference) {
173

    
174
		List<Reference> references = new ArrayList();
175
		List<Reference> subordinateReferences = new ArrayList<Reference>();
176

    
177
		Query query = getSession().createQuery("select r from Reference r where r.inReference = (:reference)");
178
		query.setParameter("reference", reference);
179

    
180
		@SuppressWarnings("unchecked")
181
	    List<Reference> list = query.list();
182
	    references.addAll(list);
183
		for(Reference ref : references){
184
			subordinateReferences.addAll(getSubordinateReferences(ref));
185
		}
186
		references.addAll(subordinateReferences);
187
		return references;
188
	}
189

    
190
    @Override
191
	public List<TaxonBase> listCoveredTaxa(Reference reference, boolean includeSubordinateReferences, List<OrderHint> orderHints, List<String> propertyPaths) {
192

    
193
		/*
194
		 * <li>taxon.name.nomenclaturalreference</li>
195
		 * <li>taxon.descriptions.descriptionElement.sources.citation</li>
196
		 * <li>taxon.descriptions.descriptionSources</li>
197
		 * <li>taxon.name.descriptions.descriptionElement.sources</li>
198
		 * <li>taxon.name.descriptions.descriptionSources</li>
199
		 */
200

    
201
		//TODO implement search in nameDescriptions
202
		Set<Reference> referenceSet = new HashSet<Reference>();
203
		referenceSet.add(reference);
204
		if(includeSubordinateReferences){
205
			referenceSet.addAll(getSubordinateReferences(reference));
206
		}
207

    
208

    
209
		StringBuilder taxonDescriptionSql = new StringBuilder();
210
		taxonDescriptionSql.append(
211
			"select distinct t from Taxon t " +
212
			// TaxonDescription
213
			"left join t.descriptions td " +
214
			"left join td.descriptionSources td_s " +
215
			"left join td.descriptionElements td_e " +
216
			"left join td_e.sources td_e_s " +
217
			// TaxonNameDescription
218
			"left join t.name n " +
219
			"left join n.descriptions nd " +
220
			"left join nd.descriptionSources nd_s " +
221
			"left join nd.descriptionElements nd_e " +
222
			"left join nd_e.sources nd_e_s " +
223

    
224
			"where td_e_s.citation in (:referenceBase_1) " +
225
			"or td_s in (:referenceBase_2) " +
226
			"or nd_e_s.citation in (:referenceBase_3) " +
227
			"or nd_s in (:referenceBase_4) or " +
228
			"n.nomenclaturalReference in (:referenceBase_5) or " +
229
			"t.sec in (:referenceBase_6)"
230
			);
231

    
232
		if (orderHints != null && orderHints.size() > 0){
233
		    taxonDescriptionSql.append(" order by ");
234
		    int i = 0;
235
		    for (OrderHint hint : orderHints) {
236
		        if(i > 0) {
237
		            taxonDescriptionSql.append(", ");
238
		        }
239
		        taxonDescriptionSql.append("t.").append(hint.toHql());
240
            }
241
		}
242

    
243
		// TODO include:
244
		// name relations
245
		// taxon relations
246

    
247
		Query query = getSession().createQuery(taxonDescriptionSql.toString());
248
		query.setParameterList("referenceBase_1", referenceSet);
249
		query.setParameterList("referenceBase_2", referenceSet);
250
		query.setParameterList("referenceBase_3", referenceSet);
251
		query.setParameterList("referenceBase_4", referenceSet);
252
		query.setParameterList("referenceBase_5", referenceSet);
253
		query.setParameterList("referenceBase_6", referenceSet);
254

    
255
		@SuppressWarnings("unchecked")
256
        List<TaxonBase> taxonBaseList = query.list();
257

    
258
		defaultBeanInitializer.initializeAll(taxonBaseList, propertyPaths);
259

    
260
		return taxonBaseList;
261
	}
262

    
263
    /* (non-Javadoc)
264
     * @see eu.etaxonomy.cdm.persistence.dao.reference.IReferenceDao#getUuidAndAbbrevTitleCache(java.lang.Integer, java.lang.String)
265
     */
266
    @Override
267
    public List<UuidAndTitleCache<Reference>> getUuidAndAbbrevTitleCache(Integer limit, String pattern) {
268
        Session session = getSession();
269
        Reference ref = ReferenceFactory.newArticle();
270

    
271
        Query query = null;
272
        if (pattern != null){
273
            if (pattern.startsWith("*")){
274
                query = session.createQuery("select uuid, id, abbrevTitleCache, titleCache from " + type.getSimpleName() +" where abbrevTitleCache like :pattern OR titleCache like :pattern ");
275
            }else{
276
                query = session.createQuery("select uuid, id, abbrevTitleCache, titleCache from " + type.getSimpleName() +" where abbrevTitleCache like :pattern  ");
277
            }
278
            pattern = pattern + "%";
279
            pattern = pattern.replace("*", "%");
280
            pattern = pattern.replace("?", "_");
281
            query.setParameter("pattern", pattern);
282
        } else {
283
            query = session.createQuery("select uuid, id, abbrevTitleCache, titleCache from " + type.getSimpleName() );
284
        }
285
        if (limit != null){
286
           query.setMaxResults(limit);
287
        }
288

    
289
        return getUuidAndAbbrevTitleCache(query);
290

    
291
    }
292
}
    (1-1/1)