From: Andreas Müller Date: Wed, 24 Jan 2024 13:54:01 +0000 (+0100) Subject: ref #10400 implemented current/preferred determination as additional assoziation... X-Git-Tag: 5.42.0^2~53 X-Git-Url: https://dev.e-taxonomy.eu/gitweb/cdmlib.git/commitdiff_plain/75a0fec62bcd764c184e0f5be84d4c54595b727a ref #10400 implemented current/preferred determination as additional assoziation type --- diff --git a/cdmlib-api/src/main/java/eu/etaxonomy/cdm/api/filter/TaxonOccurrenceRelationType.java b/cdmlib-api/src/main/java/eu/etaxonomy/cdm/api/filter/TaxonOccurrenceRelationType.java index ac6b0d524a..63eeefe11e 100644 --- a/cdmlib-api/src/main/java/eu/etaxonomy/cdm/api/filter/TaxonOccurrenceRelationType.java +++ b/cdmlib-api/src/main/java/eu/etaxonomy/cdm/api/filter/TaxonOccurrenceRelationType.java @@ -13,6 +13,8 @@ import java.util.EnumSet; /** * Enumeration to define a filter for taxon-occurrence associations. * + * See also https://dev.e-taxonomy.eu/redmine/issues/10400 + * * @author muellera * @since 20.01.2024 */ @@ -20,6 +22,7 @@ public enum TaxonOccurrenceRelationType { IndividualsAssociation("IA"), Determination("DET"), + CurrentDetermination("CDET"), //only relevant if DET is not used as CurrentDetermination is a subset of Determination TypeDesignation("TD"); private String key; @@ -45,6 +48,9 @@ public enum TaxonOccurrenceRelationType { public static EnumSet Determinations(){ return EnumSet.of(Determination); } + public static EnumSet CurrentDeterminations(){ + return EnumSet.of(CurrentDetermination); + } public static EnumSet TypeDesignations(){ return EnumSet.of(TypeDesignation); } @@ -57,7 +63,4 @@ public enum TaxonOccurrenceRelationType { } return null; } - - - -} +} \ No newline at end of file diff --git a/cdmlib-model/src/main/java/eu/etaxonomy/cdm/model/occurrence/DeterminationEvent.java b/cdmlib-model/src/main/java/eu/etaxonomy/cdm/model/occurrence/DeterminationEvent.java index c7cf901049..8a80e8d4ca 100644 --- a/cdmlib-model/src/main/java/eu/etaxonomy/cdm/model/occurrence/DeterminationEvent.java +++ b/cdmlib-model/src/main/java/eu/etaxonomy/cdm/model/occurrence/DeterminationEvent.java @@ -37,6 +37,7 @@ import eu.etaxonomy.cdm.model.agent.AgentBase; import eu.etaxonomy.cdm.model.common.EventBase; import eu.etaxonomy.cdm.model.name.TaxonName; import eu.etaxonomy.cdm.model.reference.Reference; +import eu.etaxonomy.cdm.model.taxon.Synonym; import eu.etaxonomy.cdm.model.taxon.Taxon; import eu.etaxonomy.cdm.model.taxon.TaxonBase; import eu.etaxonomy.cdm.model.term.DefinedTerm; @@ -128,6 +129,14 @@ public class DeterminationEvent extends EventBase { return result; } + public static DeterminationEvent NewInstance(Synonym synonym, SpecimenOrObservationBase identifiedUnit ){ + DeterminationEvent result = new DeterminationEvent(); + result.setTaxon(synonym); + result.setIdentifiedUnit(identifiedUnit); + identifiedUnit.addDetermination(result); + return result; + } + //*********************** CONSTRUCTOR ********************************/ //for hibernate use only, *packet* private required by bytebuddy diff --git a/cdmlib-persistence/src/main/java/eu/etaxonomy/cdm/persistence/dao/hibernate/occurrence/OccurrenceDaoHibernateImpl.java b/cdmlib-persistence/src/main/java/eu/etaxonomy/cdm/persistence/dao/hibernate/occurrence/OccurrenceDaoHibernateImpl.java index 69853dacb2..2e464ab3ed 100644 --- a/cdmlib-persistence/src/main/java/eu/etaxonomy/cdm/persistence/dao/hibernate/occurrence/OccurrenceDaoHibernateImpl.java +++ b/cdmlib-persistence/src/main/java/eu/etaxonomy/cdm/persistence/dao/hibernate/occurrence/OccurrenceDaoHibernateImpl.java @@ -735,8 +735,10 @@ public class OccurrenceDaoHibernateImpl //Note: we don't pass limits and order to individual results query as the data is merged with other results //add determinations - if (taxonOccurrenceRelTypes.contains(TaxonOccurrenceRelationType.Determination)) { - List detResults = addAssociatedDeterminations(clazz, associatedTaxon); + if (taxonOccurrenceRelTypes.contains(TaxonOccurrenceRelationType.Determination) + || taxonOccurrenceRelTypes.contains(TaxonOccurrenceRelationType.CurrentDetermination)) { + boolean currentOnly = !taxonOccurrenceRelTypes.contains(TaxonOccurrenceRelationType.Determination); + List detResults = addAssociatedDeterminations(clazz, associatedTaxon, currentOnly); setOfAllIds.addAll(detResults); } @@ -829,7 +831,7 @@ public class OccurrenceDaoHibernateImpl * Computes the IDs of the specimen associated with a taxon via determinations */ private List addAssociatedDeterminations(Class clazz, - Taxon associatedTaxon) { + Taxon associatedTaxon, boolean currentOnly) { Criteria criteria = null; if(clazz == null) { @@ -839,6 +841,9 @@ public class OccurrenceDaoHibernateImpl } Criteria determinationsCriteria = criteria.createCriteria("determinations"); + if (currentOnly) { + determinationsCriteria.add(Restrictions.eq("preferredFlag", Boolean.TRUE)); + } Disjunction determinationOr = Restrictions.disjunction(); diff --git a/cdmlib-persistence/src/test/java/eu/etaxonomy/cdm/persistence/dao/hibernate/occurrence/OccurrenceDaoHibernateImplTest.java b/cdmlib-persistence/src/test/java/eu/etaxonomy/cdm/persistence/dao/hibernate/occurrence/OccurrenceDaoHibernateImplTest.java index 451eb4083d..d267608628 100644 --- a/cdmlib-persistence/src/test/java/eu/etaxonomy/cdm/persistence/dao/hibernate/occurrence/OccurrenceDaoHibernateImplTest.java +++ b/cdmlib-persistence/src/test/java/eu/etaxonomy/cdm/persistence/dao/hibernate/occurrence/OccurrenceDaoHibernateImplTest.java @@ -182,7 +182,7 @@ public class OccurrenceDaoHibernateImplTest extends CdmTransactionalIntegrationT final EnumSet taxonOccRelType = TaxonOccurrenceRelationType.All(); //load data - //TODO empty + //TODO make DB empty Taxon taxon = createListByAssociationTestData(); this.commitAndStartNewTransaction(); @@ -191,13 +191,13 @@ public class OccurrenceDaoHibernateImplTest extends CdmTransactionalIntegrationT List associatedUnits = dao.listByAssociatedTaxon( type, taxon, included_unpublished, taxonOccRelType, limit, start, orderHints, propertyPaths); - Assert.assertEquals("All directly associated specimen should be attached", 6, associatedUnits.size()); + Assert.assertEquals("All directly associated specimen should be attached", 7, associatedUnits.size()); //test published only associatedUnits = dao.listByAssociatedTaxon( type, taxon, no_unpublished, taxonOccRelType, limit, start, orderHints, propertyPaths); - Assert.assertEquals("All published directly associated specimen should be attached", 5, associatedUnits.size()); + Assert.assertEquals("All published directly associated specimen should be attached", 6, associatedUnits.size()); //test include individual associations associatedUnits = dao.listByAssociatedTaxon( @@ -209,6 +209,12 @@ public class OccurrenceDaoHibernateImplTest extends CdmTransactionalIntegrationT associatedUnits = dao.listByAssociatedTaxon( type, taxon, included_unpublished, TaxonOccurrenceRelationType.Determinations(), limit, start, orderHints, propertyPaths); + Assert.assertEquals("Only specimen associated via determination should be attached", 2, associatedUnits.size()); + + //test include current determinations only + associatedUnits = dao.listByAssociatedTaxon( + type, taxon, included_unpublished, TaxonOccurrenceRelationType.CurrentDeterminations(), + limit, start, orderHints, propertyPaths); Assert.assertEquals("Only specimen associated via determination should be attached", 1, associatedUnits.size()); //test include type specimens @@ -225,6 +231,7 @@ public class OccurrenceDaoHibernateImplTest extends CdmTransactionalIntegrationT limit, start, titleCacheOrder, propertyPaths); @SuppressWarnings("rawtypes") Iterator iterator = associatedUnits.iterator(); + Assert.assertEquals("FieldUnit 3", iterator.next().getTitleCache()); Assert.assertEquals("Specimen Accepted Name Type", iterator.next().getTitleCache()); Assert.assertEquals("Specimen Determination", iterator.next().getTitleCache()); Assert.assertEquals("Specimen Heterotypic Name Type 1", iterator.next().getTitleCache()); @@ -234,35 +241,37 @@ public class OccurrenceDaoHibernateImplTest extends CdmTransactionalIntegrationT //test limit + start int myLimit = 3; - int myStart = 1; + int myStart = 2; associatedUnits = dao.listByAssociatedTaxon( type, taxon, included_unpublished, taxonOccRelType, myLimit, myStart, titleCacheOrder, propertyPaths); Assert.assertEquals(myLimit, associatedUnits.size()); iterator = associatedUnits.iterator(); -// Assert.assertEquals("Specimen Accepted Name Type", iterator.next().getTitleCache()); + //this is a subset of the above test Assert.assertEquals("Specimen Determination", iterator.next().getTitleCache()); Assert.assertEquals("Specimen Heterotypic Name Type 1", iterator.next().getTitleCache()); Assert.assertEquals("Specimen Heterotypic Name Type 2", iterator.next().getTitleCache()); -// Assert.assertEquals("Specimen Homotypic Name Type", iterator.next().getTitleCache()); -// Assert.assertEquals("Specimen Individual Association", iterator.next().getTitleCache()); //test type + //... type all classes (default) Taxon fieldUnitTaxon = (Taxon)taxonDao.load(uuid_fieldUnitTaxon); associatedUnits = dao.listByAssociatedTaxon( type, fieldUnitTaxon, included_unpublished, taxonOccRelType, limit, start, orderHints, propertyPaths); //TODO do we really want to have the type of the homotypic synonym here // though it is not explicitly mentioned in the synonymy of field unit taxon? - Assert.assertEquals("Only field unit and the 2 derived units associated to the name " - + " and its homotypic group via type designation should be returned for field unit taxon", + Assert.assertEquals("Only field unit 1 (added via ind. ass.) and the 2 derived units " + + " associated to the name and its homotypic group via type designation " + + " should be returned for field unit taxon", 3, associatedUnits.size()); + //... test type = FieldUnit.class List fieldUnits = dao.listByAssociatedTaxon( FieldUnit.class, fieldUnitTaxon, included_unpublished, taxonOccRelType, limit, start, orderHints, propertyPaths); Assert.assertEquals("Only the field unit 1 should be attached to field unit taxon", 1, fieldUnits.size()); + //... test type = DerivedUnit.class List derivedUnits = dao.listByAssociatedTaxon( DerivedUnit.class, fieldUnitTaxon, included_unpublished, taxonOccRelType, limit, start, orderHints, propertyPaths); @@ -270,7 +279,7 @@ public class OccurrenceDaoHibernateImplTest extends CdmTransactionalIntegrationT + " be attached to field unit taxon", 2, derivedUnits.size()); //test synonyms - //TODO + //TODO not yet available in listByAssociatedTaxon() // Synonym heteroSyn_1 = (Synonym)taxonDao.load(uuid_hetero_syn_1); // associatedUnits = dao.listByAssociatedTaxon( // type, heteroSyn_1, included_unpublished, taxonOccRelType, @@ -300,7 +309,7 @@ public class OccurrenceDaoHibernateImplTest extends CdmTransactionalIntegrationT //homotypic synonym TaxonName name2 = TaxonNameFactory.NewBotanicalInstance(Rank.SPECIES(), "Pinus", null, "alba", null, null, null, null, null); - Synonym homoSyn = taxon.addHomotypicSynonymName(name2); + taxon.addHomotypicSynonymName(name2); //heterotypic group TaxonName name3 = TaxonNameFactory.NewBotanicalInstance(Rank.SPECIES(), "Abies", null, "pinus", null, null, null, null, null); @@ -349,20 +358,27 @@ public class OccurrenceDaoHibernateImplTest extends CdmTransactionalIntegrationT fu1.setTitleCache("FieldUnit 1", true); FieldUnit fu2 = DerivedUnitFacade.NewInstance(du_determination).getFieldUnit(true); FieldUnit fu3 = DerivedUnitFacade.NewInstance(du_accType).getFieldUnit(true); + fu3.setTitleCache("FieldUnit 3", true); FieldUnit fu4 = DerivedUnitFacade.NewInstance(du_homonymType).getFieldUnit(true); dao.save(fu1); dao.save(fu2); dao.save(fu3); dao.save(fu4); + //*** Add assoziations **** + //du1 is added as indiv. association TaxonDescription td = TaxonDescription.NewInstance(taxon); IndividualsAssociation ia = IndividualsAssociation.NewInstance(du_indAss); td.addElement(ia); - //du2 is added as determination + //du2 is assoziated as determination DeterminationEvent.NewInstance(taxon, du_determination); + //fu3 is assoziated with name3 (first heterotypic synonym) as current determination + DeterminationEvent de = DeterminationEvent.NewInstance(heteroSyn1.getName(), fu3); + de.setPreferredFlag(true); + //du3 is added as type designation for the accepted taxon name1.addSpecimenTypeDesignation(du_accType, SpecimenTypeDesignationStatus.HOLOTYPE(), null, null, null, false, false);