Project

General

Profile

« Previous | Next » 

Revision e66d9d39

Added by Katja Luther about 13 years ago

replace deprecated methods with new ones #2176

View differences:

cdmlib-persistence/src/main/java/eu/etaxonomy/cdm/persistence/dao/hibernate/taxon/TaxonDaoHibernateImpl.java
246 246
			Integer pageNumber, List<String> propertyPaths) {
247 247
				
248 248
		boolean doCount = false;
249
		long zstVorher;
250
		long zstNachher;
251

  
252
		zstVorher = System.currentTimeMillis();
249 253
		Query query = prepareTaxaByName(clazz, "nameCache", queryString, classification, matchMode, namedAreas, pageSize, pageNumber, doCount);
254
		
250 255
		if (query != null){
251 256
			List<TaxonBase> results = query.list();
257
			
252 258
			//results.addAll (prepareTaxaByCommonName(queryString, classification, matchMode, namedAreas, pageSize, pageNumber, doCount).list());
253 259
			defaultBeanInitializer.initializeAll(results, propertyPaths);
254 260
			//TaxonComparatorSearch comp = new TaxonComparatorSearch();
255 261
			//Collections.sort(results, comp);
262
			zstNachher = System.currentTimeMillis();
263
			System.out.println("Zeit ben?tigt (getTaxaByName): " + ((zstNachher - zstVorher)) + " msec " + results.size());
256 264
			return results;
257 265
		}
266
		
258 267
		return new ArrayList<TaxonBase>();
259 268
		
260 269
	}
261 270

  
271
	/*
272
	 * (non-Javadoc)
273
	 * @see eu.etaxonomy.cdm.persistence.dao.taxon.ITaxonDao#getTaxaByName(java.lang.Class, java.lang.String, eu.etaxonomy.cdm.model.taxon.Classification, eu.etaxonomy.cdm.persistence.query.MatchMode, java.util.Set, java.lang.Integer, java.lang.Integer, java.util.List)
274
	 */
275
	//new search for the editor, for performance issues the return values are only uuid and titleCache, to avoid the initialisation of all objects
276
	public List<UuidAndTitleCache<TaxonBase>> getTaxaByNameForEditor(Class<? extends TaxonBase> clazz, String queryString, Classification classification,
277
			MatchMode matchMode, Set<NamedArea> namedAreas, List<String> propertyPaths) {
278
		long zstVorher;
279
		long zstNachher;
280
		zstVorher = System.currentTimeMillis();		
281
		boolean doCount = false;
282
		Query query = prepareTaxaByNameForEditor(clazz, "nameCache", queryString, classification, matchMode, namedAreas, doCount);
283
		if (query != null){
284
			//TODO: only for testing!
285
			
286
			Iterator<Object[]> results = query.iterate();
287
			List<UuidAndTitleCache<TaxonBase>> resultObjects = new ArrayList<UuidAndTitleCache<TaxonBase>>();
288
			Object[] result;
289
			while (results.hasNext()){
290
				result = results.next();
291
				resultObjects.add( new UuidAndTitleCache((UUID) result[0], (String)result[1]));
292
			}
293
			//TODO: only for testing!
294
			zstNachher = System.currentTimeMillis();
295
			System.out.println("Zeit ben?tigt (getTaxaByNameForEditor): " + ((zstNachher - zstVorher)) + " msec " + resultObjects.size());
296
			
297
			return resultObjects;
298
			
299
		}
300
		return new ArrayList<UuidAndTitleCache<TaxonBase>>();
301
		
302
	}
303
	
262 304
	/*
263 305
	 * (non-Javadoc)
264 306
	 * @see eu.etaxonomy.cdm.persistence.dao.taxon.ITaxonDao#getTaxaByCommonName(java.lang.String, eu.etaxonomy.cdm.model.taxon.Classification, eu.etaxonomy.cdm.persistence.query.MatchMode, java.util.Set, java.lang.Integer, java.lang.Integer, java.util.List)
......
277 319
		
278 320
	}
279 321
	
322
	/**
323
	 * @param clazz
324
	 * @param searchField the field in TaxonNameBase to be searched through usually either <code>nameCache</code> or <code>titleCache</code>
325
	 * @param queryString
326
	 * @param classification TODO
327
	 * @param matchMode
328
	 * @param namedAreas
329
	 * @param pageSize
330
	 * @param pageNumber
331
	 * @param doCount
332
	 * @return
333
	 * 
334
	 *
335
	 */
