Project

General

Profile

Download (9.48 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.ReferenceType;
34
import eu.etaxonomy.cdm.model.taxon.TaxonBase;
35
import eu.etaxonomy.cdm.persistence.dao.hibernate.common.IdentifiableDaoBase;
36
import eu.etaxonomy.cdm.persistence.dao.reference.IReferenceDao;
37
import eu.etaxonomy.cdm.persistence.dto.UuidAndTitleCache;
38
import eu.etaxonomy.cdm.persistence.query.OrderHint;
39
import eu.etaxonomy.cdm.strategy.cache.reference.DefaultReferenceCacheStrategy;
40

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

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

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

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

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

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

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

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

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

    
93
		return list;
94
	}
95

    
96
	@Override
97
	public List<UuidAndTitleCache<Reference>> getUuidAndTitleCache(Integer limit, String pattern) {
98
		List<UuidAndTitleCache<Reference>> list = new ArrayList<UuidAndTitleCache<Reference>>();
99
		Session session = getSession();
100
		 Query query;
101
		if (pattern != null){
102
		    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");
103
		}else{
104
		    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());
105
		}
106

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

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

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

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

    
131
		return list;
132
	}
133

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

    
145
	@Override
146
    public List<Reference> getAllNotNomenclaturalReferencesForPublishing(){
147

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

    
156
		return resultRefernces;
157
	}
158

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

    
168

    
169
    @Override
170
	public List<Reference> getSubordinateReferences(Reference reference) {
171

    
172
		List<Reference> references = new ArrayList();
173
		List<Reference> subordinateReferences = new ArrayList<Reference>();
174

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

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

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

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

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

    
206

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

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

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

    
241
		// TODO include:
242
		// name relations
243
		// taxon relations
244

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

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

    
256
		defaultBeanInitializer.initializeAll(taxonBaseList, propertyPaths);
257

    
258
		return taxonBaseList;
259
	}
260
}
    (1-1/1)