Project

General

Profile

« Previous | Next » 

Revision 7426d467

Added by Patrick Plitzner almost 6 years ago

ref #7095 Enhance quicker service for taxon associated specimens

View differences:

cdmlib-persistence/src/main/java/eu/etaxonomy/cdm/persistence/dao/hibernate/occurrence/OccurrenceDaoHibernateImpl.java
591 591
        return results;
592 592
    }
593 593

  
594

  
595
    @Override
596
    public List<SpecimenNodeWrapper> listUuidAndTitleCacheByAssociatedTaxon(List<UUID> taxonNodeUuids,
597
            Integer limit, Integer start, List<OrderHint> orderHints){
598

  
599
        String queryString = "SELECT "
594
    private List<SpecimenNodeWrapper> queryIndividualAssociatedSpecimen(List<UUID> taxonNodeUuids,
595
            Integer limit, Integer start, List<OrderHint> orderHintss){
596
        String queryString =  "SELECT "
600 597
                + "de.associatedSpecimenOrObservation.uuid, "
601 598
                + "de.associatedSpecimenOrObservation.id, "
602 599
                + "de.associatedSpecimenOrObservation.titleCache, "
603 600
                + "tn "
604
                + " FROM DescriptionElementBase AS de" +
605
                " LEFT JOIN de.inDescription AS d" +
606
                " LEFT JOIN d.taxon AS t" +
607
                " JOIN t.taxonNodes AS tn" +
608
                " WHERE d.class = 'TaxonDescription' "
601
                + "FROM DescriptionElementBase AS de "
602
                + "LEFT JOIN de.inDescription AS d "
603
                + "LEFT JOIN d.taxon AS t "
604
                + "JOIN t.taxonNodes AS tn "
605
                + "WHERE d.class = 'TaxonDescription' "
609 606
                + "AND tn.uuid in (:taxonNodeUuids) "
610 607
                ;
608
        Query query = getSession().createQuery(queryString);
609

  
610
        query.setParameterList("taxonNodeUuids", taxonNodeUuids);
611

  
612
        if(limit != null) {
613
            if(start != null) {
614
                query.setFirstResult(start);
615
            } else {
616
                query.setFirstResult(0);
617
            }
618
            query.setMaxResults(limit);
619
        }
620

  
621
        List<SpecimenNodeWrapper> list = new ArrayList<>();
622
        List<Object[]> result = query.list();
623
        for(Object[] object : result){
624
            list.add(new SpecimenNodeWrapper(
625
                    new UuidAndTitleCache<SpecimenOrObservationBase>(
626
                            (UUID) object[0],
627
                            (Integer) object[1],
628
                            (String) object[2]),
629
                    (TaxonNode)object[3]));
630
        }
631
        return list;
632
    }
633

  
634
    private List<SpecimenNodeWrapper> queryTypeSpecimen(List<UUID> taxonNodeUuids,
635
            Integer limit, Integer start, List<OrderHint> orderHints){
636
        String queryString =  "SELECT "
637
                + "td.typeSpecimen.uuid, "
638
                + "td.typeSpecimen.id, "
639
                + "td.typeSpecimen.titleCache, "
640
                + "tn "
641
                + "FROM SpecimenTypeDesignation AS td "
642
                + "LEFT JOIN td.typifiedNames AS tn "
643
                + "LEFT JOIN tn.taxonBases AS t "
644
                + "JOIN t.taxonNodes AS tn "
645
                + "WHERE tn.uuid in (:taxonNodeUuids) "
646
                ;
647
        Query query = getSession().createQuery(queryString);
648

  
649
        query.setParameterList("taxonNodeUuids", taxonNodeUuids);
650

  
651
        if(limit != null) {
652
            if(start != null) {
653
                query.setFirstResult(start);
654
            } else {
655
                query.setFirstResult(0);
656
            }
657
            query.setMaxResults(limit);
658
        }
659

  
660
        List<SpecimenNodeWrapper> list = new ArrayList<>();
661
        List<Object[]> result = query.list();
662
        for(Object[] object : result){
663
            list.add(new SpecimenNodeWrapper(
664
                    new UuidAndTitleCache<SpecimenOrObservationBase>(
665
                            (UUID) object[0],
666
                            (Integer) object[1],
667
                            (String) object[2]),
668
                    (TaxonNode)object[3]));
669
        }
670
        return list;
671
    }
672

  
673
    private List<SpecimenNodeWrapper> queryTaxonDeterminations(List<UUID> taxonNodeUuids,
674
            Integer limit, Integer start, List<OrderHint> orderHints){
675
        String queryString =  "SELECT "
676
                + "det.identifiedUnit.uuid, "
677
                + "det.identifiedUnit.id, "
678
                + "det.identifiedUnit.titleCache, "
679
                + "tn "
680
                + "FROM DeterminationEvent AS det "
681
                + "LEFT JOIN det.taxon AS t "
682
                + "JOIN t.taxonNodes AS tn "
683
                + "WHERE tn.uuid in (:taxonNodeUuids) "
684
                ;
685
        Query query = getSession().createQuery(queryString);
686

  
687
        query.setParameterList("taxonNodeUuids", taxonNodeUuids);
688

  
689
        if(limit != null) {
690
            if(start != null) {
691
                query.setFirstResult(start);
692
            } else {
693
                query.setFirstResult(0);
694
            }
695
            query.setMaxResults(limit);
696
        }
611 697

  
698
        List<SpecimenNodeWrapper> list = new ArrayList<>();
699
        List<Object[]> result = query.list();
700
        for(Object[] object : result){
701
            list.add(new SpecimenNodeWrapper(
702
                    new UuidAndTitleCache<SpecimenOrObservationBase>(
703
                            (UUID) object[0],
704
                            (Integer) object[1],
705
                            (String) object[2]),
706
                    (TaxonNode)object[3]));
707
        }
708
        return list;
709
    }
710

  
711
    private List<SpecimenNodeWrapper> queryTaxonNameDeterminations(List<UUID> taxonNodeUuids,
712
            Integer limit, Integer start, List<OrderHint> orderHints){
713
        String queryString =  "SELECT "
714
                + "det.identifiedUnit.uuid, "
715
                + "det.identifiedUnit.id, "
716
                + "det.identifiedUnit.titleCache, "
717
                + "tn "
718
                + "FROM DeterminationEvent AS det "
719
                + "LEFT JOIN det.taxonName AS n "
720
                + "LEFT JOIN n.taxonBases AS t "
721
                + "JOIN t.taxonNodes AS tn "
722
                + "WHERE tn.uuid in (:taxonNodeUuids) "
723
                ;
612 724
        Query query = getSession().createQuery(queryString);
613 725

  
614 726
        query.setParameterList("taxonNodeUuids", taxonNodeUuids);
......
635 747
        return list;
636 748
    }
637 749

  
750
    @Override
751
    public List<SpecimenNodeWrapper> listUuidAndTitleCacheByAssociatedTaxon(List<UUID> taxonNodeUuids,
752
            Integer limit, Integer start, List<OrderHint> orderHints){
753

  
754
        List<SpecimenNodeWrapper> list = new ArrayList<>();
755
        list.addAll(queryIndividualAssociatedSpecimen(taxonNodeUuids, limit, start, orderHints));
756
        list.addAll(queryTaxonDeterminations(taxonNodeUuids, limit, start, orderHints));
757
        list.addAll(queryTaxonNameDeterminations(taxonNodeUuids, limit, start, orderHints));
758
        list.addAll(queryTypeSpecimen(taxonNodeUuids, limit, start, orderHints));
759

  
760
        return list;
761
    }
762

  
638 763
    @Override
639 764
    public <T extends SpecimenOrObservationBase> List<UuidAndTitleCache<SpecimenOrObservationBase>> listUuidAndTitleCacheByAssociatedTaxon(Class<T> clazz, Taxon associatedTaxon,
640 765
            Integer limit, Integer start, List<OrderHint> orderHints){

Also available in: Unified diff