From 96c10a8854e6362eb64722fde481934249f6646a Mon Sep 17 00:00:00 2001 From: =?utf8?q?Andreas=20M=C3=BCller?= Date: Mon, 12 Sep 2016 16:25:07 +0200 Subject: [PATCH] fix #5957 fix IndexOutOfBound exception and some other improvements for groupByHigherTaxon --- .../persistence/dao/taxon/ITaxonNodeDao.java | 20 ++++--- .../service/ClassificationServiceImpl.java | 2 +- .../cdm/api/service/TreeIndexComparator.java | 11 +++- .../cdm/api/service/dto/GroupedTaxonDTO.java | 11 ++++ .../api/service/TreeIndexComparatorTest.java | 52 +++++++++++++++++++ 5 files changed, 86 insertions(+), 10 deletions(-) create mode 100644 cdmlib-services/src/test/java/eu/etaxonomy/cdm/api/service/TreeIndexComparatorTest.java diff --git a/cdmlib-persistence/src/main/java/eu/etaxonomy/cdm/persistence/dao/taxon/ITaxonNodeDao.java b/cdmlib-persistence/src/main/java/eu/etaxonomy/cdm/persistence/dao/taxon/ITaxonNodeDao.java index fd36c8eb27..4908eca48b 100644 --- a/cdmlib-persistence/src/main/java/eu/etaxonomy/cdm/persistence/dao/taxon/ITaxonNodeDao.java +++ b/cdmlib-persistence/src/main/java/eu/etaxonomy/cdm/persistence/dao/taxon/ITaxonNodeDao.java @@ -75,18 +75,24 @@ public interface ITaxonNodeDao extends IAnnotatableDao { long countTaxonNodeAgentRelations(UUID taxonUuid, UUID classificationUuid, UUID agentUuid, UUID rankUuid, UUID relTypeUuid); /** - * @param treeIndexClosure - * @param minRankOrderIndex - * @param maxRankOrderIndex + * Computes a map treeIndex->rank(sortIndex) for each given taxon node treeIndex. Required by #5957. + * If the taxon represented by the treeindex is not in the given rank range no record is returned for the given + * treeindex. + * + * @param treeIndex the list of treeIndexes + * @param minRankOrderIndex min rank + * @param maxRankOrderIndex max rank * @return */ - Map rankOrderIndexForTreeIndex(List treeIndexClosure, Integer minRankOrderIndex, + Map rankOrderIndexForTreeIndex(List treeIndex, Integer minRankOrderIndex, Integer maxRankOrderIndex); /** - * @param keySet - * @return + * For a given set of taxon node tree indexes the uuid and title cache of the taxon represented + * by this treeindex is returned. + * @param treeIndexSet set of taxon node tree indexes + * @return map with treeindex and uuidAndTitleCache of the represented taxon */ - Map> taxonUuidsForTreeIndexes(Set keySet); + Map> taxonUuidsForTreeIndexes(Set treeIndexSet); } diff --git a/cdmlib-services/src/main/java/eu/etaxonomy/cdm/api/service/ClassificationServiceImpl.java b/cdmlib-services/src/main/java/eu/etaxonomy/cdm/api/service/ClassificationServiceImpl.java index 0283481887..52b02a93e8 100755 --- a/cdmlib-services/src/main/java/eu/etaxonomy/cdm/api/service/ClassificationServiceImpl.java +++ b/cdmlib-services/src/main/java/eu/etaxonomy/cdm/api/service/ClassificationServiceImpl.java @@ -625,7 +625,7 @@ public class ClassificationServiceImpl extends IdentifiableServiceBase taxonIdTreeIndexMap = dao.treeIndexForTaxonUuids(classificationUuid, originalTaxonUuids); - //build treeindex tree or list + //build treeindex list (or tree) List treeIndexClosure = new ArrayList<>(); for (String treeIndex : taxonIdTreeIndexMap.values()){ String[] splits = treeIndex.substring(1).split(ITreeNode.separator); diff --git a/cdmlib-services/src/main/java/eu/etaxonomy/cdm/api/service/TreeIndexComparator.java b/cdmlib-services/src/main/java/eu/etaxonomy/cdm/api/service/TreeIndexComparator.java index 35c7be89a5..3fa24c6aa1 100644 --- a/cdmlib-services/src/main/java/eu/etaxonomy/cdm/api/service/TreeIndexComparator.java +++ b/cdmlib-services/src/main/java/eu/etaxonomy/cdm/api/service/TreeIndexComparator.java @@ -17,6 +17,9 @@ import eu.etaxonomy.cdm.model.common.ITreeNode; * @author a.mueller * @date 05.07.2016 * + * Comparator for treeindexes. + * Compares the tree indexes node by node, sorted by node number. + * If one index is shorter than the other one but */ public class TreeIndexComparator implements Comparator{ @@ -29,12 +32,16 @@ public class TreeIndexComparator implements Comparator{ }else if (treeIndex2 == null){ return 1; } + if (treeIndex1.equals(treeIndex2)){ + return 0; + } + String[] splits1 = treeIndex1.split(ITreeNode.separator); String[] splits2 = treeIndex2.split(ITreeNode.separator); - for (int i=0; i comparator.compare(null, "#t10#10#")); + Assert.assertTrue(0 < comparator.compare("#t10#10#", null)); + //equal + Assert.assertTrue(0 == comparator.compare("#t10#10#", "#t10#10#")); + + //same start + Assert.assertTrue(0 > comparator.compare("#t10#10#", "#t10#10#20#")); + Assert.assertTrue(0 < comparator.compare("#t10#10#20#", "#t10#10#")); + + //different ends + Assert.assertTrue(0 > comparator.compare("#t10#10#20#", "#t10#10#30#")); + Assert.assertTrue(0 < comparator.compare("#t10#10#30#", "#t10#10#20#")); + + //different ends + Assert.assertTrue(0 > comparator.compare("#t10#10#20#", "#t10#10#30#")); + Assert.assertTrue(0 > comparator.compare("#t10#10#20#", "#t10#10#30#11")); + + Assert.assertTrue(0 < comparator.compare("#t10#10#30#", "#t10#10#20#")); + Assert.assertTrue(0 < comparator.compare("#t10#10#30#11", "#t10#10#20#")); + + } + +} -- 2.34.1