336
	private Query prepareTaxaByNameForEditor(Class<? extends TaxonBase> clazz, String searchField, String queryString, Classification classification,
337
			MatchMode matchMode, Set<NamedArea> namedAreas, boolean doCount) {
338
		return prepareQuery(clazz, searchField, queryString, classification,
339
				matchMode, namedAreas, doCount, true);
340
	}
341
	
342
	private Query prepareQuery(Class<? extends TaxonBase> clazz, String searchField, String queryString, Classification classification,
343
			MatchMode matchMode, Set<NamedArea> namedAreas, boolean doCount, boolean doForEditor){
344
		
345
		String hqlQueryString = matchMode.queryStringFrom(queryString);
346
		String selectWhat;
347
		if (doForEditor){
348
			selectWhat = "t.uuid, t.titleCache";
349
		}else selectWhat = (doCount ? "count(t)": "t");
350
		
351
		String hql = "";
352
		Set<NamedArea> areasExpanded = new HashSet<NamedArea>();
353
		if(namedAreas != null && namedAreas.size() > 0){
354
			// expand areas and restrict by distribution area
355
			List<NamedArea> childAreas;
356
			Query areaQuery = getSession().createQuery("select childArea from NamedArea as childArea left join childArea.partOf as parentArea where parentArea = :area");
357
			expandNamedAreas(namedAreas, areasExpanded, areaQuery);
358
		}
359
		boolean doAreaRestriction = areasExpanded.size() > 0;
360
		
361
		Set<UUID> namedAreasUuids = new HashSet<UUID>();
362
		for (NamedArea area:areasExpanded){
363
			namedAreasUuids.add(area.getUuid());
364
		}
365
		
366
		String taxonSubselect = null;
367
		String synonymSubselect = null;
368
		
369
		if(classification != null){
370
			
371
			if(doAreaRestriction){
372
				
373
				taxonSubselect = "select t.id from" +
374
					" Distribution e" +
375
					" join e.inDescription d" +
376
					" join d.taxon t" +
377
					" join t.name n " +
378
					" join t.taxonNodes as tn "+
379
					" where" +
380
					" e.area.uuid in (:namedAreasUuids) AND" +
381
					" tn.classification = :classification" +
382
					" AND n." + searchField + " " + matchMode.getMatchOperator() + " :queryString";
383
				
384
				
385
				synonymSubselect = "select s.id from" +
386
					" Distribution e" +
387
					" join e.inDescription d" +
388
					" join d.taxon t" + // the taxa
389
					" join t.taxonNodes as tn "+
390
					" join t.synonymRelations sr" +
391
					" join sr.relatedFrom s" + // the synonyms
392
					" join s.name sn"+ 
393
					" where" +
394
					" e.area.uuid in (:namedAreasUuids) AND" +
395
					" tn.classification = :classification" +
396
					" AND sn." + searchField +  " " + matchMode.getMatchOperator() + " :queryString";
397
				
398
			} else {
399
				
400
				taxonSubselect = "select t.id from" +
401
					" Taxon t" +
402
					" join t.name n " +
403
					" join t.taxonNodes as tn "+
404
					" where" +
405
					" tn.classification = :classification" +
406
					" AND n." + searchField +  " " + matchMode.getMatchOperator() + " :queryString";
407
				
408
				synonymSubselect = "select s.id from" +
409
					" Taxon t" + // the taxa
410
					" join t.taxonNodes as tn "+
411
					" join t.synonymRelations sr" +
412
					" join sr.relatedFrom s" + // the synonyms
413
					" join s.name sn"+ 
414
					" where" +
415
					" tn.classification = :classification" +
416
					" AND sn." + searchField +  " " + matchMode.getMatchOperator() + " :queryString";
417
			}	
418
		} else {
419
			
420
			if(doAreaRestriction){
421
				
422
				taxonSubselect = "select t.id from " +
423
					" Distribution e" +
424
					" join e.inDescription d" +
425
					" join d.taxon t" +
426
					" join t.name n "+
427
					" where" +
428
					(doAreaRestriction ? " e.area.uuid in (:namedAreasUuids) AND" : "") +
429
					" n." + searchField +  " " + matchMode.getMatchOperator() + " :queryString";
430
				
431
				synonymSubselect = "select s.id from" +
432
					" Distribution e" +
433
					" join e.inDescription d" +
434
					" join d.taxon t" + // the taxa
435
					" join t.synonymRelations sr" +
436
					" join sr.relatedFrom s" + // the synonyms
437
					" join s.name sn"+ 
438
					" where" +
439
					(doAreaRestriction ? " e.area.uuid in (:namedAreasUuids) AND" : "") +
440
					" sn." + searchField +  " " + matchMode.getMatchOperator() + " :queryString";
441
				
442
			} else {
443
				
444
				taxonSubselect = "select t.id from " +
445
					" Taxon t" +
446
					" join t.name n "+
447
					" where" +
448
					" n." + searchField +  " " + matchMode.getMatchOperator() + " :queryString";
280 449

  
450
				synonymSubselect = "select s.id from" +
451
					" Taxon t" + // the taxa
452
					" join t.synonymRelations sr" +
453
					" join sr.relatedFrom s" + // the synonyms
454
					" join s.name sn"+ 
455
					" where" +
456
					" sn." + searchField +  " " + matchMode.getMatchOperator() + " :queryString";
457
			}
458
			
459
		
460
		}
461
		
462
		
463
		
464
		
465
		Query subTaxon = null;
466
		Query subSynonym = null;
467
		if(clazz.equals(Taxon.class)){
468
			// find Taxa
469
			subTaxon = getSession().createQuery(taxonSubselect).setParameter("queryString", hqlQueryString);
470
			//subTaxon = getSession().createQuery(taxonSubselect);
471
			
472
			if(doAreaRestriction){
473
				subTaxon.setParameterList("namedAreasUuids", namedAreasUuids);
474
			}	
475
			if(classification != null){
476
				subTaxon.setParameter("classification", classification);
477
			}
478
		} else if(clazz.equals(Synonym.class)){
479
			// find synonyms
480
			subSynonym = getSession().createQuery(synonymSubselect).setParameter("queryString", hqlQueryString);
481
			
482
			if(doAreaRestriction){
483
				subSynonym.setParameterList("namedAreasUuids", namedAreasUuids);
484
			}		
485
			if(classification != null){
486
				subSynonym.setParameter("classification", classification);
487
			}
488
		} else {
489
			// find taxa and synonyms
490
			subSynonym = getSession().createQuery(synonymSubselect).setParameter("queryString", hqlQueryString);
491
			subTaxon = getSession().createQuery(taxonSubselect).setParameter("queryString", hqlQueryString);
492
			if(doAreaRestriction){
493
				subTaxon.setParameterList("namedAreasUuids", namedAreasUuids);
494
				subSynonym.setParameterList("namedAreasUuids", namedAreasUuids);
495
			}
496
			if(classification != null){
497
				subTaxon.setParameter("classification", classification);
498
				subSynonym.setParameter("classification", classification);
499
			}
500
		}
501
		
502
		List<Integer> taxa = new ArrayList<Integer>();
503
		List<Integer> synonyms = new ArrayList<Integer>();
504
		if(clazz.equals(Taxon.class)){
505
			taxa = subTaxon.list();
506
			
507
		}else if (clazz.equals(Synonym.class)){
508
			synonyms = subSynonym.list();
509
		}else {
510
			taxa = subTaxon.list();
511
			synonyms = subSynonym.list();
512
		}
513
		if(clazz.equals(Taxon.class)){
514
			if  (taxa.size()>0){
515
				hql = "select " + selectWhat + " from " + clazz.getSimpleName() + " t" + " where t.id in (:taxa)";
516
			}else{
517
				hql = "select " + selectWhat + " from " + clazz.getSimpleName() + " t";
518
			}
519
		} else if(clazz.equals(Synonym.class) ){
520
			if (synonyms.size()>0){
521
				hql = "select " + selectWhat + " from " + clazz.getSimpleName() + " t" + " where t.id in (:synonyms)";		
522
			}else{
523
				hql = "select " + selectWhat + " from " + clazz.getSimpleName() + " t";
524
			}
525
		} else {
526
			if(synonyms.size()>0 && taxa.size()>0){
527
				hql = "select " + selectWhat + " from " + clazz.getSimpleName() + " t" + " where t.id in (:taxa) OR t.id in (:synonyms)";
528
			}else if (synonyms.size()>0 ){
529
				hql = "select " + selectWhat + " from " + clazz.getSimpleName() + " t" + " where t.id in (:synonyms)";	
530
			} else if (taxa.size()>0 ){
531
				hql = "select " + selectWhat + " from " + clazz.getSimpleName() + " t" + " where t.id in (:taxa) ";
532
			} else{
533
				hql = "select " + selectWhat + " from " + clazz.getSimpleName() + " t";
534
			}
535
		}
536
		
537
		if (hql == "") return null;
538
		if(!doCount){
539
			//hql += " order by t.titleCache"; //" order by t.name.nameCache";
540
			hql += " order by t.name.genusOrUninomial, case when t.name.specificEpithet like '\"%\"' then 1 else 0 end, t.name.specificEpithet, t.name.rank desc, t.name.nameCache";
541
			
542
    
543
		}
544
	
545
		Query query = getSession().createQuery(hql);
546
		
547
				
548
		if(clazz.equals(Taxon.class) && taxa.size()>0){
549
			//find taxa
550
			query.setParameterList("taxa", taxa );
551
		} else if(clazz.equals(Synonym.class) && synonyms.size()>0){
552
			// find synonyms
553
			query.setParameterList("synonyms", synonyms);
554
			
555
		
556
		} else {
557
			// find taxa and synonyms
558
			if (taxa.size()>0){
559
				query.setParameterList("taxa", taxa);
560
			}
561
			if (synonyms.size()>0){
562
				query.setParameterList("synonyms",synonyms);
563
			}
564
			if (taxa.size()== 0 && synonyms.size() == 0){
565
				return null;
566
			}
567
		}
568
		return query;
569
		
570
	}
