Project

General

Profile

« Previous | Next » 

Revision 5e62e156

Added by Patrick Plitzner about 6 years ago

ref #7095 Speed up specimen loading

View differences:

cdmlib-persistence/src/main/java/eu/etaxonomy/cdm/persistence/dao/hibernate/occurrence/OccurrenceDaoHibernateImpl.java
19 19
import org.hibernate.Hibernate;
20 20
import org.hibernate.Query;
21 21
import org.hibernate.Session;
22
import org.hibernate.criterion.Disjunction;
22 23
import org.hibernate.criterion.Projections;
23 24
import org.hibernate.criterion.Restrictions;
24 25
import org.hibernate.envers.query.AuditEntity;
......
30 31

  
31 32
import eu.etaxonomy.cdm.model.common.CdmBase;
32 33
import eu.etaxonomy.cdm.model.description.DescriptionBase;
34
import eu.etaxonomy.cdm.model.description.DescriptionElementBase;
33 35
import eu.etaxonomy.cdm.model.description.IndividualsAssociation;
34 36
import eu.etaxonomy.cdm.model.media.Media;
35 37
import eu.etaxonomy.cdm.model.molecular.DnaSample;
......
569 571
    }
570 572

  
571 573
    @Override
572
    public <T extends SpecimenOrObservationBase> List<T> listByAssociatedTaxon(Class<T> type,
574
    public <T extends SpecimenOrObservationBase> List<T> listByAssociatedTaxon(Class<T> clazz,
573 575
            Taxon associatedTaxon, Integer limit, Integer start, List<OrderHint> orderHints, List<String> propertyPaths) {
574 576

  
575 577
        Set<SpecimenOrObservationBase> setOfAll = new HashSet<SpecimenOrObservationBase>();
576 578

  
579
        Criteria criteria = null;
580
        if(clazz == null) {
581
            criteria = getSession().createCriteria(type, "specimen");
582
        } else {
583
            criteria = getSession().createCriteria(clazz, "specimen");
584
        }
585

  
586
        Disjunction determinationOr = Restrictions.disjunction();
587

  
577 588
        // A Taxon may be referenced by the DeterminationEvent of the SpecimenOrObservationBase
578
        List<SpecimenOrObservationBase> byDetermination = list(type, associatedTaxon, null, 0, null, null);
579
        setOfAll.addAll(byDetermination);
589
        Criteria determinationsCriteria = criteria.createCriteria("determinations");
590

  
591
        determinationOr.add(Restrictions.eq("taxon", associatedTaxon));
580 592
        //check also for synonyms
581 593
        for (Synonym synonym : associatedTaxon.getSynonyms()) {
582
            setOfAll.addAll(list(type, synonym, null, 0, null, null));
594
            determinationOr.add(Restrictions.eq("taxon", synonym));
583 595
        }
596

  
584 597
        //check also for name determinations
585
        setOfAll.addAll(list(type, associatedTaxon.getName(), null, 0, null, null));
598
        determinationOr.add(Restrictions.eq("taxonName", associatedTaxon.getName()));
586 599
        for (TaxonName synonymName : associatedTaxon.getSynonymNames()) {
587
            setOfAll.addAll(list(type, synonymName, null, 0, null, null));
600
            determinationOr.add(Restrictions.eq("taxonName", synonymName));
588 601
        }
589 602

  
603
        determinationsCriteria.add(determinationOr);
590 604

  
591
        // The IndividualsAssociation elements in a TaxonDescription contain DerivedUnits
592
        List<IndividualsAssociation> byIndividualsAssociation = descriptionDao.getDescriptionElementForTaxon(
593
                associatedTaxon.getUuid(), null, IndividualsAssociation.class, null, 0, null);
594
        for(IndividualsAssociation individualsAssociation : byIndividualsAssociation){
595
            setOfAll.add(individualsAssociation.getAssociatedSpecimenOrObservation());
605
        if(limit != null) {
606
            if(start != null) {
607
                criteria.setFirstResult(start);
608
            } else {
609
                criteria.setFirstResult(0);
610
            }
611
            criteria.setMaxResults(limit);
596 612
        }
597 613

  
614
        addOrder(criteria,orderHints);
615

  
616
        @SuppressWarnings("unchecked")
617
        List<SpecimenOrObservationBase> detResults = criteria.list();
618
        defaultBeanInitializer.initializeAll(detResults, propertyPaths);
619
        setOfAll.addAll(detResults);
620

  
621
        // The IndividualsAssociation elements in a TaxonDescription contain DerivedUnits
622
        Criteria descriptionElementCriteria = getSession().createCriteria(DescriptionElementBase.class);
623
        Criteria inDescriptionCriteria = descriptionElementCriteria.createCriteria("inDescription").add(Restrictions.eqOrIsNull("class", "TaxonDescription"));
624
        Criteria taxonCriteria = inDescriptionCriteria.createCriteria("taxon");
625
        taxonCriteria.add(Restrictions.eq("uuid", associatedTaxon.getUuid()));
626
        descriptionElementCriteria.setProjection(Projections.property("associatedSpecimenOrObservation"));
627

  
628

  
629
        setOfAll.addAll(descriptionElementCriteria.list());
630

  
631

  
598 632
        // SpecimenTypeDesignations may be associated with the TaxonName.
599 633
        List<SpecimenTypeDesignation> bySpecimenTypeDesignation = taxonNameDao.getTypeDesignations(associatedTaxon.getName(),
600 634
                SpecimenTypeDesignation.class, null, null, 0, null);
......
620 654
            " from SpecimenOrObservationBase sob" +
621 655
            " where sob in (:setOfAll)";
622 656

  
623
        if(type != null && !type.equals(SpecimenOrObservationBase.class)){
624
            queryString += " and sob.class = :type";
657
        if(clazz != null && !clazz.equals(SpecimenOrObservationBase.class)){
658
            queryString += " and sob.class = :type ";
625 659
        }
626 660

  
627 661
        if(orderHints != null && orderHints.size() > 0){
......
639 673
        Query query = getSession().createQuery(queryString);
640 674
        query.setParameterList("setOfAll", setOfAll);
641 675

  
642
        if(type != null && !type.equals(SpecimenOrObservationBase.class)){
643
            query.setParameter("type", type.getSimpleName());
676
        if(clazz != null && !clazz.equals(SpecimenOrObservationBase.class)){
677
            query.setParameter("type", clazz.getSimpleName());
644 678
        }
645 679

  
646 680
        if(limit != null) {

Also available in: Unified diff