From d43fabd5ed69c06c6b5ab37796bdbd672e3956ad Mon Sep 17 00:00:00 2001 From: unknown Date: Wed, 22 Mar 2017 19:44:03 +0100 Subject: [PATCH] ref #6529 first implementation of WorkingSet taxon filter --- .../cdm/model/description/WorkingSet.java | 134 ++++++++++++++++-- .../update/v41_47/SchemaUpdater_41_47.java | 65 ++++----- 2 files changed, 149 insertions(+), 50 deletions(-) diff --git a/cdmlib-model/src/main/java/eu/etaxonomy/cdm/model/description/WorkingSet.java b/cdmlib-model/src/main/java/eu/etaxonomy/cdm/model/description/WorkingSet.java index e5c6d98c6f..2df4640b9b 100644 --- a/cdmlib-model/src/main/java/eu/etaxonomy/cdm/model/description/WorkingSet.java +++ b/cdmlib-model/src/main/java/eu/etaxonomy/cdm/model/description/WorkingSet.java @@ -16,6 +16,7 @@ import java.util.Set; import javax.persistence.Entity; import javax.persistence.FetchType; +import javax.persistence.JoinTable; import javax.persistence.ManyToMany; import javax.persistence.ManyToOne; import javax.persistence.OneToMany; @@ -38,6 +39,9 @@ import org.hibernate.envers.Audited; import eu.etaxonomy.cdm.model.common.AnnotatableEntity; import eu.etaxonomy.cdm.model.common.Language; import eu.etaxonomy.cdm.model.common.Representation; +import eu.etaxonomy.cdm.model.location.NamedArea; +import eu.etaxonomy.cdm.model.name.Rank; +import eu.etaxonomy.cdm.model.taxon.TaxonNode; /** * @@ -47,7 +51,6 @@ import eu.etaxonomy.cdm.model.common.Representation; * * @author h.fradin * @created 12.08.2009 - * @version 1.0 */ @XmlAccessorType(XmlAccessType.FIELD) @@ -68,7 +71,7 @@ public class WorkingSet extends AnnotatableEntity { @XmlElement(name = "Representation") @OneToMany(fetch=FetchType.EAGER) @Cascade( { CascadeType.SAVE_UPDATE, CascadeType.MERGE, CascadeType.DELETE }) - private Set representations = new HashSet(); + private Set representations = new HashSet<>(); @XmlElement(name = "DescriptiveSystem") @XmlIDREF @@ -84,8 +87,53 @@ public class WorkingSet extends AnnotatableEntity { @ManyToMany(fetch = FetchType.LAZY) @Cascade({CascadeType.SAVE_UPDATE,CascadeType.MERGE}) @NotNull - private Set descriptions = new HashSet(); + private Set descriptions = new HashSet<>(); + @XmlElementWrapper(name = "SubtreeTaxonFilter") + @XmlElement(name = "Subtree") + @XmlIDREF + @XmlSchemaType(name = "IDREF") + @ManyToMany(fetch = FetchType.LAZY) + @Cascade({CascadeType.SAVE_UPDATE,CascadeType.MERGE}) + @NotNull + //a positive filter that defines that all taxa in the subtree belong to + //the dataset. If the filter is NOT set, taxa need to be explicitly defined + //via the descriptions set. If the filter is set all taxa not having + //a description in descriptions yet are considered to have an empty description + //TODO what, if a taxon is removed from the subtree but a description exists in + //descriptions + private Set taxonSubtreeFilter = new HashSet<>(); + + @XmlElementWrapper(name = "GeoFilter") + @XmlElement(name = "FilteredArea") + @XmlIDREF + @XmlSchemaType(name = "IDREF") + @ManyToMany(fetch = FetchType.LAZY) + @Cascade({CascadeType.SAVE_UPDATE,CascadeType.MERGE}) + @JoinTable(name="WorkingSet_NamedArea") + @NotNull + private Set geoFilter = new HashSet<>(); + + @XmlElement(name = "minRank") + @XmlIDREF + @XmlSchemaType(name = "IDREF") + @ManyToOne(fetch = FetchType.LAZY) + private Rank minRank; + + @XmlElement(name = "maxRank") + @XmlIDREF + @XmlSchemaType(name = "IDREF") + @ManyToOne(fetch = FetchType.LAZY) + private Rank maxRank; + +// ******************* FACTORY *********************************************/ + + public static WorkingSet NewInstance(){ + return new WorkingSet(); + } + + +// *******************CONSTRUCTOR **********************************/ /** * Class constructor: creates a new empty working set instance. */ @@ -93,21 +141,63 @@ public class WorkingSet extends AnnotatableEntity { super(); } - /** - * Creates a new empty working set instance. - */ - public static WorkingSet NewInstance(){ - return new WorkingSet(); - } - +// ******************** GETTER / SETTER ************************/ + + + public Set getTaxonSubtreeFilter() { + return taxonSubtreeFilter; + } + + //make public if needed + private void setTaxonSubtreeFilter(Set taxonSubtreeFilter) { + this.taxonSubtreeFilter = taxonSubtreeFilter; + } + + public void addTaxonSubtree(TaxonNode subtree) { + this.taxonSubtreeFilter.add(subtree); + } + + public void removeTaxonSubtree(TaxonNode subtree) { + this.taxonSubtreeFilter.remove(subtree); + } + + //geo filter + public Set getGeoFilter() { + return geoFilter; + } + public void setGeoFilter(Set geoFilter) { + this.geoFilter = geoFilter; + } + public void addGeoFilterArea(NamedArea area){ + this.geoFilter.add(area); + } + public boolean removeGeoFilterArea(NamedArea area) { + return this.geoFilter.remove(area); + } + + //min rank + public Rank getMinRank() { + return minRank; + } + public void setMinRank(Rank minRank) { + this.minRank = minRank; + } + + //max rank + public Rank getMaxRank() { + return maxRank; + } + public void setMaxRank(Rank maxRank) { + this.maxRank = maxRank; + } + + //representations public Set getRepresentations() { return this.representations; } - public void addRepresentation(Representation representation) { this.representations.add(representation); } - public void removeRepresentation(Representation representation) { this.representations.remove(representation); } @@ -278,17 +368,31 @@ public class WorkingSet extends AnnotatableEntity { WorkingSet result; try { result = (WorkingSet)super.clone(); - result.descriptions = new HashSet(); - for (DescriptionBase desc: this.descriptions){ + //descriptions + result.descriptions = new HashSet<>(); + for (DescriptionBase desc: this.descriptions){ result.addDescription(desc); } - result.representations = new HashSet(); + //representations + result.representations = new HashSet<>(); for (Representation rep : this.representations){ result.addRepresentation((Representation)rep.clone()); } + //subtree filter + result.taxonSubtreeFilter = new HashSet<>(); + for (TaxonNode subtree : this.taxonSubtreeFilter){ + result.addTaxonSubtree(subtree); + } + + //geo filter + result.geoFilter = new HashSet<>(); + for (NamedArea area : this.geoFilter){ + result.addGeoFilterArea(area); + } + return result; }catch (CloneNotSupportedException e) { logger.warn("Object does not implement cloneable"); diff --git a/cdmlib-persistence/src/main/java/eu/etaxonomy/cdm/database/update/v41_47/SchemaUpdater_41_47.java b/cdmlib-persistence/src/main/java/eu/etaxonomy/cdm/database/update/v41_47/SchemaUpdater_41_47.java index 765e576989..9f168353e0 100644 --- a/cdmlib-persistence/src/main/java/eu/etaxonomy/cdm/database/update/v41_47/SchemaUpdater_41_47.java +++ b/cdmlib-persistence/src/main/java/eu/etaxonomy/cdm/database/update/v41_47/SchemaUpdater_41_47.java @@ -17,10 +17,8 @@ import org.apache.log4j.Logger; import eu.etaxonomy.cdm.database.update.ColumnAdder; import eu.etaxonomy.cdm.database.update.ISchemaUpdater; import eu.etaxonomy.cdm.database.update.ISchemaUpdaterStep; -import eu.etaxonomy.cdm.database.update.IndexAdder; -import eu.etaxonomy.cdm.database.update.LanguageStringTableCreator; +import eu.etaxonomy.cdm.database.update.MnTableCreator; import eu.etaxonomy.cdm.database.update.SchemaUpdaterBase; -import eu.etaxonomy.cdm.database.update.v40_41.NomenclaturalCodeUpdater; import eu.etaxonomy.cdm.database.update.v40_41.SchemaUpdater_40_41; /** @@ -60,46 +58,43 @@ public class SchemaUpdater_41_47 extends SchemaUpdaterBase { List stepList = new ArrayList(); - - //#3658 update nomenclatural code - NomenclaturalCodeUpdater.NewInstance(stepList); - - //#5970 - //Implement allowOverride in CdmPreference - stepName = "Add allowOverride in CdmPreference"; - tableName = "CdmPreference"; - newColumnName = "allowOverride"; - step = ColumnAdder.NewBooleanInstance(stepName, tableName, newColumnName, ! INCLUDE_AUDIT, false); + //#6529 + //Extend WorkingSet to allow a more fine grained definiton of taxon set + //min rank + stepName = "Add minRank column"; + tableName = "WorkingSet"; + newColumnName = "minRank_id"; + String referencedTable = "DefinedTermBase"; + step = ColumnAdder.NewIntegerInstance(stepName, tableName, newColumnName, INCLUDE_AUDIT, !NOT_NULL, referencedTable); stepList.add(step); - //#5875 - //Implement isDefault to DescriptionBase - stepName = "Add isDefault in DescriptionBase"; - tableName = "DescriptionBase"; - newColumnName = "isDefault"; - step = ColumnAdder.NewBooleanInstance(stepName, tableName, newColumnName, INCLUDE_AUDIT, false); + //max rank + stepName = "Add maxRank column"; + tableName = "WorkingSet"; + newColumnName = "maxRank_id"; + referencedTable = "DefinedTermBase"; + step = ColumnAdder.NewIntegerInstance(stepName, tableName, newColumnName, INCLUDE_AUDIT, !NOT_NULL, referencedTable); stepList.add(step); - - //index - stepName = "Add identityCache index"; - tableName = "SpecimenOrObservationBase"; - newColumnName = "identityCache"; - step = IndexAdder.NewInstance(stepName, tableName, newColumnName, null); + //subtree filter + stepName= "Add geo filter MN table to WorkingSet"; + String firstTableName = "WorkingSet"; + String secondTableName = "DefinedTermBase"; + String secondTableAlias = "NamedArea"; + boolean hasSortIndex = false; + boolean secondTableInKey = true; + step = MnTableCreator.NewMnInstance(stepName, firstTableName, null, secondTableName, secondTableAlias, SchemaUpdaterBase.INCLUDE_AUDIT, hasSortIndex, secondTableInKey); stepList.add(step); - stepName = "Add protectedIdentityCache"; - tableName = "SpecimenOrObservationBase"; - newColumnName = "protectedIdentityCache"; - step = ColumnAdder.NewBooleanInstance(stepName, tableName, newColumnName, INCLUDE_AUDIT, false); + //subtree filter + stepName= "Add subtree filter MN table to WorkingSet"; + firstTableName = "WorkingSet"; + secondTableName = "TaxonNode"; + hasSortIndex = false; + secondTableInKey = true; + step = MnTableCreator.NewMnInstance(stepName, firstTableName, null, secondTableName, secondTableAlias, SchemaUpdaterBase.INCLUDE_AUDIT, hasSortIndex, secondTableInKey); stepList.add(step); - //#5634 Add excluded note - stepName = "Add excluded note"; - tableName = "TaxonNode"; - String attributeName = "excludedNote"; - step = LanguageStringTableCreator.NewLanguageStringInstance(stepName, tableName, attributeName, INCLUDE_AUDIT); - stepList.add(step); return stepList; } -- 2.34.1