571
	
572
	
281 573
	/**
282 574
	 * @param clazz
283 575
	 * @param searchField the field in TaxonNameBase to be searched through usually either <code>nameCache</code> or <code>titleCache</code>
......
297 589

  
298 590
		//TODO ? checkNotInPriorView("TaxonDaoHibernateImpl.countTaxaByName(String queryString, Boolean accepted, Reference sec)");
299 591

  
300
		String hqlQueryString = matchMode.queryStringFrom(queryString);
592
		/*String hqlQueryString = matchMode.queryStringFrom(queryString);
301 593
		
302 594
		String selectWhat = (doCount ? "count(t)": "t");
303 595
		
......
414 706
		
415 707
		
416 708
		
417
		// TODO  mysql needs  optimization:  see http://www.xaprb.com/blog/2006/04/30/how-to-optimize-subqueries-and-joins-in-mysql/#commen
709
		
418 710
		Query subTaxon = null;
419 711
		Query subSynonym = null;
420 712
		if(clazz.equals(Taxon.class)){
......
517 809
			if (taxa.size()== 0 && synonyms.size() == 0){
518 810
				return null;
519 811
			}
520
		}
521
		
812
		}*/
813
		Query query = prepareQuery(clazz, searchField, queryString, classification,
814
				matchMode, namedAreas, doCount, false);
522 815
		
523 816
		if(pageSize != null &&  !doCount) {
524 817
			query.setMaxResults(pageSize);

Also available in: Unified diff