Project

General

Profile

Download (14.3 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.Criteria;
19
import org.hibernate.Hibernate;
20
import org.hibernate.Query;
21
import org.hibernate.Session;
22
import org.hibernate.criterion.Restrictions;
23
import org.hibernate.search.FullTextSession;
24
import org.hibernate.search.Search;
25
import org.springframework.beans.factory.annotation.Qualifier;
26
import org.springframework.stereotype.Repository;
27

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

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

    
54
	public ReferenceDaoHibernateImpl() {
55
		super(Reference.class);
56
	}
57

    
58
	@Override
59
	public void rebuildIndex() {
60
		FullTextSession fullTextSession = Search.getFullTextSession(getSession());
61

    
62
		for(Reference reference : list(null,null)) { // re-index all agents
63
			Hibernate.initialize(reference.getAuthorship());
64

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

    
83
	@Override
84
    public List<UuidAndTitleCache<Reference>> getUuidAndTitle(){
85
		List<UuidAndTitleCache<Reference>> list = new ArrayList<UuidAndTitleCache<Reference>>();
86
		Session session = getSession();
87

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

    
90
		@SuppressWarnings("unchecked")
91
        List<Object[]> result = query.list();
92

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

    
97
		return list;
98
	}
99

    
100
	@Override
101
    public List<UuidAndTitleCache<Reference>> getUuidAndTitle(Set<UUID> uuids){
102
        List<UuidAndTitleCache<Reference>> list = new ArrayList<UuidAndTitleCache<Reference>>();
103

    
104
        Criteria criteria = null;
105

    
106
        criteria = getSession().createCriteria(Reference.class);
107
        criteria.add(Restrictions.in("uuid", uuids ) );
108

    
109
        @SuppressWarnings("unchecked")
110
        List<Reference> result = criteria.list();
111

    
112
        for(Reference object : result){
113
            list.add(new UuidAndTitleCache<Reference>(type, object.getUuid(), object.getId(), object.getTitleCache()));
114
        }
115

    
116
        return list;
117
    }
118

    
119
	@Override
120
	public List<UuidAndTitleCache<Reference>> getUuidAndTitleCache(Integer limit, String pattern, ReferenceType refType) {
121
		List<UuidAndTitleCache<Reference>> list = new ArrayList<>();
122
		Session session = getSession();
123

    
124
		String queryString = "SELECT " +"r.uuid, r.id, r.titleCache, ab.titleCache "
125
		        + " FROM " + type.getSimpleName() + " AS r LEFT OUTER JOIN r.authorship AS ab ";
126

    
127
		if (refType != null || pattern != null){
128
		    queryString += " WHERE (1=1) ";
129
		    if (refType != null ){
130
		        queryString += " AND (r.type = :type OR r.type = :genericType) " ;
131
		    }
132
		    if (pattern != null){
133
		        queryString += " AND (r.titleCache LIKE :pattern) ";
134
		    }
135
		}
136

    
137
		Query query;
138
		//if (pattern != null){
139
		    query = session.createQuery(queryString);
140
//		}else{
141
//		    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());
142
//		}
143

    
144
		if (limit != null){
145
		    query.setMaxResults(limit);
146
		}
147
		if (pattern != null){
148
		      pattern = pattern.replace("*", "%");
149
		      pattern = pattern.replace("?", "_");
150
		      pattern = pattern + "%";
151
	          query.setParameter("pattern", pattern);
152
	    }
153
		if (refType != null){
154
		    query.setParameter("type", refType);
155
		    query.setParameter("genericType", ReferenceType.Generic);
156
		}
157
		@SuppressWarnings("unchecked")
158
        List<Object[]> result = query.list();
159

    
160
		for(Object[] object : result){
161
			String referenceTitle = (String) object[2];
162

    
163
			if(referenceTitle != null){
164
				String teamTitle = (String) object[3];
165
				referenceTitle = DefaultReferenceCacheStrategy.putAuthorToEndOfString(referenceTitle, teamTitle);
166

    
167
				list.add(new UuidAndTitleCache<Reference>(Reference.class, (UUID) object[0],(Integer)object[1], referenceTitle));
168
			}else{
169
				logger.warn("Title cache of reference is null. This should not happen. Please fix data. UUID: " + object[0]);
170
			}
171
		}
172

    
173
		return list;
174
	}
175

    
176
	@Override
177
	public List<Object[]> findByIdentifierAbbrev(String identifier, DefinedTermBase identifierType,
178
            MatchMode matchmode,Integer limit){
179
	    checkNotInPriorView("IdentifiableDaoBase.findByIdentifier(T clazz, String identifier, DefinedTerm identifierType, MatchMode matchmode, Integer pageSize, Integer pageNumber, List<OrderHint> orderHints, List<String> propertyPaths)");
180

    
181

    
182
        String queryString = "SELECT ids.type, ids.identifier, %s FROM %s as c " +
183
                " INNER JOIN c.identifiers as ids " +
184
                " WHERE (1=1) ";
185
        queryString = String.format(queryString, "c.uuid, c.titleCache, c.abbrevTitleCache" , "Reference");
186

    
187
        //Matchmode and identifier
188
        if (identifier != null){
189
            if (matchmode == null || matchmode == MatchMode.EXACT){
190
                queryString += " AND ids.identifier = '"  + identifier + "'";
191
            }else {
192
                queryString += " AND ids.identifier LIKE '" + matchmode.queryStringFrom(identifier)  + "'";
193
            }
194
        }
195
        if (identifierType != null){
196
            queryString += " AND ids.type = :type";
197
        }
198
        //order
199
        queryString +=" ORDER BY ids.type.uuid, ids.identifier, c.uuid ";
200

    
201
        Query query = getSession().createQuery(queryString);
202

    
203
        //parameters
204
        if (identifierType != null){
205
            query.setEntity("type", identifierType);
206
        }
207

    
208

    
209

    
210
        List<Object[]> results = query.list();
211
        //initialize
212

    
213
        return results;
214
	}
215

    
216
	@Override
217
    public List<Reference> getAllReferencesForPublishing(){
218
		@SuppressWarnings("unchecked")
219
        List<Reference> references = getSession().createQuery("SELECT r FROM Reference r "+
220
				"WHERE r.id IN "+
221
					"(SELECT m.markedObj.id FROM Marker m WHERE "+
222
						"m.markerType.id = "+
223
							"(SELECT dtb.id FROM DefinedTermBase dtb, Representation r WHERE r MEMBER OF dtb.representations AND r.text='publish'))").list();
224
		return references;
225
	}
226

    
227
	@Override
228
    public List<Reference> getAllNotNomenclaturalReferencesForPublishing(){
229

    
230
		@SuppressWarnings("unchecked")
231
        List<Reference> references = getSession().createQuery("select t.nomenclaturalReference from TaxonName t").list();
232
		String queryString = "from Reference b where b not in (:referenceList) and b in (:publish)" ;
233
		Query referenceQuery = getSession().createQuery(queryString).setParameterList("referenceList", references);
234
		referenceQuery.setParameterList("publish", getAllReferencesForPublishing());
235
		@SuppressWarnings("unchecked")
236
        List<Reference> resultRefernces =referenceQuery.list();
237

    
238
		return resultRefernces;
239
	}
240

    
241
	// the result list held doubles therefore I put a "distinct" in the query string
242
	@Override
243
    public List<Reference> getAllNomenclaturalReferences() {
244
		@SuppressWarnings("unchecked")
245
        List<Reference> references = getSession().createQuery(
246
				"SELECT DISTINCT t.nomenclaturalReference FROM TaxonName t").list();
247
		return references;
248
	}
249

    
250

    
251
    @Override
252
	public List<Reference> getSubordinateReferences(Reference reference) {
253

    
254
		List<Reference> references = new ArrayList();
255
		List<Reference> subordinateReferences = new ArrayList<Reference>();
256

    
257
		Query query = getSession().createQuery("select r from Reference r where r.inReference = (:reference)");
258
		query.setParameter("reference", reference);
259

    
260
		@SuppressWarnings("unchecked")
261
	    List<Reference> list = query.list();
262
	    references.addAll(list);
263
		for(Reference ref : references){
264
			subordinateReferences.addAll(getSubordinateReferences(ref));
265
		}
266
		references.addAll(subordinateReferences);
267
		return references;
268
	}
269

    
270
    @Override
271
	public List<TaxonBase> listCoveredTaxa(Reference reference, boolean includeSubordinateReferences, List<OrderHint> orderHints, List<String> propertyPaths) {
272

    
273
		/*
274
		 * <li>taxon.name.nomenclaturalreference</li>
275
		 * <li>taxon.descriptions.descriptionElement.sources.citation</li>
276
		 * <li>taxon.descriptions.descriptionSources</li>
277
		 * <li>taxon.name.descriptions.descriptionElement.sources</li>
278
		 * <li>taxon.name.descriptions.descriptionSources</li>
279
		 */
280

    
281
		//TODO implement search in nameDescriptions
282
		Set<Reference> referenceSet = new HashSet<>();
283
		referenceSet.add(reference);
284
		if(includeSubordinateReferences){
285
			referenceSet.addAll(getSubordinateReferences(reference));
286
		}
287

    
288

    
289
		StringBuilder taxonDescriptionSql = new StringBuilder();
290
		taxonDescriptionSql.append(
291
			"select distinct t from Taxon t " +
292
			// TaxonDescription
293
			"left join t.descriptions td " +
294
			"left join td.descriptionSources td_s " +
295
			"left join td.descriptionElements td_e " +
296
			"left join td_e.sources td_e_s " +
297
			// TaxonNameDescription
298
			"left join t.name n " +
299
			"left join n.descriptions nd " +
300
			"left join nd.descriptionSources nd_s " +
301
			"left join nd.descriptionElements nd_e " +
302
			"left join nd_e.sources nd_e_s " +
303

    
304
			"where td_e_s.citation in (:referenceBase_1) " +
305
			"or td_s in (:referenceBase_2) " +
306
			"or nd_e_s.citation in (:referenceBase_3) " +
307
			"or nd_s in (:referenceBase_4) or " +
308
			"n.nomenclaturalReference in (:referenceBase_5) or " +
309
			"t.sec in (:referenceBase_6)"
310
			);
311

    
312
		if (orderHints != null && orderHints.size() > 0){
313
		    taxonDescriptionSql.append(" order by ");
314
		    int i = 0;
315
		    for (OrderHint hint : orderHints) {
316
		        if(i > 0) {
317
		            taxonDescriptionSql.append(", ");
318
		        }
319
		        taxonDescriptionSql.append("t.").append(hint.toHql());
320
            }
321
		}
322

    
323
		// TODO include:
324
		// name relations
325
		// taxon relations
326

    
327
		Query query = getSession().createQuery(taxonDescriptionSql.toString());
328
		query.setParameterList("referenceBase_1", referenceSet);
329
		query.setParameterList("referenceBase_2", referenceSet);
330
		query.setParameterList("referenceBase_3", referenceSet);
331
		query.setParameterList("referenceBase_4", referenceSet);
332
		query.setParameterList("referenceBase_5", referenceSet);
333
		query.setParameterList("referenceBase_6", referenceSet);
334

    
335
		@SuppressWarnings("unchecked")
336
        List<TaxonBase> taxonBaseList = query.list();
337

    
338
		defaultBeanInitializer.initializeAll(taxonBaseList, propertyPaths);
339

    
340
		return taxonBaseList;
341
	}
342

    
343
    @Override
344
    public List<UuidAndTitleCache<Reference>> getUuidAndAbbrevTitleCache(Integer limit, String pattern, ReferenceType refType) {
345
        Session session = getSession();
346

    
347
        Query query = null;
348
        if (pattern != null){
349
            if (pattern.startsWith("*")){
350
                query = session.createQuery("select uuid, id, abbrevTitleCache, titleCache from " + type.getSimpleName() +" where abbrevTitleCache like :pattern OR titleCache like :pattern ");
351
            }else{
352
                query = session.createQuery("select uuid, id, abbrevTitleCache, titleCache from " + type.getSimpleName() +" where abbrevTitleCache like :pattern  ");
353
            }
354
            pattern = pattern + "%";
355
            pattern = pattern.replace("*", "%");
356
            pattern = pattern.replace("?", "_");
357
            query.setParameter("pattern", pattern);
358
        } else {
359
            query = session.createQuery("select uuid, id, abbrevTitleCache, titleCache from " + type.getSimpleName() );
360
        }
361
        if (limit != null){
362
           query.setMaxResults(limit);
363
        }
364

    
365
        return getUuidAndAbbrevTitleCache(query);
366

    
367
    }
368

    
369
    @Override
370
    public List<UuidAndTitleCache<Reference>> getUuidAndAbbrevTitleCacheForAuthor(Integer limit, String pattern, ReferenceType refType) {
371
        Session session = getSession();
372

    
373
        Query query = null;
374
        if (pattern != null){
375
            query = session.createQuery("SELECT uuid, id, abbrevTitleCache, titleCache from " + type.getSimpleName()
376
            +" as r where r.authorship.nomenclaturalTitle like :pattern  ");
377

    
378
            query.setParameter("pattern", pattern);
379
        } else {
380
            query = session.createQuery("select uuid, id, abbrevTitleCache, titleCache from " + type.getSimpleName() );
381
        }
382
        if (limit != null){
383
           query.setMaxResults(limit);
384
        }
385
        pattern = pattern.replace("*", "%");
386
        pattern = pattern.replace("?", "_");
387
        query.setParameter("pattern", pattern);
388
        return getUuidAndAbbrevTitleCache(query);
389

    
390
    }
391
}
    (1-1/1)