Revision e66d9d39
Added by Katja Luther about 13 years ago
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
replace deprecated methods with new ones #2176