Project

General

Profile

Download (22.7 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

    
10
package eu.etaxonomy.cdm.persistence.dao.hibernate.common;
11

    
12
import java.util.ArrayList;
13
import java.util.Enumeration;
14
import java.util.List;
15
import java.util.Locale;
16
import java.util.Set;
17

    
18
import org.apache.log4j.Logger;
19
import org.hibernate.Criteria;
20
import org.hibernate.Query;
21
import org.hibernate.Session;
22
import org.hibernate.criterion.Criterion;
23
import org.hibernate.criterion.Projections;
24
import org.hibernate.criterion.Restrictions;
25
import org.hibernate.envers.query.AuditEntity;
26
import org.hibernate.envers.query.AuditQuery;
27
import org.springframework.stereotype.Repository;
28

    
29
import eu.etaxonomy.cdm.model.agent.InstitutionType;
30
import eu.etaxonomy.cdm.model.common.AnnotationType;
31
import eu.etaxonomy.cdm.model.common.CdmBase;
32
import eu.etaxonomy.cdm.model.common.DefinedTermBase;
33
import eu.etaxonomy.cdm.model.common.ExtensionType;
34
import eu.etaxonomy.cdm.model.common.Language;
35
import eu.etaxonomy.cdm.model.common.MarkerType;
36
import eu.etaxonomy.cdm.model.description.AbsenceTerm;
37
import eu.etaxonomy.cdm.model.description.MeasurementUnit;
38
import eu.etaxonomy.cdm.model.description.Modifier;
39
import eu.etaxonomy.cdm.model.description.PresenceTerm;
40
import eu.etaxonomy.cdm.model.description.Scope;
41
import eu.etaxonomy.cdm.model.description.Sex;
42
import eu.etaxonomy.cdm.model.description.Stage;
43
import eu.etaxonomy.cdm.model.description.State;
44
import eu.etaxonomy.cdm.model.description.StatisticalMeasure;
45
import eu.etaxonomy.cdm.model.description.TextFormat;
46
import eu.etaxonomy.cdm.model.location.Continent;
47
import eu.etaxonomy.cdm.model.location.NamedArea;
48
import eu.etaxonomy.cdm.model.location.NamedAreaLevel;
49
import eu.etaxonomy.cdm.model.location.NamedAreaType;
50
import eu.etaxonomy.cdm.model.location.ReferenceSystem;
51
import eu.etaxonomy.cdm.model.location.TdwgArea;
52
import eu.etaxonomy.cdm.model.location.WaterbodyOrCountry;
53
import eu.etaxonomy.cdm.model.media.Media;
54
import eu.etaxonomy.cdm.model.media.RightsTerm;
55
import eu.etaxonomy.cdm.model.name.HybridRelationshipType;
56
import eu.etaxonomy.cdm.model.name.NameRelationshipType;
57
import eu.etaxonomy.cdm.model.name.NameTypeDesignationStatus;
58
import eu.etaxonomy.cdm.model.name.NomenclaturalStatusType;
59
import eu.etaxonomy.cdm.model.name.Rank;
60
import eu.etaxonomy.cdm.model.name.SpecimenTypeDesignationStatus;
61
import eu.etaxonomy.cdm.model.occurrence.DerivationEventType;
62
import eu.etaxonomy.cdm.model.occurrence.DeterminationModifier;
63
import eu.etaxonomy.cdm.model.occurrence.PreservationMethod;
64
import eu.etaxonomy.cdm.model.taxon.SynonymRelationshipType;
65
import eu.etaxonomy.cdm.model.taxon.TaxonRelationshipType;
66
import eu.etaxonomy.cdm.model.view.AuditEvent;
67
import eu.etaxonomy.cdm.persistence.dao.common.IDefinedTermDao;
68
import eu.etaxonomy.cdm.persistence.query.MatchMode;
69
import eu.etaxonomy.cdm.persistence.query.OrderHint;
70

    
71
/**
72
 * @author a.kohlbecker
73
 * @created 29.05.2008
74
 * @version 1.0
75
 */
76
@Repository
77
public class DefinedTermDaoImpl extends IdentifiableDaoBase<DefinedTermBase> implements IDefinedTermDao{
78
	private static final Logger logger = Logger.getLogger(DefinedTermDaoImpl.class);
79

    
80
	public DefinedTermDaoImpl() {
81
		super(DefinedTermBase.class);
82
		indexedClasses = new Class[34];
83
		indexedClasses[0] = InstitutionType.class;
84
		indexedClasses[1] = AnnotationType.class;
85
		indexedClasses[2] = ExtensionType.class;
86
		indexedClasses[3] = Language.class;
87
		indexedClasses[4] = MarkerType.class;
88
		indexedClasses[5] = AbsenceTerm.class;
89
		indexedClasses[6] = MeasurementUnit.class;
90
		indexedClasses[7] = Modifier.class;
91
		indexedClasses[8] = PresenceTerm.class;
92
		indexedClasses[9] = Scope.class;
93
		indexedClasses[10] = Sex.class;
94
		indexedClasses[11] = Stage.class;
95
		indexedClasses[12] = State.class;
96
		indexedClasses[13] = StatisticalMeasure.class;
97
		indexedClasses[14] = TextFormat.class;
98
		indexedClasses[15] = Continent.class;
99
		indexedClasses[16] = NamedArea.class;
100
		indexedClasses[17] = NamedAreaLevel.class;
101
		indexedClasses[18] = NamedAreaType.class;
102
		indexedClasses[19] = ReferenceSystem.class;
103
		indexedClasses[20] = TdwgArea.class;
104
		indexedClasses[21] = WaterbodyOrCountry.class;
105
		indexedClasses[22] = RightsTerm.class;
106
		indexedClasses[23] = HybridRelationshipType.class;
107
		indexedClasses[24] = NameRelationshipType.class;
108
		indexedClasses[25] = NameTypeDesignationStatus.class;
109
		indexedClasses[26] = NomenclaturalStatusType.class;
110
		indexedClasses[27] = Rank.class;
111
		indexedClasses[28] = SpecimenTypeDesignationStatus.class;
112
		indexedClasses[29] = DerivationEventType.class;
113
		indexedClasses[30] = DeterminationModifier.class;
114
		indexedClasses[31] = PreservationMethod.class;
115
		indexedClasses[32] = SynonymRelationshipType.class;
116
		indexedClasses[33] = TaxonRelationshipType.class;
117
	}
118

    
119
	/** 
120
	 * Searches by Label
121
	 * @see eu.etaxonomy.cdm.persistence.dao.common.ITitledDao#findByTitle(java.lang.String)
122
	 */
123
	public List<DefinedTermBase> findByTitle(String queryString) {
124
		return findByTitle(queryString, null);
125
	}
126
	
127

    
128
	/** 
129
	 * Searches by Label
130
	 * @see eu.etaxonomy.cdm.persistence.dao.common.ITitledDao#findByTitle(java.lang.String, eu.etaxonomy.cdm.model.common.CdmBase)
131
	 */
132
	public List<DefinedTermBase> findByTitle(String queryString, CdmBase sessionObject) {
133
		checkNotInPriorView("DefinedTermDaoImpl.findByTitle(String queryString, CdmBase sessionObject)");
134
		Session session = getSession();
135
		if ( sessionObject != null ) {// FIXME is this needed?
136
			session.update(sessionObject);
137
		}
138
		Query query = session.createQuery("select term from DefinedTermBase term join fetch term.representations representation where representation.label = :label");
139
		query.setParameter("label", queryString);
140
		return (List<DefinedTermBase>) query.list();
141

    
142
	}
143

    
144
	/* (non-Javadoc)
145
	 * @see eu.etaxonomy.cdm.persistence.dao.common.ITitledDao#findByTitleAndClass(java.lang.String, java.lang.Class)
146
	 */
147
	public List<DefinedTermBase> findByTitleAndClass(String queryString, Class<DefinedTermBase> clazz) {
148
		checkNotInPriorView("DefinedTermDaoImpl.findByTitleAndClass(String queryString, Class<DefinedTermBase> clazz)");
149
		Session session = getSession();
150
		Criteria crit = session.createCriteria(clazz);
151
		crit.add(Restrictions.ilike("persistentTitleCache", queryString));
152
		List<DefinedTermBase> results = crit.list();
153
		return results;
154
	}
155
	
156
	/* (non-Javadoc)
157
	 * @see eu.etaxonomy.cdm.persistence.dao.common.ITitledDao#findByTitle(java.lang.String, eu.etaxonomy.cdm.persistence.dao.common.ITitledDao.MATCH_MODE, int, int, java.util.List)
158
	 */
159
	public List<DefinedTermBase> findByTitle(String queryString, MatchMode matchMode, int page, int pagesize, List<Criterion> criteria) {
160
		//FIXME is query parametrised?
161
		checkNotInPriorView("DefinedTermDaoImpl.findByTitle(String queryString, ITitledDao.MATCH_MODE matchMode, int page, int pagesize, List<Criterion> criteria)");
162
		Criteria crit = getSession().createCriteria(type);
163
		crit.add(Restrictions.ilike("titleCache", matchMode.queryStringFrom(queryString)));
164
		crit.setMaxResults(pagesize);
165
		int firstItem = (page - 1) * pagesize + 1;
166
		crit.setFirstResult(firstItem);
167
		List<DefinedTermBase> results = crit.list();
168
		return results;
169
	}
170
	
171

    
172
	public WaterbodyOrCountry getCountryByIso(String iso639) {
173
		// If iso639 = "" query returns non-unique result. We prevent this here:
174
		if (iso639.equals("") ) { return null; }
175
		AuditEvent auditEvent = getAuditEventFromContext();
176
		if(auditEvent.equals(AuditEvent.CURRENT_VIEW)) {
177
		  Query query = getSession().createQuery("from WaterbodyOrCountry where iso3166_A2 = :isoCode"); 
178
		  query.setParameter("isoCode", iso639);
179
		  return (WaterbodyOrCountry) query.uniqueResult();
180
		} else {
181
			AuditQuery query = getAuditReader().createQuery().forEntitiesAtRevision(WaterbodyOrCountry.class,auditEvent.getRevisionNumber());
182
			query.add(AuditEntity.property("iso3166_A2").eq(iso639));
183
			return (WaterbodyOrCountry) query.getSingleResult();
184
		}
185
	}
186
	
187
	public <T extends DefinedTermBase> List<T> getDefinedTermByRepresentationText(String text, Class<T> clazz ) {
188
		return getDefinedTermByRepresentationText(text,clazz,null,null);
189
	}
190
	
191
	public <T extends DefinedTermBase> List<T> getDefinedTermByRepresentationText(String text, Class<T> clazz, Integer pageSize,Integer  pageNumber) {
192
		checkNotInPriorView("DefinedTermDaoImpl.getDefinedTermByRepresentationText(String text, Class<T> clazz, Integer pageSize,Integer  pageNumber)");		
193
		
194
		Criteria criteria = null;
195
		if(clazz == null) {
196
			criteria = getSession().createCriteria(type);
197
		} else {
198
			criteria = getSession().createCriteria(clazz);
199
		}
200
		
201
		criteria.createAlias("representations", "r").add(Restrictions.like("r.text", text));
202
		
203
		if(pageSize != null) {
204
			criteria.setMaxResults(pageSize);
205
		    if(pageNumber != null) {
206
		    	criteria.setFirstResult(pageNumber * pageSize);
207
		    }
208
		}
209
		
210
		return (List<T>) criteria.list();
211
	}
212
	
213
public int countDefinedTermByRepresentationText(String text, Class<? extends DefinedTermBase> clazz) {
214
	    checkNotInPriorView("DefinedTermDaoImpl.countDefinedTermByRepresentationText(String text, Class<? extends DefinedTermBase> clazz)");		
215
		Criteria criteria = null;
216
		if(clazz == null) {
217
			criteria = getSession().createCriteria(type);
218
		} else {
219
			criteria = getSession().createCriteria(clazz);
220
		}
221
		
222
		criteria.createAlias("representations", "r").add(Restrictions.like("r.text", text));
223

    
224
		
225
		 criteria.setProjection(Projections.rowCount());
226
			
227
		 return (Integer)criteria.uniqueResult();
228
	}
229
	
230
	/* (non-Javadoc)
231
	 * @see eu.etaxonomy.cdm.persistence.dao.common.IDefinedTermDao#getLangaugeByIso(java.lang.String)
232
	 */
233
	public Language getLanguageByIso(String iso639) {
234
		if (iso639.length() < 2 || iso639.length() > 3) {
235
			logger.warn("Invalid length " + iso639.length() + " of ISO code. Length must be 2 or 3.");
236
			return null;
237
		}
238
		String isoStandart = "iso639_" + (iso639.length() - 1);
239
		AuditEvent auditEvent = getAuditEventFromContext();
240
		if(auditEvent.equals(AuditEvent.CURRENT_VIEW)) {
241
		    Query query = getSession().createQuery("from Language where " + isoStandart + "= :isoCode"); 
242
		    query.setParameter("isoCode", iso639);
243
		    return (Language) query.uniqueResult();
244
		} else {
245
			AuditQuery query = getAuditReader().createQuery().forEntitiesAtRevision(Language.class,auditEvent.getRevisionNumber());
246
			query.add(AuditEntity.property(isoStandart).eq(iso639));
247
			return (Language)query.getSingleResult();
248
		}
249
	}
250
	
251
	/**
252
	 *  FIXME this will result in a query per language - could you, given that iso codes
253
	 *  are unique, use from Language where iso639_1 in (:isoCode) or iso639_2 in (:isoCode)
254
	 */
255
	public List<Language> getLanguagesByIso(List<String> iso639List) {
256
		List<Language> languages = new ArrayList<Language>(iso639List.size());
257
		for (String iso639 : iso639List) {
258
			languages.add(getLanguageByIso(iso639));
259
		}
260
		return languages;
261
	}
262
	
263
	public List<Language> getLanguagesByLocale(Enumeration<Locale> locales) {
264
		List<Language> languages = new ArrayList<Language>();
265
		while(locales.hasMoreElements()) {
266
			Locale locale = locales.nextElement();
267
			languages.add(getLanguageByIso(locale.getLanguage()));		
268
		}
269
		return languages;
270
	}
271

    
272
	public int count(NamedAreaLevel level, NamedAreaType type) {
273
		AuditEvent auditEvent = getAuditEventFromContext();
274
		if(auditEvent.equals(AuditEvent.CURRENT_VIEW)) {
275
		    Criteria criteria = getSession().createCriteria(NamedArea.class);
276
		
277
		    if(level != null) {
278
			    criteria.add(Restrictions.eq("level",level));
279
		    }
280
		
281
		    if(type != null) {
282
			    criteria.add(Restrictions.eq("type", type));
283
		    }
284
		
285
		    criteria.setProjection(Projections.rowCount());
286
		
287
		    return (Integer)criteria.uniqueResult();
288
		} else {
289
			AuditQuery query = getAuditReader().createQuery().forEntitiesAtRevision(NamedArea.class,auditEvent.getRevisionNumber());
290
			
291
			if(level != null) {
292
				query.add(AuditEntity.relatedId("level").eq(level.getId()));
293
		    }
294
		
295
		    if(type != null) {
296
		    	query.add(AuditEntity.relatedId("type").eq(type.getId()));
297
		    }
298
		    query.addProjection(AuditEntity.id().count("id"));
299
		    return ((Long)query.getSingleResult()).intValue();
300
		}
301
	}
302

    
303
	public int countMedia(DefinedTermBase definedTerm) {
304
		checkNotInPriorView("DefinedTermDaoImpl.countMedia(DefinedTermBase definedTerm)");
305
		Query query = getSession().createQuery("select count(media) from DefinedTermBase definedTerm join definedTerm.media media where definedTerm = :definedTerm");
306
	    query.setParameter("definedTerm", definedTerm);
307
	    
308
		return ((Long)query.uniqueResult()).intValue();
309
	}
310

    
311
	public List<Media> getMedia(DefinedTermBase definedTerm, Integer pageSize,	Integer pageNumber) {
312
		checkNotInPriorView("DefinedTermDaoImpl.getMedia(DefinedTermBase definedTerm, Integer pageSize,	Integer pageNumber)");
313
		Query query = getSession().createQuery("select media from DefinedTermBase definedTerm join definedTerm.media media where definedTerm = :definedTerm");
314
		query.setParameter("definedTerm", definedTerm);
315
		
316
		if(pageSize != null) {
317
			query.setMaxResults(pageSize);
318
		    if(pageNumber != null) {
319
		    	query.setFirstResult(pageNumber * pageSize);
320
		    }
321
		}
322
		
323
		return (List<Media>)query.list();
324
	}
325

    
326
	/* (non-Javadoc)
327
	 * @see eu.etaxonomy.cdm.persistence.dao.common.IDefinedTermDao#list(eu.etaxonomy.cdm.model.location.NamedAreaLevel, eu.etaxonomy.cdm.model.location.NamedAreaType, java.lang.Integer, java.lang.Integer)
328
	 */
329
	public List<NamedArea> list(NamedAreaLevel level, NamedAreaType type, Integer pageSize, Integer pageNumber) {
330
		AuditEvent auditEvent = getAuditEventFromContext();
331
		if(auditEvent.equals(AuditEvent.CURRENT_VIEW)) {
332
            Criteria criteria = getSession().createCriteria(NamedArea.class);
333
		
334
		    if(level != null) {
335
			    criteria.add(Restrictions.eq("level",level));
336
		    }
337
		
338
		    if(type != null) {
339
			    criteria.add(Restrictions.eq("type", type));
340
		    }
341
		
342
		    if(pageSize != null) {
343
			    criteria.setMaxResults(pageSize);
344
		        if(pageNumber != null) {
345
		    	    criteria.setFirstResult(pageNumber * pageSize);
346
		        }
347
		    }
348
		
349
		    return (List<NamedArea>)criteria.list();
350
		} else {
351
            AuditQuery query = getAuditReader().createQuery().forEntitiesAtRevision(NamedArea.class,auditEvent.getRevisionNumber());
352
			
353
			if(level != null) {
354
				query.add(AuditEntity.relatedId("level").eq(level.getId()));
355
		    }
356
		
357
		    if(type != null) {
358
		    	query.add(AuditEntity.relatedId("type").eq(type.getId()));
359
		    }
360
		  
361
		    return (List<NamedArea>)query.getResultList();
362
		}
363
	}
364
	
365
	/* (non-Javadoc)
366
	 * @see eu.etaxonomy.cdm.persistence.dao.common.IDefinedTermDao#list(eu.etaxonomy.cdm.model.location.NamedAreaLevel, eu.etaxonomy.cdm.model.location.NamedAreaType, java.lang.Integer, java.lang.Integer, java.util.List, java.util.List)
367
	 */
368
	public List<NamedArea> list(NamedAreaLevel level, NamedAreaType type, Integer pageSize, Integer pageNumber,
369
			List<OrderHint> orderHints, List<String> propertyPaths) {
370
		
371
		List<NamedArea> result;
372
		
373
		AuditEvent auditEvent = getAuditEventFromContext();
374
		if (auditEvent.equals(AuditEvent.CURRENT_VIEW)) {
375
			Criteria criteria = getSession().createCriteria(NamedArea.class);
376

    
377
			if (level != null) {
378
				criteria.add(Restrictions.eq("level", level));
379
			}
380
			if (type != null) {
381
				criteria.add(Restrictions.eq("type", type));
382
			}
383
			if(orderHints != null){
384
				addOrder(criteria,orderHints);
385
			}
386
			if (pageSize != null) {
387
				criteria.setMaxResults(pageSize);
388
				if (pageNumber != null) {
389
					criteria.setFirstResult(pageNumber * pageSize);
390
				}
391
			}
392
			
393
			result = criteria.list();
394
		} else {
395
			AuditQuery query = getAuditReader().createQuery().forEntitiesAtRevision(NamedArea.class,
396
				auditEvent.getRevisionNumber());
397
			if (level != null) {
398
				query.add(AuditEntity.relatedId("level").eq(level.getId()));
399
			}
400
			if (type != null) {
401
				query.add(AuditEntity.relatedId("type").eq(type.getId()));
402
			}
403
			result =  query.getResultList();
404
		}
405
		
406
		defaultBeanInitializer.initializeAll(result, propertyPaths);
407
		
408
		return result;
409
	}
410
	
411

    
412
	public <T extends DefinedTermBase> int countGeneralizationOf(T kindOf) {
413
		AuditEvent auditEvent = getAuditEventFromContext();
414
		if(auditEvent.equals(AuditEvent.CURRENT_VIEW)) {
415
		    Query query = getSession().createQuery("select count(term) from DefinedTermBase term where term.kindOf = :kindOf");
416
		    query.setParameter("kindOf", kindOf);
417
		    return ((Long)query.uniqueResult()).intValue();
418
		} else {
419
            AuditQuery query = getAuditReader().createQuery().forEntitiesAtRevision(DefinedTermBase.class,auditEvent.getRevisionNumber());
420
			query.add(AuditEntity.relatedId("kindOf").eq(kindOf.getId()));
421
		    query.addProjection(AuditEntity.id().count("id"));
422
		    return ((Long)query.getSingleResult()).intValue();
423
		}
424
	}
425

    
426
	public <T extends DefinedTermBase> int countIncludes(Set<T> partOf) {
427
		AuditEvent auditEvent = getAuditEventFromContext();
428
		if(auditEvent.equals(AuditEvent.CURRENT_VIEW)) {
429
    		Query query = getSession().createQuery("select count(term) from DefinedTermBase term where term.partOf in (:partOf)");
430
	    	query.setParameterList("partOf", partOf);
431
		    return ((Long)query.uniqueResult()).intValue();
432
		} else {
433
			Integer count = 0;
434
			for(T t : partOf) {
435
				AuditQuery query = getAuditReader().createQuery().forEntitiesAtRevision(DefinedTermBase.class,auditEvent.getRevisionNumber());
436
				query.add(AuditEntity.relatedId("partOf").eq(t.getId()));
437
			    query.addProjection(AuditEntity.id().count("id"));
438
			    count += ((Long)query.getSingleResult()).intValue();
439
			}
440
			return count;
441
		}
442
	}
443

    
444
	public <T extends DefinedTermBase> List<T> getGeneralizationOf(T kindOf, Integer pageSize, Integer pageNumber) {
445
		AuditEvent auditEvent = getAuditEventFromContext();
446
		if(auditEvent.equals(AuditEvent.CURRENT_VIEW)) {
447
		    Query query = getSession().createQuery("select term from DefinedTermBase term where term.kindOf = :kindOf");
448
		    query.setParameter("kindOf", kindOf);
449
		
450
		    if(pageSize != null) {
451
			    query.setMaxResults(pageSize);
452
		        if(pageNumber != null) {
453
		    	    query.setFirstResult(pageNumber * pageSize);
454
		        }
455
		    }
456
		
457
	        return (List<T>)query.list();
458
		} else {
459
			 AuditQuery query = getAuditReader().createQuery().forEntitiesAtRevision(DefinedTermBase.class,auditEvent.getRevisionNumber());
460
			 query.add(AuditEntity.relatedId("kindOf").eq(kindOf.getId()));
461
			
462
			 if(pageSize != null) {
463
			    query.setMaxResults(pageSize);
464
			     if(pageNumber != null) {
465
			  	    query.setFirstResult(pageNumber * pageSize);
466
			     }
467
			 }
468
			 
469
			 return (List<T>)query.getResultList();
470
		}
471
	}
472

    
473
	public <T extends DefinedTermBase> List<T> getIncludes(Set<T> partOf,	Integer pageSize, Integer pageNumber, List<String> propertyPaths) {
474
		AuditEvent auditEvent = getAuditEventFromContext();
475
		if(auditEvent.equals(AuditEvent.CURRENT_VIEW)) {
476
    		Query query = getSession().createQuery("select term from DefinedTermBase term where term.partOf in (:partOf)");
477
	    	query.setParameterList("partOf", partOf);
478
		 
479
		    if(pageSize != null) {
480
			    query.setMaxResults(pageSize);
481
		        if(pageNumber != null) {
482
		    	    query.setFirstResult(pageNumber * pageSize);
483
		        }
484
		    }
485
		    
486
		    List<T> results = (List<T>)query.list();
487
		    defaultBeanInitializer.initializeAll(results, propertyPaths);
488
		    return results; 
489
		} else {
490
			List<T> result = new ArrayList<T>();
491
			for(T t : partOf) {
492
				AuditQuery query = getAuditReader().createQuery().forEntitiesAtRevision(DefinedTermBase.class,auditEvent.getRevisionNumber());
493
				query.add(AuditEntity.relatedId("partOf").eq(t.getId()));
494
				if(pageSize != null) {
495
				    query.setMaxResults(pageSize);
496
			        if(pageNumber != null) {
497
			    	    query.setFirstResult(pageNumber * pageSize);
498
			        }
499
			    }			   
500

    
501
			    result.addAll((List<T>)query.getResultList());
502
			}
503
			defaultBeanInitializer.initializeAll(result, propertyPaths);
504
			return result;
505
		}
506
	}
507
	
508
	public <T extends DefinedTermBase> int countPartOf(Set<T> definedTerms) {
509
		checkNotInPriorView("DefinedTermDaoImpl.countPartOf(Set<T> definedTerms)");
510
		Query query = getSession().createQuery("select count(distinct definedTerm) from DefinedTermBase definedTerm join definedTerm.includes included where included in (:definedTerms)");
511
		query.setParameterList("definedTerms", definedTerms);
512
		return ((Long)query.uniqueResult()).intValue();
513
	}
514

    
515
	public <T extends DefinedTermBase> List<T> getPartOf(Set<T> definedTerms, Integer pageSize, Integer pageNumber, List<String> propertyPaths) {
516
		checkNotInPriorView("DefinedTermDaoImpl.getPartOf(Set<T> definedTerms, Integer pageSize, Integer pageNumber)");
517
		Query query = getSession().createQuery("select distinct definedTerm from DefinedTermBase definedTerm join definedTerm.includes included where included in (:definedTerms)");
518
		query.setParameterList("definedTerms", definedTerms);
519
		
520
		if(pageSize != null) {
521
			query.setMaxResults(pageSize);
522
		    if(pageNumber != null) {
523
		    	query.setFirstResult(pageNumber * pageSize);
524
		    }
525
		}
526
		List<T> r = (List<T>)query.list();
527
		/**
528
		 * For some weird reason, hibernate returns proxies (extending the superclass), not the actual class on this, 
529
		 * despite querying the damn database and returning the discriminator along with the rest of the object properties!
530
		 * 
531
		 * Probably a bug in hibernate, but we'll manually deproxy for now since the objects are initialized anyway, the 
532
		 * performance implications are small (we're swapping one array of references for another, not hitting the db or 
533
		 * cache). 
534
		 */
535
		List<T> results = new ArrayList<T>();
536
		if(!definedTerms.isEmpty()) {
537
		    Class<T> type = (Class<T>)definedTerms.iterator().next().getClass();
538
		    for(T t : r) {
539
			    results.add(CdmBase.deproxy(t, type));
540
		    }
541
		    defaultBeanInitializer.initializeAll(results, propertyPaths);
542
		}
543
		return results;
544
	}
545

    
546
	public DefinedTermBase findByUri(String uri) {
547
		AuditEvent auditEvent = getAuditEventFromContext();
548
		if(auditEvent.equals(AuditEvent.CURRENT_VIEW)) {
549
		    Query query = getSession().createQuery("select term from DefinedTermBase term where term.uri = :uri");
550
		    query.setParameter("uri", uri);
551
		    return (DefinedTermBase)query.uniqueResult();
552
		} else {
553
			AuditQuery query = getAuditReader().createQuery().forEntitiesAtRevision(DefinedTermBase.class,auditEvent.getRevisionNumber());
554
			query.add(AuditEntity.property("uri").eq(uri));
555
		    return (DefinedTermBase)query.getSingleResult();
556
		}
557
	}
558
	
559
	public <TERM extends DefinedTermBase> List<TERM> listByTermClass(Class<TERM> clazz, Integer limit, Integer start, List<OrderHint> orderHints, List<String> propertyPaths) {
560
//		checkNotInPriorView("DefinedTermDaoImpl.listByTermClass(Class<TERM> clazz, Integer limit, Integer start, List<OrderHint> orderHints, List<String> propertyPaths)");
561
		
562
		Query query = getSession().createQuery("from " + clazz.getSimpleName());
563
	    //query.setParameter("DTYPE", );
564
	    
565
	    List<TERM> result = query.list();
566
	    
567
	    defaultBeanInitializer.initializeAll(result, propertyPaths);
568
	    
569
	    return result;
570
	}	
571
}
(6-6/20)