ref #10178: rank implementation
authorBelen Escobari <b.escobari@bo.berlin>
Mon, 29 Apr 2024 13:27:52 +0000 (15:27 +0200)
committerBelen Escobari <b.escobari@bo.berlin>
Mon, 29 Apr 2024 13:28:59 +0000 (15:28 +0200)
cdmlib-api/src/main/java/eu/etaxonomy/cdm/api/nameMatching/NameMatchingCombinedResult.java
cdmlib-persistence/src/main/java/eu/etaxonomy/cdm/persistence/dao/hibernate/name/NameMatchingDaoHibernateImpl.java
cdmlib-persistence/src/main/java/eu/etaxonomy/cdm/persistence/dto/NameMatchingParts.java
cdmlib-remote/src/main/java/eu/etaxonomy/cdm/remote/controller/NameMatchingController.java
cdmlib-remote/src/main/java/eu/etaxonomy/cdm/remote/json/processor/bean/NameMatchingResultBeanProcessor.java
cdmlib-services/src/main/java/eu/etaxonomy/cdm/api/service/INameMatchingService.java
cdmlib-services/src/main/java/eu/etaxonomy/cdm/api/service/NameMatchingServiceImpl.java
cdmlib-services/src/test/java/eu/etaxonomy/cdm/api/service/NameMatchingServiceImplTest.java
cdmlib-services/src/test/resources/eu/etaxonomy/cdm/api/service/NameMatchingServiceImplTest.testFindMatchingNames.xml

index be7b0d3b15cda7d8360ab21061811da58d4980f9..365cfea2e7cb7e7e69d479ef6e52cf277edb78de 100644 (file)
@@ -14,8 +14,7 @@ import java.util.List;
 public class NameMatchingCombinedResult{
 
     private List<NameMatchingExactResult> exactMatches = new ArrayList<>();
-    private List<NameMatchingCandidateResult> closestMatches = new ArrayList<>();
-    private List<NameMatchingOtherCandidateResult> otherCandidates = new ArrayList<>();
+    private List<NameMatchingCandidateResult> candidates = new ArrayList<>();
 
     public List<NameMatchingExactResult> getExactMatches() {
         return exactMatches;
@@ -24,16 +23,10 @@ public class NameMatchingCombinedResult{
         this.exactMatches = exactMatches;
     }
 
-    public List<NameMatchingCandidateResult> getClosestMatches() {
-        return closestMatches;
+    public List<NameMatchingCandidateResult> getCandidates() {
+        return candidates;
     }
-    public void setClosestMatches(List<NameMatchingCandidateResult> closestMatches) {
-        this.closestMatches = closestMatches;
-    }
-    public List<NameMatchingOtherCandidateResult> getOtherCandidates() {
-        return otherCandidates;
-    }
-    public void setOtherCandidates(List<NameMatchingOtherCandidateResult> otherCandidates) {
-        this.otherCandidates = otherCandidates;
+    public void setCandidates(List<NameMatchingCandidateResult> candidates) {
+        this.candidates = candidates;
     }
 }
\ No newline at end of file
index f9fc4ad5fa58dddafd4cec00299f5afee1f18be6..14b395ac7a7d81d2fcce282a31e81178896bc621 100644 (file)
@@ -74,7 +74,7 @@ public class NameMatchingDaoHibernateImpl
         StringBuilder hql = new StringBuilder();
 
         hql.append("select new eu.etaxonomy.cdm.persistence.dto.NameMatchingParts(n.id, n.uuid, n.titleCache, n.authorshipCache, "
-              + "n.genusOrUninomial, n.infraGenericEpithet, n.specificEpithet, n.infraSpecificEpithet, n.nameCache)");
+              + "n.genusOrUninomial, n.infraGenericEpithet, n.specificEpithet, n.infraSpecificEpithet, n.nameCache, n.rank)");
         hql.append(" from TaxonName n ");
         hql.append("where 1 = 1 ");
         hql.append("and n."+column+ " in (");
index 1ed51eea9041496729973cdc473c279943d057dc..d3a4422083405e8e85570b2816a8f4706a26ee51 100644 (file)
@@ -11,6 +11,8 @@ package eu.etaxonomy.cdm.persistence.dto;
 
 import java.util.UUID;
 
+import eu.etaxonomy.cdm.model.name.Rank;
+
 /**
  * @author andreabee90
  */
@@ -34,13 +36,15 @@ public class NameMatchingParts {
 
     private String nameCache;
 
+    private Rank rank;
+
 //************ CONSTRUCTOR ***********************/
 
     public NameMatchingParts() {
     }
 
     public NameMatchingParts(Integer taxonNameId, UUID taxonNameUuid, String titleCache, String authorshipCache,
-            String genusOrUninomial, String infraGenericEpithet, String specificEpithet, String infraSpecificEpithet, String nameCache) {
+            String genusOrUninomial, String infraGenericEpithet, String specificEpithet, String infraSpecificEpithet, String nameCache, Rank rank) {
 
         this.taxonNameId = taxonNameId;
         this.taxonNameUuid = taxonNameUuid;
@@ -51,9 +55,11 @@ public class NameMatchingParts {
         this.specificEpithet = specificEpithet;
         this.infraSpecificEpithet = infraSpecificEpithet;
         this.nameCache = nameCache;
+        this.rank = rank;
     }
 
 //***************** GETTER / SETTER ********************************/
+
     public Integer getTaxonNameId() {
         return taxonNameId;
     }
@@ -126,12 +132,21 @@ public class NameMatchingParts {
         this.nameCache = nameCache;
     }
 
+    public Rank getRank() {
+        return rank;
+    }
+
+    public void setRank(Rank rank) {
+        this.rank = rank;
+    }
+
+
  // ************************** TO STRING *************************************/
 
     @Override
     public String toString() {
         return "NameMatchingParts [taxonNameId=" + taxonNameId + ", genusOrUninomial=" + genusOrUninomial
                 + ", infraGenericEpithet=" + infraGenericEpithet + ", specificEpithet=" + specificEpithet
-                + ", infraSpecificEpithet=" + infraSpecificEpithet + ", nameCache=" + nameCache + "]";
+                + ", infraSpecificEpithet=" + infraSpecificEpithet + ", nameCache=" + nameCache + ", rank=" + rank + "]";
     }
 }
\ No newline at end of file
index b03d35394ab3a1967bdc5910a5528b64720353a4..40bebd9335184924c27657e11a5d4d838117508e 100644 (file)
@@ -25,7 +25,6 @@ import org.springframework.web.bind.annotation.RestController;
 import eu.etaxonomy.cdm.api.nameMatching.NameMatchingCandidateResult;
 import eu.etaxonomy.cdm.api.nameMatching.NameMatchingCombinedResult;
 import eu.etaxonomy.cdm.api.nameMatching.NameMatchingExactResult;
-import eu.etaxonomy.cdm.api.nameMatching.NameMatchingOtherCandidateResult;
 import eu.etaxonomy.cdm.api.service.INameMatchingService;
 import eu.etaxonomy.cdm.api.service.NameMatchingServiceImpl.NameMatchingResult;
 import eu.etaxonomy.cdm.api.service.NameMatchingServiceImpl.SingleNameMatchingResult;
@@ -52,28 +51,24 @@ public class NameMatchingController {
             method = RequestMethod.GET)
     public NameMatchingCombinedResult doGetNameMatching(
             @RequestParam(value="namecache", required = true) String nameCache,
-            @RequestParam(value="author", required = false) boolean compareAuthor,
-            @RequestParam(value="distance", required = false) int distance,
-            @RequestParam(value="relaxedsearch", required = false) boolean relaxedSearch,
-            @RequestParam(value="othercandidates", required = false) boolean otherCandidates,
+            @RequestParam(value="compareauthor", required = false) boolean compareAuthor,
+            @RequestParam(value="distance", required = false) Integer distance,
             HttpServletRequest request,
             @SuppressWarnings("unused") HttpServletResponse response) {
 
         logger.info("doGetNameMatching()" + request.getRequestURI());
 
-        NameMatchingResult result;
+        NameMatchingResult result = nameMatchingservice.listShaping(nameCache, compareAuthor, distance);
 
-        result = nameMatchingservice.wrapperResults(nameCache, compareAuthor, distance, relaxedSearch, otherCandidates);
         return NameMatchingAdapter.invoke(result);
     }
 
     private static class NameMatchingAdapter {
 
-        private static NameMatchingCombinedResult invoke(NameMatchingResult nameMatchingResult) {
+        private static NameMatchingCombinedResult invoke(NameMatchingResult innerResult) {
             NameMatchingCombinedResult result = new NameMatchingCombinedResult();
-            result.setExactMatches(loadResultListFromPartsList(nameMatchingResult.getExactResults()));
-            result.setClosestMatches(loadCandiateResultListFromPartsList(nameMatchingResult.getClosestResults()));
-            result.setOtherCandidates(loadOtherCandiateResultListFromPartsList(nameMatchingResult.getOtherCandidatesResults()));
+            result.setExactMatches(loadResultListFromPartsList(innerResult.getExactResults()));
+            result.setCandidates(loadCandiateResultListFromPartsList(innerResult.getBestResults()));
             return result;
         }
 
@@ -85,10 +80,6 @@ public class NameMatchingController {
             return partsList.stream().map(p->loadCandidateResultFromParts(p)).collect(Collectors.toList());
         }
 
-        private static List<NameMatchingOtherCandidateResult> loadOtherCandiateResultListFromPartsList(List<SingleNameMatchingResult> partsList) {
-            return partsList.stream().map(p->loadOtherCandidateResultFromParts(p)).collect(Collectors.toList());
-        }
-
         private static NameMatchingExactResult loadResultFromParts(NameMatchingParts parts) {
            return loadResultFromParts(parts, new NameMatchingExactResult());
         }
@@ -100,13 +91,6 @@ public class NameMatchingController {
             return result;
         }
 
-        private static NameMatchingOtherCandidateResult loadOtherCandidateResultFromParts(SingleNameMatchingResult parts) {
-            NameMatchingOtherCandidateResult result = new NameMatchingOtherCandidateResult();
-            loadResultFromParts(parts, result);
-            result.setDistance(parts.getDistance());
-            return result;
-        }
-
         private static NameMatchingExactResult loadResultFromParts(NameMatchingParts parts, NameMatchingExactResult result) {
             result.setTaxonNameId(parts.getTaxonNameId());
             result.setTaxonNameUuid(parts.getTaxonNameUuid());
index 5ea6f7c1e7f8e0b203175a85e623e959057cebbe..7e45f0534bc9a2400e86c471ce9b7710aa1edf60 100644 (file)
@@ -28,7 +28,7 @@ public class NameMatchingResultBeanProcessor extends AbstractBeanProcessor<NameM
     @Override
     public JSONObject processBeanSecondStep(NameMatchingCombinedResult bean, JSONObject json, JsonConfig jsonConfig) {
         json.element("exactMatches", bean.getExactMatches(), jsonConfig);
-        json.element("candidates", bean.getClosestMatches(), jsonConfig);
+        json.element("candidates", bean.getCandidates(), jsonConfig);
         return json;
     }
 }
\ No newline at end of file
index fe3da6d21095120748591d9c5cefe847689dd74e..c8fa3d48428871161a808a01e5e7e2cffaf9a159 100644 (file)
@@ -8,7 +8,10 @@
 */
 package eu.etaxonomy.cdm.api.service;
 
+import java.util.List;
+
 import eu.etaxonomy.cdm.api.service.NameMatchingServiceImpl.NameMatchingResult;
+import eu.etaxonomy.cdm.api.service.NameMatchingServiceImpl.SingleNameMatchingResult;
 import eu.etaxonomy.cdm.api.service.config.NameMatchingConfigurator;
 
 /**
@@ -17,11 +20,9 @@ import eu.etaxonomy.cdm.api.service.config.NameMatchingConfigurator;
  */
 public interface INameMatchingService  {
 
-       public NameMatchingResult findMatchingNames(String taxonName, NameMatchingConfigurator config, boolean compareAuthor, Integer inputDistance);
-
-        public NameMatchingResult listShaping(String nameCache, boolean compareAuthor, Integer distance);
+       public List<SingleNameMatchingResult> findMatchingNames(String taxonName, NameMatchingConfigurator config, boolean compareAuthor, Integer inputDistance);
 
-        public NameMatchingResult wrapperResults(String nameCache, boolean compareAuthor, Integer distance, boolean relaxedSearch, boolean otherCandidates);
+       public NameMatchingResult listShaping(String nameCache, boolean compareAuthor, Integer distance);
 
 //     public Map<String, List<SingleNameMatchingResult>> compareTaxonListNameCache(List<String> input);
 //
index 81710bdb75085e2610c0fae4706f382d62e0f6d7..4ee3cfc28ff90a99d4647a630957b57c2b2b6b0d 100644 (file)
@@ -21,6 +21,7 @@ import org.springframework.transaction.annotation.Transactional;
 
 import eu.etaxonomy.cdm.api.service.config.NameMatchingConfigurator;
 import eu.etaxonomy.cdm.common.NameMatchingUtils;
+import eu.etaxonomy.cdm.model.name.Rank;
 import eu.etaxonomy.cdm.model.name.TaxonName;
 import eu.etaxonomy.cdm.persistence.dao.initializer.IBeanInitializer;
 import eu.etaxonomy.cdm.persistence.dao.name.INameMatchingDao;
@@ -66,7 +67,7 @@ public class NameMatchingServiceImpl
         public SingleNameMatchingResult(NameMatchingParts parts, Integer distance) {
             super(parts.getTaxonNameId(), parts.getTaxonNameUuid(), parts.getTitleCache(),
                     parts.getAuthorshipCache(), parts.getGenusOrUninomial(),
-                    parts.getInfraGenericEpithet(), parts.getSpecificEpithet(), parts.getInfraSpecificEpithet(), parts.getNameCache());
+                    parts.getInfraGenericEpithet(), parts.getSpecificEpithet(), parts.getInfraSpecificEpithet(), parts.getNameCache(), parts.getRank());
             this.distance = distance;
         }
 
@@ -81,8 +82,8 @@ public class NameMatchingServiceImpl
     public class NameMatchingResult{
 
         List<SingleNameMatchingResult> exactResults = new ArrayList<>();
-        List<SingleNameMatchingResult> closestResults = new ArrayList<>();
-        List<SingleNameMatchingResult> otherCandidatesResults = new ArrayList<>();
+        List<SingleNameMatchingResult> bestResults = new ArrayList<>();
+        //List<SingleNameMatchingResult> otherCandidatesResults = new ArrayList<>();
 
         public List<SingleNameMatchingResult> getExactResults() {
             return exactResults;
@@ -90,17 +91,11 @@ public class NameMatchingServiceImpl
         public void setExactResults(List<SingleNameMatchingResult> exactResults) {
             this.exactResults = exactResults;
         }
-        public List<SingleNameMatchingResult> getClosestResults() {
-            return closestResults;
-        }
-        public void setClosestResults(List<SingleNameMatchingResult> closestResults) {
-            this.closestResults = closestResults;
+        public List<SingleNameMatchingResult> getBestResults() {
+            return bestResults;
         }
-        public List<SingleNameMatchingResult> getOtherCandidatesResults() {
-            return otherCandidatesResults;
-        }
-        public void setOtherCandidtaesResults(List<SingleNameMatchingResult> otherCandidatesResults) {
-            this.otherCandidatesResults = otherCandidatesResults;
+        public void setBestResults(List<SingleNameMatchingResult> bestResults) {
+            this.bestResults = bestResults;
         }
 
     }
@@ -144,51 +139,26 @@ public class NameMatchingServiceImpl
 //        return result;
 //    }
 
-    /**This method shapes the result object comprised of three distinct lists.
-     * The "exact result list" comprises all entries that perfectly match the input name.
-     * The "closest result list" is returned when the "relaxed search" parameter is enabled.
-     * Here, each component of the input name is individually compared to find the closest matching name.
-     * The "other candidates" results list comprises all potential names deviating from the input name
-     * by a maximum threshold of allowable variations.
-     *
-     * i.e., if the input name is Abies alba var. alba, the exact results list might have Abies alba var. alba
-     * the closest results list might have Abies alba subsp. alba with a distance of 0
-     * (no differences found among both names)
-     * the other candidates result list might have other names i.e. Abies albatros
-    */
-
-    @Override
-    public NameMatchingResult wrapperResults(String nameCache, boolean compareAuthor, Integer distance,
-            boolean relaxedSearch, boolean otherCandidates) {
-        NameMatchingResult result = new NameMatchingResult();
-        result = listShaping(nameCache, compareAuthor, distance);
-        if (relaxedSearch == false) {
-            result.closestResults = new ArrayList<>();
-        }
-        if (otherCandidates == false) {
-            result.otherCandidatesResults = new ArrayList<>();
-        }
-        return result;
-    }
 
     @Override
     public NameMatchingResult listShaping(String nameCache, boolean compareAuthor, Integer distance) {
+
         NameMatchingResult result = new NameMatchingResult();
-        result = findMatchingNames(nameCache, null, compareAuthor, distance);
-        List<SingleNameMatchingResult> closestResultsTemp = new ArrayList<>();
-        for (SingleNameMatchingResult part : result.getClosestResults()) {
-            String titleCache = part.getTitleCache();
-            if (compareAuthor && titleCache.equals(nameCache)) {
-                closestResultsTemp.add(part);
-            } else if (compareAuthor == false && titleCache.contains(nameCache)) {
-                closestResultsTemp.add(part);
-            }
-        }
-        result.setExactResults(closestResultsTemp);
-        for (SingleNameMatchingResult part: result.getClosestResults()) {
-            for (SingleNameMatchingResult  part2 : result.getExactResults()) {
-                if (part.getTaxonNameUuid().equals(part2.getTaxonNameUuid())) {
-                    result.closestResults.remove(part2);
+
+        List<SingleNameMatchingResult> resultInput = findMatchingNames(nameCache, null, compareAuthor, distance);
+
+        for (SingleNameMatchingResult part : resultInput) {
+            if (compareAuthor) {
+                if (part.getDistance() == 0 && part.getTitleCache().equals(nameCache)) {
+                    result.exactResults.add(part);
+                } else {
+                    result.bestResults.add(part);
+                }
+            } else if (compareAuthor == false) {
+                if (part.getDistance() == 0 && nameCache.contains(part.getNameCache())){
+                    result.exactResults.add(part);
+                } else {
+                    result.bestResults.add(part);
                 }
             }
         }
@@ -201,9 +171,9 @@ public class NameMatchingServiceImpl
      * @return list of exact matching names (distance = 0), or list of best matches if exact matches are not found.
      */
     @Override
-    public NameMatchingResult findMatchingNames(String taxonName, NameMatchingConfigurator config, boolean compareAuthor, Integer inputDistance) {
+    public List<SingleNameMatchingResult> findMatchingNames(String taxonName, NameMatchingConfigurator config, boolean compareAuthor, Integer inputDistance) {
 
-        NameMatchingResult result = new NameMatchingResult();
+        List<SingleNameMatchingResult> result = new ArrayList<>();
 
         // 0. Normalizing and parsing input name
         taxonName = normalizeInput(taxonName);
@@ -220,7 +190,7 @@ public class NameMatchingServiceImpl
         String infraGenericQuery = name.getInfraGenericEpithet();
         String infraSpecificQuery = name.getInfraSpecificEpithet();
         String authorshipCacheQuery = name.getAuthorshipCache();
-//        Rank rank = name.getRank();
+        Rank rank = name.getRank();
 
         if (name.getCombinationAuthorship() != null)  {
             authorshipCacheQuery = name.getCombinationAuthorship().getNomenclaturalTitleCache();
@@ -258,10 +228,9 @@ public class NameMatchingServiceImpl
             filterMatchingMonomialFromResultSet(taxonNamePartsWithDistance, resultSetOnlyGenusOrUninominal);
             Collections.sort(resultSetOnlyGenusOrUninominal,
                     (o1, o2) -> o1.getDistance().compareTo(o2.getDistance()));
-            result.closestResults = closestResults(resultSetOnlyGenusOrUninominal);
-            result.otherCandidatesResults = otherCandidatesResults(resultSetOnlyGenusOrUninominal, maxDistance);
+            result = candidatesResults(resultSetOnlyGenusOrUninominal, maxDistance);
             if (compareAuthor) {
-                authorMatch(result, authorshipCacheQuery, maxDistance);
+                result = authorMatch(result, authorshipCacheQuery, maxDistance);
             }
             return result;
         } else if (infraGenericQuery != null) {
@@ -270,10 +239,9 @@ public class NameMatchingServiceImpl
             Collections.sort(resultSetInfraGenericListWithDist, (o1,o2) ->
                o1.getDistance().compareTo(o2.getDistance()));
 
-            result.closestResults = closestResults(resultSetInfraGenericListWithDist);
-            result.otherCandidatesResults = otherCandidatesResults(resultSetInfraGenericListWithDist, maxDistance);
+            result = candidatesResults(resultSetInfraGenericListWithDist, maxDistance);
             if (compareAuthor) {
-                authorMatch(result, authorshipCacheQuery, maxDistance);
+                result = authorMatch(result, authorshipCacheQuery, maxDistance);
             }
             return result;
         } else if (specificEpithetQuery != null && infraSpecificQuery == null){
@@ -283,23 +251,21 @@ public class NameMatchingServiceImpl
 
             // 7. Result shaping
             Collections.sort(resultSetEpithetListWithDist, (o1, o2) -> o1.getDistance().compareTo(o2.getDistance()));
-            result.closestResults = closestResults(resultSetEpithetListWithDist);
-            result.otherCandidatesResults = otherCandidatesResults(resultSetEpithetListWithDist, maxDistance);
+            result = candidatesResults(resultSetEpithetListWithDist, maxDistance);
             if (compareAuthor) {
-                authorMatch(result, authorshipCacheQuery, maxDistance);
+                result = authorMatch(result, authorshipCacheQuery, maxDistance);
             }
             return result;
         } else if (infraSpecificQuery != null) {
             List<SingleNameMatchingResult> resultSetInfraSpecificListWithDist = compareInfraSpecific(
-                    specificEpithetQuery, infraSpecificQuery, maxDistance, taxonNamePartsWithDistance);
+                    specificEpithetQuery, infraSpecificQuery, maxDistance, taxonNamePartsWithDistance, rank);
 
             // 7. Result shaping
 
             Collections.sort(resultSetInfraSpecificListWithDist, (o1, o2) -> o1.getDistance().compareTo(o2.getDistance()));
-            result.closestResults = closestResults(resultSetInfraSpecificListWithDist);
-            result.otherCandidatesResults = otherCandidatesResults(resultSetInfraSpecificListWithDist, maxDistance);
+            result = candidatesResults(resultSetInfraSpecificListWithDist, maxDistance);
             if (compareAuthor) {
-                authorMatch(result, authorshipCacheQuery, maxDistance);
+                result = authorMatch(result, authorshipCacheQuery, maxDistance);
             }
             return result;
         } else {
@@ -315,7 +281,7 @@ public class NameMatchingServiceImpl
      * @return
      */
     private List<SingleNameMatchingResult> compareInfraSpecific(String specificEpithetQuery, String infraSpecificQuery,
-            Integer maxDistance, List<SingleNameMatchingResult> taxonNamePartsWithDistance) {
+            Integer maxDistance, List<SingleNameMatchingResult> taxonNamePartsWithDistance, Rank rank) {
         String normalizedInfraSpecificQuery = NameMatchingUtils.normalize(infraSpecificQuery);
         String phoneticNormalizedInfraSpecificQuery = NameMatchingUtils.nearMatch(normalizedInfraSpecificQuery);
 
@@ -344,6 +310,11 @@ public class NameMatchingServiceImpl
                        // 5. comparison of infra specific
             infraSpecificComputedDistance = nameMatchingComputeDistance(phoneticNormalizedInfraSpecificQuery ,
                     phoneticNormalizedInfraSpecificNameInDB);
+
+            boolean rankEquals = infraSpecific.getRank().equals(rank);
+            if (!rankEquals) {
+                infraSpecificComputedDistance++;
+            }
             int totalDist = infraSpecific.getDistance() + infraSpecificComputedDistance;
             infraSpecific.setDistance(totalDist);
 
@@ -526,18 +497,9 @@ public class NameMatchingServiceImpl
         }
     }
 
-    private static NameMatchingResult authorMatch(NameMatchingResult results, String authorshipQuery, Integer maxDistance) {
+    private static List<SingleNameMatchingResult> authorMatch(List<SingleNameMatchingResult> results, String authorshipQuery, Integer maxDistance) {
         try {
-            try {
-                results.closestResults = AuthorMatch.compareAuthor(results.closestResults, authorshipQuery, maxDistance);
-            } catch (NullPointerException ex) {
-                return null;
-            }
-            try {
-                results.otherCandidatesResults = AuthorMatch.compareAuthor(results.otherCandidatesResults, authorshipQuery, maxDistance);
-            } catch (NullPointerException ex) {
-                return null;
-            }
+            results = AuthorMatch.compareAuthor(results, authorshipQuery, maxDistance);
         } catch (NullPointerException ex) {
             return null;
         }
@@ -850,23 +812,12 @@ public class NameMatchingServiceImpl
         }
     }
 
-    public static List<SingleNameMatchingResult> closestResults(
-            List<SingleNameMatchingResult> resultShapingList) {
-        List<SingleNameMatchingResult> exactResults = new ArrayList<>();
-        for (SingleNameMatchingResult exactResult : resultShapingList) {
-            if (exactResult.getDistance() == 0) {
-                exactResults.add(exactResult);
-            }
-        }
-        return exactResults;
-    }
-
-    public static List<SingleNameMatchingResult> otherCandidatesResults(
+    public static List<SingleNameMatchingResult> candidatesResults(
             List<SingleNameMatchingResult> list, int maxDistance) {
         List<SingleNameMatchingResult> bestResults = new ArrayList<>();
         for (SingleNameMatchingResult best : list) {
             int calculatedDistance = best.getDistance();
-            if (calculatedDistance != 0 && calculatedDistance <= maxDistance) {
+            if (calculatedDistance <= maxDistance) {
                 bestResults.add(best);
             }
         }
index e6dd74fe0bdc8847b394609b8dcdc272d101dfbc..482200e641538da3100f77e0f7d83716837cae66 100644 (file)
@@ -109,8 +109,8 @@ public class NameMatchingServiceImplTest extends CdmTransactionalIntegrationTest
 
         // exact match
         inputName = "Nectandra";
-        matchResults = nameMatchingService.findMatchingNames(inputName, null, false, null);
-        matchResult = matchResults.getClosestResults();
+        matchResults = nameMatchingService.listShaping(inputName, false, null);
+        matchResult = matchResults.getExactResults();
         Assert.assertEquals(1, matchResult.size());
         matchRes = matchResult.get(0);
         Assert.assertEquals("Nectandra", matchRes.getGenusOrUninomial());
@@ -120,8 +120,8 @@ public class NameMatchingServiceImplTest extends CdmTransactionalIntegrationTest
 
         // not exact match
         inputName = "Nextondra";
-        matchResults = nameMatchingService.findMatchingNames(inputName, null, false, null);
-        matchResult = matchResults.getOtherCandidatesResults();
+        matchResults = nameMatchingService.listShaping(inputName, false, null);
+        matchResult = matchResults.getBestResults();
         Assert.assertEquals(2, matchResult.size());
 
         matchRes = matchResult.get(0);
@@ -148,8 +148,8 @@ public class NameMatchingServiceImplTest extends CdmTransactionalIntegrationTest
 
         // exact match
         inputName = "Nectandra magnoliifolia";
-        matchResults = nameMatchingService.findMatchingNames(inputName, null, false, null);
-        matchResult = matchResults.getClosestResults();
+        matchResults = nameMatchingService.listShaping(inputName, false, null);
+        matchResult = matchResults.getExactResults();
         Assert.assertEquals(1, matchResult.size());
         matchRes = matchResult.get(0);
         Assert.assertEquals("Nectandra", matchRes.getGenusOrUninomial());
@@ -162,8 +162,8 @@ public class NameMatchingServiceImplTest extends CdmTransactionalIntegrationTest
         */
 
         inputName = "Nectandra surinamensis";
-        matchResults = nameMatchingService.findMatchingNames(inputName, null, false, null);
-        matchResult = matchResults.getClosestResults();
+        matchResults = nameMatchingService.listShaping(inputName, false, null);
+        matchResult = matchResults.getExactResults();
         Assert.assertEquals(2, matchResult.size());
 
         matchRes = matchResult.get(0);
@@ -180,8 +180,8 @@ public class NameMatchingServiceImplTest extends CdmTransactionalIntegrationTest
 
         // not exact match
         inputName = "Nectendra nigre";
-        matchResults = nameMatchingService.findMatchingNames(inputName, null, false, null);
-        matchResult = matchResults.getOtherCandidatesResults();
+        matchResults = nameMatchingService.listShaping(inputName, false, null);
+        matchResult = matchResults.getBestResults();
         Assert.assertEquals(2, matchResult.size());
         matchRes = matchResult.get(0);
         Assert.assertEquals("Nectandra", matchRes.getGenusOrUninomial());
@@ -196,8 +196,8 @@ public class NameMatchingServiceImplTest extends CdmTransactionalIntegrationTest
         Assert.assertEquals(4,(int) matchRes.getDistance());
 
         inputName = "Bectendra nigri";
-        matchResults = nameMatchingService.findMatchingNames(inputName, null, false, null);
-        matchResult = matchResults.getOtherCandidatesResults();
+        matchResults = nameMatchingService.listShaping(inputName, false, null);
+        matchResult = matchResults.getBestResults();
         Assert.assertEquals(2, matchResult.size());
         matchRes = matchResult.get(0);
         Assert.assertEquals("Nectandra", matchRes.getGenusOrUninomial());
@@ -223,19 +223,14 @@ public class NameMatchingServiceImplTest extends CdmTransactionalIntegrationTest
 
         // exact match
         inputName = "Nectandra subgen. Nectrina";
-        matchResults = nameMatchingService.findMatchingNames(inputName, null, false, null);
-        matchResult = matchResults.getClosestResults();
-        Assert.assertEquals(1, matchResult.size());
-        matchRes = matchResult.get(0);
-        Assert.assertEquals("Nectandra", matchRes.getGenusOrUninomial());
-        Assert.assertEquals("Nectrina", matchRes.getInfraGenericEpithet());
-        Assert.assertEquals(UUID_NAME_NECTRINA, matchRes.getTaxonNameUuid());
-        Assert.assertEquals(0,(int) matchRes.getDistance());
+        matchResults = nameMatchingService.listShaping(inputName, false, null);
+        matchResult = matchResults.getExactResults();
+        Assert.assertEquals(0, matchResult.size());
 
         // not exact match
         inputName = "Nectandra subgen. Nextrina";
-        matchResults = nameMatchingService.findMatchingNames(inputName, null, false, null);
-        matchResult = matchResults.getOtherCandidatesResults();
+        matchResults = nameMatchingService.listShaping(inputName, false, null);
+        matchResult = matchResults.getBestResults();
         Assert.assertEquals(2, matchResult.size());
         matchRes = matchResult.get(0);
         Assert.assertEquals("Nectandra", matchRes.getGenusOrUninomial());
@@ -261,8 +256,8 @@ public class NameMatchingServiceImplTest extends CdmTransactionalIntegrationTest
 
         // exact match
         inputName = "Nectandra mollis subsp. laurel";
-        matchResults = nameMatchingService.findMatchingNames(inputName, null, false, null);
-        matchResult = matchResults.getClosestResults();
+        matchResults = nameMatchingService.listShaping(inputName, false, null);
+        matchResult = matchResults.getExactResults();
         Assert.assertEquals(1, matchResult.size());
         matchRes = matchResult.get(0);
         Assert.assertEquals("Nectandra", matchRes.getGenusOrUninomial());
@@ -273,22 +268,22 @@ public class NameMatchingServiceImplTest extends CdmTransactionalIntegrationTest
 
         // not exact match
         inputName = "Nectandra mollis var. laurol";
-        matchResults = nameMatchingService.findMatchingNames(inputName, null, false, null);
-        matchResult = matchResults.getOtherCandidatesResults();
+        matchResults = nameMatchingService.listShaping(inputName, false, null);
+        matchResult = matchResults.getBestResults();
         Assert.assertEquals(2, matchResult.size());
         matchRes = matchResult.get(0);
         Assert.assertEquals("Nectandra", matchRes.getGenusOrUninomial());
         Assert.assertEquals("mollis", matchRes.getSpecificEpithet());
         Assert.assertEquals("laurel", matchRes.getInfraSpecificEpithet());
         Assert.assertEquals(UUID_NAME_LAUREL, matchRes.getTaxonNameUuid());
-        Assert.assertEquals(1,(int) matchRes.getDistance());
+        Assert.assertEquals(2,(int) matchRes.getDistance());
 
         matchRes = matchResult.get(1);
         Assert.assertEquals("Nectandra", matchRes.getGenusOrUninomial());
         Assert.assertEquals("mollis", matchRes.getSpecificEpithet());
         Assert.assertEquals("laureli", matchRes.getInfraSpecificEpithet());
         Assert.assertEquals(UUID_NAME_LAURELI, matchRes.getTaxonNameUuid());
-        Assert.assertEquals(2,(int) matchRes.getDistance());
+        Assert.assertEquals(3,(int) matchRes.getDistance());
     }
 
     @Test
@@ -301,16 +296,16 @@ public class NameMatchingServiceImplTest extends CdmTransactionalIntegrationTest
         SingleNameMatchingResult matchRes;
 
         inputName = "Nectandra Turm.";
-        matchResults = nameMatchingService.findMatchingNames(inputName, null, true, null);
-        matchResult = matchResults.getClosestResults();
+        matchResults = nameMatchingService.listShaping(inputName, true, null);
+        matchResult = matchResults.getBestResults();
         matchRes = matchResult.get(0);
         Assert.assertEquals("Nectandra", matchRes.getGenusOrUninomial());
         Assert.assertEquals("Turl.", matchRes.getAuthorshipCache());
         Assert.assertEquals(1,(int) matchRes.getDistance());
 
         inputName = "Nectindra Turm.";
-        matchResults = nameMatchingService.findMatchingNames(inputName, null, true, null);
-        matchResult = matchResults.getOtherCandidatesResults();
+        matchResults = nameMatchingService.listShaping(inputName, true, null);
+        matchResult = matchResults.getBestResults();
         matchRes = matchResult.get(0);
         Assert.assertEquals("Nectondra", matchRes.getGenusOrUninomial());
         Assert.assertEquals("Turl.", matchRes.getAuthorshipCache());
@@ -334,8 +329,8 @@ public class NameMatchingServiceImplTest extends CdmTransactionalIntegrationTest
         // the exact match results show all species names that retrieve a distance of 0
         // EXCLUDING the authorship
         inputName = "Nectandra laevis Turm.";
-        matchResults = nameMatchingService.findMatchingNames(inputName, null, true, null);
-        matchResult = matchResults.getClosestResults();
+        matchResults = nameMatchingService.listShaping(inputName, true, null);
+        matchResult = matchResults.getBestResults();
         matchRes = matchResult.get(0);
         Assert.assertEquals("Nectandra", matchRes.getGenusOrUninomial());
         Assert.assertEquals("laevis", matchRes.getSpecificEpithet());
@@ -343,8 +338,8 @@ public class NameMatchingServiceImplTest extends CdmTransactionalIntegrationTest
         Assert.assertEquals(1,(int) matchRes.getDistance());
 
         inputName = "Nectindra levis Turm.";
-        matchResults = nameMatchingService.findMatchingNames(inputName, null, true, null);
-        matchResult = matchResults.getOtherCandidatesResults();
+        matchResults = nameMatchingService.listShaping(inputName, true, null);
+        matchResult = matchResults.getBestResults();
         matchRes = matchResult.get(0);
         Assert.assertEquals("Nectandra", matchRes.getGenusOrUninomial());
         Assert.assertEquals("laevis", matchRes.getSpecificEpithet());
@@ -352,8 +347,8 @@ public class NameMatchingServiceImplTest extends CdmTransactionalIntegrationTest
         Assert.assertEquals(2,(int) matchRes.getDistance());
 
         inputName = "Nectindra cinnamomoides Turm. & Kilian";
-        matchResults = nameMatchingService.findMatchingNames(inputName, null, true, null);
-        matchResult = matchResults.getOtherCandidatesResults();
+        matchResults = nameMatchingService.listShaping(inputName, true, null);
+        matchResult = matchResults.getBestResults();
         matchRes = matchResult.get(0);
         Assert.assertEquals("Nectandra", matchRes.getGenusOrUninomial());
         Assert.assertEquals("cinnamomoides", matchRes.getSpecificEpithet());
@@ -363,8 +358,8 @@ public class NameMatchingServiceImplTest extends CdmTransactionalIntegrationTest
         //TODO matching non-parsable names is still an open issue (#10178)
 
         inputName = "Nectindra cinnamomoides Turm. and Kilian";
-        matchResults = nameMatchingService.findMatchingNames(inputName, null, true, null);
-        matchResult = matchResults.getOtherCandidatesResults();
+        matchResults = nameMatchingService.listShaping(inputName, true, null);
+        matchResult = matchResults.getBestResults();
         matchRes = matchResult.get(0);
         Assert.assertEquals("Nectandra", matchRes.getGenusOrUninomial());
         Assert.assertEquals("cinnamomoides", matchRes.getSpecificEpithet());
@@ -383,16 +378,16 @@ public class NameMatchingServiceImplTest extends CdmTransactionalIntegrationTest
 
         // exact match
         inputName = "Nectandra (Kilian) Turm.";
-        matchResults = nameMatchingService.findMatchingNames(inputName, null, true, null);
-        matchResult = matchResults.getClosestResults();
+        matchResults = nameMatchingService.listShaping(inputName, true, null);
+        matchResult = matchResults.getBestResults();
         matchRes = matchResult.get(0);
         Assert.assertEquals("Nectandra", matchRes.getGenusOrUninomial());
         Assert.assertEquals("Turl.", matchRes.getAuthorshipCache());
         Assert.assertEquals(1,(int) matchRes.getDistance());
 
         inputName = "Nectandra (Kilian ex Turm.) Kilian ex Turm.";
-        matchResults = nameMatchingService.findMatchingNames(inputName, null, true, null);
-        matchResult = matchResults.getClosestResults();
+        matchResults = nameMatchingService.listShaping(inputName, true, null);
+        matchResult = matchResults.getBestResults();
         matchRes = matchResult.get(0);
         Assert.assertEquals("Nectandra", matchRes.getGenusOrUninomial());
         Assert.assertEquals("Turl.", matchRes.getAuthorshipCache());
@@ -410,8 +405,8 @@ public class NameMatchingServiceImplTest extends CdmTransactionalIntegrationTest
 
         // exact match
         inputName = "Nectandra laevis (Kilian) Turm.";
-        matchResults = nameMatchingService.findMatchingNames(inputName, null, true, null);
-        matchResult = matchResults.getClosestResults();
+        matchResults = nameMatchingService.listShaping(inputName, true, null);
+        matchResult = matchResults.getBestResults();
         matchRes = matchResult.get(0);
         Assert.assertEquals("Nectandra", matchRes.getGenusOrUninomial());
         Assert.assertEquals("laevis", matchRes.getSpecificEpithet());
@@ -419,8 +414,8 @@ public class NameMatchingServiceImplTest extends CdmTransactionalIntegrationTest
         Assert.assertEquals(1,(int) matchRes.getDistance());
 
         inputName = "Nectandra laevis (Kilian ex Turm.) Kilian ex Turm.";
-        matchResults = nameMatchingService.findMatchingNames(inputName, null, true, null);
-        matchResult = matchResults.getClosestResults();
+        matchResults = nameMatchingService.listShaping(inputName, true, null);
+        matchResult = matchResults.getBestResults();
         matchRes = matchResult.get(0);
         Assert.assertEquals("Nectandra", matchRes.getGenusOrUninomial());
         Assert.assertEquals("laevis", matchRes.getSpecificEpithet());
@@ -429,8 +424,8 @@ public class NameMatchingServiceImplTest extends CdmTransactionalIntegrationTest
 
         // not exact match
         inputName = "Mectandra laevis (Kilian) Turm.";
-        matchResults = nameMatchingService.findMatchingNames(inputName, null, true, null);
-        matchResult = matchResults.getOtherCandidatesResults();
+        matchResults = nameMatchingService.listShaping(inputName, true, null);
+        matchResult = matchResults.getBestResults();
         matchRes = matchResult.get(0);
         Assert.assertEquals("Nectandra", matchRes.getGenusOrUninomial());
         Assert.assertEquals("laevis", matchRes.getSpecificEpithet());
@@ -438,8 +433,8 @@ public class NameMatchingServiceImplTest extends CdmTransactionalIntegrationTest
         Assert.assertEquals(2,(int) matchRes.getDistance());
 
         inputName = "Mectandra laevis (Kilian ex Turm.) Kilian ex Turm.";
-        matchResults = nameMatchingService.findMatchingNames(inputName, null, true, null);
-        matchResult = matchResults.getOtherCandidatesResults();
+        matchResults = nameMatchingService.listShaping(inputName, true, null);
+        matchResult = matchResults.getBestResults();
         matchRes = matchResult.get(0);
         Assert.assertEquals("Nectandra", matchRes.getGenusOrUninomial());
         Assert.assertEquals("laevis", matchRes.getSpecificEpithet());
@@ -458,9 +453,9 @@ public class NameMatchingServiceImplTest extends CdmTransactionalIntegrationTest
 
         // exact match
         inputName = "Nectandra mollis subsp. laurel Kilian ex Turm.";
-        matchResults = nameMatchingService.findMatchingNames(inputName, null, true, null);
-        matchResult = matchResults.getClosestResults();
-        Assert.assertEquals(1, matchResult.size());
+        matchResults = nameMatchingService.listShaping(inputName, true, null);
+        matchResult = matchResults.getBestResults();
+        Assert.assertEquals(2, matchResult.size());
         matchRes = matchResult.get(0);
         Assert.assertEquals("Nectandra", matchRes.getGenusOrUninomial());
         Assert.assertEquals("mollis", matchRes.getSpecificEpithet());
@@ -471,8 +466,8 @@ public class NameMatchingServiceImplTest extends CdmTransactionalIntegrationTest
 
         // not exact match
         inputName = "Nectandra mollis var. laurol (Kilian) Turm.";
-        matchResults = nameMatchingService.findMatchingNames(inputName, null, true, null);
-        matchResult = matchResults.getOtherCandidatesResults();
+        matchResults = nameMatchingService.listShaping(inputName, true, null);
+        matchResult = matchResults.getBestResults();
         Assert.assertEquals(2, matchResult.size());
         matchRes = matchResult.get(0);
         Assert.assertEquals("Nectandra", matchRes.getGenusOrUninomial());
@@ -480,7 +475,7 @@ public class NameMatchingServiceImplTest extends CdmTransactionalIntegrationTest
         Assert.assertEquals("laurel", matchRes.getInfraSpecificEpithet());
         Assert.assertEquals(UUID_NAME_LAUREL, matchRes.getTaxonNameUuid());
         Assert.assertEquals("Turl.", matchRes.getAuthorshipCache());
-        Assert.assertEquals(2,(int) matchRes.getDistance());
+        Assert.assertEquals(3,(int) matchRes.getDistance());
 
         matchRes = matchResult.get(1);
         Assert.assertEquals("Nectandra", matchRes.getGenusOrUninomial());
@@ -488,7 +483,7 @@ public class NameMatchingServiceImplTest extends CdmTransactionalIntegrationTest
         Assert.assertEquals("laureli", matchRes.getInfraSpecificEpithet());
         Assert.assertEquals(UUID_NAME_LAURELI, matchRes.getTaxonNameUuid());
         Assert.assertEquals("Turl.", matchRes.getAuthorshipCache());
-        Assert.assertEquals(3,(int) matchRes.getDistance());
+        Assert.assertEquals(4,(int) matchRes.getDistance());
     }
 
     @Test
@@ -529,7 +524,7 @@ public class NameMatchingServiceImplTest extends CdmTransactionalIntegrationTest
         matchResult = matchResults.getExactResults();
         Assert.assertEquals(0, matchResult.size());
 
-        matchResult = matchResults.getOtherCandidatesResults();
+        matchResult = matchResults.getBestResults();
         Assert.assertEquals(2, matchResult.size());
         matchRes = matchResult.get(0);
         Assert.assertEquals("Yucca", matchRes.getGenusOrUninomial());
@@ -544,7 +539,7 @@ public class NameMatchingServiceImplTest extends CdmTransactionalIntegrationTest
         matchResult = matchResults.getExactResults();
         Assert.assertEquals(0, matchResult.size());
 
-        matchResult = matchResults.getOtherCandidatesResults();
+        matchResult = matchResults.getBestResults();
         Assert.assertEquals(2, matchResult.size());
         matchRes = matchResult.get(0);
         Assert.assertEquals("Yucca", matchRes.getGenusOrUninomial());
@@ -579,7 +574,7 @@ public class NameMatchingServiceImplTest extends CdmTransactionalIntegrationTest
         matchResults = nameMatchingService.listShaping(nameCache, true, null);
         matchResult = matchResults.getExactResults();
         Assert.assertEquals(0, matchResult.size());
-        matchResult = matchResults.getClosestResults();
+        matchResult = matchResults.getBestResults();
         Assert.assertEquals(2, matchResult.size());
         matchRes = matchResult.get(0);
         Assert.assertEquals("Yucca", matchRes.getGenusOrUninomial());
@@ -591,7 +586,7 @@ public class NameMatchingServiceImplTest extends CdmTransactionalIntegrationTest
         matchResults = nameMatchingService.listShaping(nameCache, true, null);
         matchResult = matchResults.getExactResults();
         Assert.assertEquals(0, matchResult.size());
-        matchResult = matchResults.getClosestResults();
+        matchResult = matchResults.getBestResults();
         Assert.assertEquals(2, matchResult.size());
         matchRes = matchResult.get(0);
         Assert.assertEquals("Yucca", matchRes.getGenusOrUninomial());
@@ -612,55 +607,16 @@ public class NameMatchingServiceImplTest extends CdmTransactionalIntegrationTest
         matchResults = nameMatchingService.listShaping(nameCache, false, 10);
         matchResult = matchResults.getExactResults();
         Assert.assertEquals(2, matchResult.size());
-        matchResult = matchResults.getOtherCandidatesResults();
+        matchResult = matchResults.getBestResults();
         Assert.assertEquals(11, matchResult.size());
 
         nameCache = "Yucca filamentosa Len.";
         matchResults = nameMatchingService.listShaping(nameCache, true, 10);
-        matchResult = matchResults.getClosestResults();
-        Assert.assertEquals(2, matchResult.size());
-        matchResult = matchResults.getOtherCandidatesResults();
-        Assert.assertEquals(4, matchResult.size());
+        matchResult = matchResults.getBestResults();
+        Assert.assertEquals(6, matchResult.size());
 
-}
-    @Test
-    @DataSet(loadStrategy = CleanSweepInsertLoadStrategy.class, value = "NameMatchingServiceImplTest.testFindMatchingNames.xml")
-    public void testWrapperResults() {
-        String nameCache;
-        NameMatchingResult matchResults;
-        List<SingleNameMatchingResult> matchResult;
-        SingleNameMatchingResult matchRes;
-
-        nameCache = "Yucca gloriosa subsp. gloriosa";
-
-        // output exact results + relaxed results + other candidates
-        matchResults = nameMatchingService.wrapperResults(nameCache, false, 10, true, true);
-
-        matchResult = matchResults.getExactResults();
-        Assert.assertEquals(0, matchResult.size());
 
-        //when relaxed search is set to true, the "closest results" should include all names that matched
-        //each component of the name individually. The rank is not included in the distance, hence
-        // the distance is 0 (perfect match)
-
-        /**TODO
-         * Discuss the value of the distance for a not-matching rank.
-         */
-
-        matchResult = matchResults.getClosestResults();
-        matchRes = matchResult.get(0);
-
-        Assert.assertEquals(1, matchResult.size());
-        Assert.assertEquals("Yucca gloriosa L. var. gloriosa", matchRes.getTitleCache());
-        Assert.assertEquals(0, (int)matchRes.getDistance());
-
-        matchResult = matchResults.getOtherCandidatesResults();
-        Assert.assertEquals(2, matchResult.size());
-        matchRes = matchResult.get(0);
-        Assert.assertEquals("Yucca gloriosa f. genuina Engelm.", matchRes.getTitleCache());
-        Assert.assertEquals(5, (int)matchRes.getDistance());
-
-    }
+}
 
        @Override
        public void createTestDataSet() throws FileNotFoundException {}
index d8e551a85279ce717072d4e70a76ac039a9b436e..d895a01f7aaedf8938e34a7225c1f53beff0798f 100644 (file)
@@ -1,14 +1,14 @@
 <?xml version='1.0' encoding='UTF-8'?>
 <dataset xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="../../database/schema/dataset.xsd">
-  <TAXONNAME NAMETYPE="ICNAFP" ID="33" UUID="0e16e411-e472-48ab-8b32-da9d3968092c" PROTECTEDTITLECACHE="false" PROTECTEDAUTHORSHIPCACHE="false" PROTECTEDFULLTITLECACHE="false" PROTECTEDNAMECACHE="false" TITLECACHE="Nectandra"                                      AUTHORSHIPCACHE="Turl."  NAMECACHE="Nectandra"                                                  GENUSORUNINOMIAL="Nectandra"    INFRAGENERICEPITHET=""                  SPECIFICEPITHET=""                              INFRASPECIFICEPITHET="" COMBINATIONAUTHORSHIP_ID="1" BINOMHYBRID="false" HYBRIDFORMULA="false" MONOMHYBRID="false" TRINOMHYBRID="false" ANAMORPHIC="false" RANK_ID="765"/>
-  <TAXONNAME NAMETYPE="ICNAFP" ID="34" UUID="6c4464cc-fc2c-4907-9125-97715a798e0d" PROTECTEDTITLECACHE="false" PROTECTEDAUTHORSHIPCACHE="false" PROTECTEDFULLTITLECACHE="false" PROTECTEDNAMECACHE="false" TITLECACHE="Nectondra"                                      AUTHORSHIPCACHE="Turl."  NAMECACHE="Nectondra"                                                  GENUSORUNINOMIAL="Nectondra"    INFRAGENERICEPITHET=""                  SPECIFICEPITHET=""                              INFRASPECIFICEPITHET="" COMBINATIONAUTHORSHIP_ID="1" BINOMHYBRID="false" HYBRIDFORMULA="false" MONOMHYBRID="false" TRINOMHYBRID="false" ANAMORPHIC="false" RANK_ID="765"/>
-  <TAXONNAME NAMETYPE="ICNAFP" ID="35" UUID="afdcdff3-8e8f-4296-aed2-2ad39c1b6bee" PROTECTEDTITLECACHE="false" PROTECTEDAUTHORSHIPCACHE="false" PROTECTEDFULLTITLECACHE="false" PROTECTEDNAMECACHE="false" TITLECACHE="Nextandra"                                      AUTHORSHIPCACHE="Turl."  NAMECACHE="Nextandra"                                                  GENUSORUNINOMIAL="Nextandra"    INFRAGENERICEPITHET=""                  SPECIFICEPITHET=""                              INFRASPECIFICEPITHET="" COMBINATIONAUTHORSHIP_ID="1" BINOMHYBRID="false" HYBRIDFORMULA="false" MONOMHYBRID="false" TRINOMHYBRID="false" ANAMORPHIC="false" RANK_ID="765"/>
-  <TAXONNAME NAMETYPE="ICNAFP" ID="36" UUID="e53a569a-d635-4c47-bded-ad539632593e" PROTECTEDTITLECACHE="false" PROTECTEDAUTHORSHIPCACHE="false" PROTECTEDFULLTITLECACHE="false" PROTECTEDNAMECACHE="false" TITLECACHE="Nxctwsdra"                                      AUTHORSHIPCACHE="Turl."  NAMECACHE="Nxctwsdra"                                                  GENUSORUNINOMIAL="Nxctwsdra"    INFRAGENERICEPITHET=""                  SPECIFICEPITHET=""                              INFRASPECIFICEPITHET="" COMBINATIONAUTHORSHIP_ID="1" BINOMHYBRID="false" HYBRIDFORMULA="false" MONOMHYBRID="false" TRINOMHYBRID="false" ANAMORPHIC="false" RANK_ID="765"/>
-  <TAXONNAME NAMETYPE="ICNAFP" ID="37" UUID="d4b9325f-ad24-4062-8e80-6d7af41b27c0" PROTECTEDTITLECACHE="false" PROTECTEDAUTHORSHIPCACHE="false" PROTECTEDFULLTITLECACHE="false" PROTECTEDNAMECACHE="false" TITLECACHE="Nectwsdrx"                                      AUTHORSHIPCACHE="Turl."  NAMECACHE="Nectwsdrx"                                                  GENUSORUNINOMIAL="Nectwsdrx"    INFRAGENERICEPITHET=""                  SPECIFICEPITHET=""                              INFRASPECIFICEPITHET="" COMBINATIONAUTHORSHIP_ID="1" BINOMHYBRID="false" HYBRIDFORMULA="false" MONOMHYBRID="false" TRINOMHYBRID="false" ANAMORPHIC="false" RANK_ID="765"/>
-  <TAXONNAME NAMETYPE="ICNAFP" ID="39" UUID="bd892f7b-5bff-40fe-88ef-3bcf6103a3dd" PROTECTEDTITLECACHE="false" PROTECTEDAUTHORSHIPCACHE="false" PROTECTEDFULLTITLECACHE="false" PROTECTEDNAMECACHE="false" TITLECACHE="Philodendron subgen. Nectande"  AUTHORSHIPCACHE="Turl."  NAMECACHE="Philodendron subgen. Nectande"              GENUSORUNINOMIAL="Philodendron" INFRAGENERICEPITHET="Nectande"  SPECIFICEPITHET=""                      INFRASPECIFICEPITHET=""         COMBINATIONAUTHORSHIP_ID="1" BINOMHYBRID="false" HYBRIDFORMULA="false" MONOMHYBRID="false" TRINOMHYBRID="false" ANAMORPHIC="false" RANK_ID="775"/>
-  <TAXONNAME NAMETYPE="ICNAFP" ID="41" UUID="08ab2653-a4da-4c9b-8330-1bf4268cab88" PROTECTEDTITLECACHE="false" PROTECTEDAUTHORSHIPCACHE="false" PROTECTEDFULLTITLECACHE="false" PROTECTEDNAMECACHE="false" TITLECACHE="Nectandra (Nectrina)"           AUTHORSHIPCACHE="Turl."  NAMECACHE="Nectandra (Nectrina)"                               GENUSORUNINOMIAL="Nectandra"    INFRAGENERICEPITHET="Nectrina"  SPECIFICEPITHET=""                      INFRASPECIFICEPITHET="" COMBINATIONAUTHORSHIP_ID="1" BINOMHYBRID="true" HYBRIDFORMULA="false" MONOMHYBRID="false" TRINOMHYBRID="false" ANAMORPHIC="false" RANK_ID="775"/>
-  <TAXONNAME NAMETYPE="ICNAFP" ID="42" UUID="c955a8ab-8501-421a-bfa3-5748237e8942" PROTECTEDTITLECACHE="false" PROTECTEDAUTHORSHIPCACHE="false" PROTECTEDFULLTITLECACHE="false" PROTECTEDNAMECACHE="false" TITLECACHE="Nectandra nothosubg. Nexxxina" AUTHORSHIPCACHE="Turl."  NAMECACHE="Nectandra nothosubg. Nexxxina"               GENUSORUNINOMIAL="Nectandra"    INFRAGENERICEPITHET="Nexxxina"  SPECIFICEPITHET=""              INFRASPECIFICEPITHET=""         COMBINATIONAUTHORSHIP_ID="1" BINOMHYBRID="true" HYBRIDFORMULA="false" MONOMHYBRID="false" TRINOMHYBRID="false" ANAMORPHIC="false" RANK_ID="775"/>
-  <TAXONNAME NAMETYPE="ICNAFP" ID="43" UUID="e0b28207-8f09-48a2-8da3-94a56405d854" PROTECTEDTITLECACHE="false" PROTECTEDAUTHORSHIPCACHE="false" PROTECTEDFULLTITLECACHE="false" PROTECTEDNAMECACHE="false" TITLECACHE="Nectxndra subgen. Nectande"  AUTHORSHIPCACHE="Turl."  NAMECACHE="Nectxndra subgen. Nectande"                GENUSORUNINOMIAL="Nectxndra"    INFRAGENERICEPITHET="Nectande"      SPECIFICEPITHET=""                          INFRASPECIFICEPITHET="" COMBINATIONAUTHORSHIP_ID="1" BINOMHYBRID="true" HYBRIDFORMULA="false" MONOMHYBRID="false" TRINOMHYBRID="false" ANAMORPHIC="false" RANK_ID="775"/>
+  <TAXONNAME NAMETYPE="ICNAFP" ID="33" UUID="0e16e411-e472-48ab-8b32-da9d3968092c" PROTECTEDTITLECACHE="false" PROTECTEDAUTHORSHIPCACHE="false" PROTECTEDFULLTITLECACHE="false" PROTECTEDNAMECACHE="false" TITLECACHE="Nectandra"                                      AUTHORSHIPCACHE="Turl."  NAMECACHE="Nectandra"                                                  GENUSORUNINOMIAL="Nectandra"    INFRAGENERICEPITHET=""                  SPECIFICEPITHET=""                              INFRASPECIFICEPITHET="" COMBINATIONAUTHORSHIP_ID="1" BINOMHYBRID="false" HYBRIDFORMULA="false" MONOMHYBRID="false" TRINOMHYBRID="false" ANAMORPHIC="false" RANK_ID="774"/>
+  <TAXONNAME NAMETYPE="ICNAFP" ID="34" UUID="6c4464cc-fc2c-4907-9125-97715a798e0d" PROTECTEDTITLECACHE="false" PROTECTEDAUTHORSHIPCACHE="false" PROTECTEDFULLTITLECACHE="false" PROTECTEDNAMECACHE="false" TITLECACHE="Nectondra"                                      AUTHORSHIPCACHE="Turl."  NAMECACHE="Nectondra"                                                  GENUSORUNINOMIAL="Nectondra"    INFRAGENERICEPITHET=""                  SPECIFICEPITHET=""                              INFRASPECIFICEPITHET="" COMBINATIONAUTHORSHIP_ID="1" BINOMHYBRID="false" HYBRIDFORMULA="false" MONOMHYBRID="false" TRINOMHYBRID="false" ANAMORPHIC="false" RANK_ID="774"/>
+  <TAXONNAME NAMETYPE="ICNAFP" ID="35" UUID="afdcdff3-8e8f-4296-aed2-2ad39c1b6bee" PROTECTEDTITLECACHE="false" PROTECTEDAUTHORSHIPCACHE="false" PROTECTEDFULLTITLECACHE="false" PROTECTEDNAMECACHE="false" TITLECACHE="Nextandra"                                      AUTHORSHIPCACHE="Turl."  NAMECACHE="Nextandra"                                                  GENUSORUNINOMIAL="Nextandra"    INFRAGENERICEPITHET=""                  SPECIFICEPITHET=""                              INFRASPECIFICEPITHET="" COMBINATIONAUTHORSHIP_ID="1" BINOMHYBRID="false" HYBRIDFORMULA="false" MONOMHYBRID="false" TRINOMHYBRID="false" ANAMORPHIC="false" RANK_ID="774"/>
+  <TAXONNAME NAMETYPE="ICNAFP" ID="36" UUID="e53a569a-d635-4c47-bded-ad539632593e" PROTECTEDTITLECACHE="false" PROTECTEDAUTHORSHIPCACHE="false" PROTECTEDFULLTITLECACHE="false" PROTECTEDNAMECACHE="false" TITLECACHE="Nxctwsdra"                                      AUTHORSHIPCACHE="Turl."  NAMECACHE="Nxctwsdra"                                                  GENUSORUNINOMIAL="Nxctwsdra"    INFRAGENERICEPITHET=""                  SPECIFICEPITHET=""                              INFRASPECIFICEPITHET="" COMBINATIONAUTHORSHIP_ID="1" BINOMHYBRID="false" HYBRIDFORMULA="false" MONOMHYBRID="false" TRINOMHYBRID="false" ANAMORPHIC="false" RANK_ID="774"/>
+  <TAXONNAME NAMETYPE="ICNAFP" ID="37" UUID="d4b9325f-ad24-4062-8e80-6d7af41b27c0" PROTECTEDTITLECACHE="false" PROTECTEDAUTHORSHIPCACHE="false" PROTECTEDFULLTITLECACHE="false" PROTECTEDNAMECACHE="false" TITLECACHE="Nectwsdrx"                                      AUTHORSHIPCACHE="Turl."  NAMECACHE="Nectwsdrx"                                                  GENUSORUNINOMIAL="Nectwsdrx"    INFRAGENERICEPITHET=""                  SPECIFICEPITHET=""                              INFRASPECIFICEPITHET="" COMBINATIONAUTHORSHIP_ID="1" BINOMHYBRID="false" HYBRIDFORMULA="false" MONOMHYBRID="false" TRINOMHYBRID="false" ANAMORPHIC="false" RANK_ID="774"/>
+  <TAXONNAME NAMETYPE="ICNAFP" ID="39" UUID="bd892f7b-5bff-40fe-88ef-3bcf6103a3dd" PROTECTEDTITLECACHE="false" PROTECTEDAUTHORSHIPCACHE="false" PROTECTEDFULLTITLECACHE="false" PROTECTEDNAMECACHE="false" TITLECACHE="Philodendron subgen. Nectande"  AUTHORSHIPCACHE="Turl."  NAMECACHE="Philodendron subgen. Nectande"              GENUSORUNINOMIAL="Philodendron" INFRAGENERICEPITHET="Nectande"  SPECIFICEPITHET=""                      INFRASPECIFICEPITHET=""         COMBINATIONAUTHORSHIP_ID="1" BINOMHYBRID="false" HYBRIDFORMULA="false" MONOMHYBRID="false" TRINOMHYBRID="false" ANAMORPHIC="false" RANK_ID="773"/>
+  <TAXONNAME NAMETYPE="ICNAFP" ID="41" UUID="08ab2653-a4da-4c9b-8330-1bf4268cab88" PROTECTEDTITLECACHE="false" PROTECTEDAUTHORSHIPCACHE="false" PROTECTEDFULLTITLECACHE="false" PROTECTEDNAMECACHE="false" TITLECACHE="Nectandra (Nectrina)"           AUTHORSHIPCACHE="Turl."  NAMECACHE="Nectandra (Nectrina)"                               GENUSORUNINOMIAL="Nectandra"    INFRAGENERICEPITHET="Nectrina"  SPECIFICEPITHET=""                      INFRASPECIFICEPITHET="" COMBINATIONAUTHORSHIP_ID="1" BINOMHYBRID="true" HYBRIDFORMULA="false" MONOMHYBRID="false" TRINOMHYBRID="false" ANAMORPHIC="false" RANK_ID="773"/>
+  <TAXONNAME NAMETYPE="ICNAFP" ID="42" UUID="c955a8ab-8501-421a-bfa3-5748237e8942" PROTECTEDTITLECACHE="false" PROTECTEDAUTHORSHIPCACHE="false" PROTECTEDFULLTITLECACHE="false" PROTECTEDNAMECACHE="false" TITLECACHE="Nectandra nothosubg. Nexxxina" AUTHORSHIPCACHE="Turl."  NAMECACHE="Nectandra nothosubg. Nexxxina"               GENUSORUNINOMIAL="Nectandra"    INFRAGENERICEPITHET="Nexxxina"  SPECIFICEPITHET=""              INFRASPECIFICEPITHET=""         COMBINATIONAUTHORSHIP_ID="1" BINOMHYBRID="true" HYBRIDFORMULA="false" MONOMHYBRID="false" TRINOMHYBRID="false" ANAMORPHIC="false" RANK_ID="773"/>
+  <TAXONNAME NAMETYPE="ICNAFP" ID="43" UUID="e0b28207-8f09-48a2-8da3-94a56405d854" PROTECTEDTITLECACHE="false" PROTECTEDAUTHORSHIPCACHE="false" PROTECTEDFULLTITLECACHE="false" PROTECTEDNAMECACHE="false" TITLECACHE="Nectxndra subgen. Nectande"  AUTHORSHIPCACHE="Turl."  NAMECACHE="Nectxndra subgen. Nectande"                GENUSORUNINOMIAL="Nectxndra"    INFRAGENERICEPITHET="Nectande"      SPECIFICEPITHET=""                          INFRASPECIFICEPITHET="" COMBINATIONAUTHORSHIP_ID="1" BINOMHYBRID="true" HYBRIDFORMULA="false" MONOMHYBRID="false" TRINOMHYBRID="false" ANAMORPHIC="false" RANK_ID="773"/>
   <TAXONNAME NAMETYPE="ICNAFP" ID="10" UUID="6dbd41d1-fe13-4d9c-bb58-31f051c2c384" PROTECTEDTITLECACHE="false" PROTECTEDAUTHORSHIPCACHE="false" PROTECTEDFULLTITLECACHE="false" PROTECTEDNAMECACHE="false" TITLECACHE="Nectandra abortiens"         AUTHORSHIPCACHE=""       NAMECACHE="Nectandra abortiens"                   GENUSORUNINOMIAL="Nectandra"    INFRAGENERICEPITHET=""                  SPECIFICEPITHET="abortiens"     INFRASPECIFICEPITHET="" COMBINATIONAUTHORSHIP_ID="1" BINOMHYBRID="false" HYBRIDFORMULA="false" MONOMHYBRID="false" TRINOMHYBRID="false" ANAMORPHIC="false" RANK_ID="765"/>
   <TAXONNAME NAMETYPE="ICNAFP" ID="11" UUID="f9e9c13f-5fa5-48d3-88cf-712c921a099e" PROTECTEDTITLECACHE="false" PROTECTEDAUTHORSHIPCACHE="false" PROTECTEDFULLTITLECACHE="false" PROTECTEDNAMECACHE="false" TITLECACHE="Nectandra acuminata"         AUTHORSHIPCACHE="[null]" NAMECACHE="Nectandra acuminata"                   GENUSORUNINOMIAL="Nectandra"    INFRAGENERICEPITHET=""                  SPECIFICEPITHET="acuminata"     INFRASPECIFICEPITHET=""                              BINOMHYBRID="false" HYBRIDFORMULA="false" MONOMHYBRID="false" TRINOMHYBRID="false" ANAMORPHIC="false" RANK_ID="765"/>
   <TAXONNAME NAMETYPE="ICNAFP" ID="12" UUID="e1e66264-f16a-4df9-80fd-6ab5028a3c28" PROTECTEDTITLECACHE="false" PROTECTEDAUTHORSHIPCACHE="false" PROTECTEDFULLTITLECACHE="false" PROTECTEDNAMECACHE="false" TITLECACHE="Nectandra acutangula"        AUTHORSHIPCACHE="Turl."  NAMECACHE="Nectandra acutangula"                  GENUSORUNINOMIAL="Nectandra"    INFRAGENERICEPITHET=""                  SPECIFICEPITHET="acutangula"    INFRASPECIFICEPITHET="" COMBINATIONAUTHORSHIP_ID="1" BINOMHYBRID="false" HYBRIDFORMULA="false" MONOMHYBRID="false" TRINOMHYBRID="false" ANAMORPHIC="false" RANK_ID="765"/>
   <TAXONNAME NAMETYPE="ICNAFP" ID="38" UUID="21f9c0de-aeb8-47a9-9e2c-2b91414f91c9" PROTECTEDTITLECACHE="false" PROTECTEDAUTHORSHIPCACHE="false" PROTECTEDFULLTITLECACHE="false" PROTECTEDNAMECACHE="false" TITLECACHE="Philodendron aristeguietae"  AUTHORSHIPCACHE="Turl."  NAMECACHE="Philodendron aristeguietae"            GENUSORUNINOMIAL="Philodendron" INFRAGENERICEPITHET=""                  SPECIFICEPITHET="aristeguietae" INFRASPECIFICEPITHET="" COMBINATIONAUTHORSHIP_ID="1" BINOMHYBRID="false" HYBRIDFORMULA="false" MONOMHYBRID="false" TRINOMHYBRID="false" ANAMORPHIC="false" RANK_ID="765"/>
   <TAXONNAME NAMETYPE="ICNAFP" ID="51" UUID="b3415bba-9a5c-442f-997e-95a8e214bd2c" PROTECTEDTITLECACHE="false" PROTECTEDAUTHORSHIPCACHE="false" PROTECTEDFULLTITLECACHE="false" PROTECTEDNAMECACHE="false" TITLECACHE="Philodendron magnoliifolia"  AUTHORSHIPCACHE="Turl."  NAMECACHE="Philodendron magnoliifolia"            GENUSORUNINOMIAL="Philodendron" INFRAGENERICEPITHET=""                  SPECIFICEPITHET="magnoliifolia" INFRASPECIFICEPITHET="" COMBINATIONAUTHORSHIP_ID="1" BINOMHYBRID="false" HYBRIDFORMULA="false" MONOMHYBRID="false" TRINOMHYBRID="false" ANAMORPHIC="false" RANK_ID="765"/>
   <TAXONNAME NAMETYPE="ICNAFP" ID="53" UUID="43bcd836-9268-4ca0-a29b-3ba6bb399a8b" PROTECTEDTITLECACHE="false" PROTECTEDAUTHORSHIPCACHE="false" PROTECTEDFULLTITLECACHE="false" PROTECTEDNAMECACHE="false" TITLECACHE="Nectandra membranacea subsp. cuspidata"  AUTHORSHIPCACHE="Turl."  NAMECACHE="Nectandra membranacea subsp. cuspidata"            INFRAGENERICEPITHET="" GENUSORUNINOMIAL="Nectandra" INFRASPECIFICEPITHET="cuspidata"            SPECIFICEPITHET="membranacea"           COMBINATIONAUTHORSHIP_ID="1" BINOMHYBRID="false" HYBRIDFORMULA="false" MONOMHYBRID="false" TRINOMHYBRID="false" ANAMORPHIC="false" RANK_ID="763"/>
-  <TAXONNAME NAMETYPE="ICNAFP" ID="54" UUID="6ece548d-ba0d-4988-97a1-4d79c611d6f8" PROTECTEDTITLECACHE="false" PROTECTEDAUTHORSHIPCACHE="false" PROTECTEDFULLTITLECACHE="false" PROTECTEDNAMECACHE="false" TITLECACHE="Nectandra mollis var. attenuata"                AUTHORSHIPCACHE="Turl."  NAMECACHE="Nectandra mollis var. attenuata"                            INFRAGENERICEPITHET="" GENUSORUNINOMIAL="Nectandra" INFRASPECIFICEPITHET="attenuata"            SPECIFICEPITHET="mollis"                        COMBINATIONAUTHORSHIP_ID="1" BINOMHYBRID="false" HYBRIDFORMULA="false" MONOMHYBRID="false" TRINOMHYBRID="false" ANAMORPHIC="false" RANK_ID="763"/>
+  <TAXONNAME NAMETYPE="ICNAFP" ID="54" UUID="6ece548d-ba0d-4988-97a1-4d79c611d6f8" PROTECTEDTITLECACHE="false" PROTECTEDAUTHORSHIPCACHE="false" PROTECTEDFULLTITLECACHE="false" PROTECTEDNAMECACHE="false" TITLECACHE="Nectandra mollis var. attenuata"                AUTHORSHIPCACHE="Turl."  NAMECACHE="Nectandra mollis var. attenuata"                            INFRAGENERICEPITHET="" GENUSORUNINOMIAL="Nectandra" INFRASPECIFICEPITHET="attenuata"            SPECIFICEPITHET="mollis"                        COMBINATIONAUTHORSHIP_ID="1" BINOMHYBRID="false" HYBRIDFORMULA="false" MONOMHYBRID="false" TRINOMHYBRID="false" ANAMORPHIC="false" RANK_ID="761"/>
   <TAXONNAME NAMETYPE="ICNAFP" ID="55" UUID="25296c78-f62b-4dfa-9cd1-813bc9d1d777" PROTECTEDTITLECACHE="false" PROTECTEDAUTHORSHIPCACHE="false" PROTECTEDFULLTITLECACHE="false" PROTECTEDNAMECACHE="false" TITLECACHE="Nectandra mollis subsp. laurel"                 AUTHORSHIPCACHE="Turl."  NAMECACHE="Nectandra mollis subsp. laurel"                             INFRAGENERICEPITHET="" GENUSORUNINOMIAL="Nectandra" INFRASPECIFICEPITHET="laurel"                       SPECIFICEPITHET="mollis"                        COMBINATIONAUTHORSHIP_ID="1" BINOMHYBRID="false" HYBRIDFORMULA="false" MONOMHYBRID="false" TRINOMHYBRID="false" ANAMORPHIC="false" RANK_ID="763"/>
   <TAXONNAME NAMETYPE="ICNAFP" ID="56" UUID="3598ffca-d444-4b7e-a373-7e8d90dfd215" PROTECTEDTITLECACHE="false" PROTECTEDAUTHORSHIPCACHE="false" PROTECTEDFULLTITLECACHE="false" PROTECTEDNAMECACHE="false" TITLECACHE="Nectandra mollis subsp. oppositifolia"          AUTHORSHIPCACHE="Turl."  NAMECACHE="Nectandra mollis subsp. oppositifolia"                      INFRAGENERICEPITHET="" GENUSORUNINOMIAL="Nectandra" INFRASPECIFICEPITHET="oppositifolia"        SPECIFICEPITHET="mollis"                        COMBINATIONAUTHORSHIP_ID="1" BINOMHYBRID="false" HYBRIDFORMULA="false" MONOMHYBRID="false" TRINOMHYBRID="false" ANAMORPHIC="false" RANK_ID="763"/>
-  <TAXONNAME NAMETYPE="ICNAFP" ID="57" UUID="6c19c4d3-3faa-4280-981c-d515daf4c347" PROTECTEDTITLECACHE="false" PROTECTEDAUTHORSHIPCACHE="false" PROTECTEDFULLTITLECACHE="false" PROTECTEDNAMECACHE="false" TITLECACHE="Nectandra membranacea fo. floribunda"   AUTHORSHIPCACHE="Turl."  NAMECACHE="Nectandra membranacea fo. floribunda"                       INFRAGENERICEPITHET="" GENUSORUNINOMIAL="Nectandra" INFRASPECIFICEPITHET="floribunda"           SPECIFICEPITHET="membranacea"           COMBINATIONAUTHORSHIP_ID="1" BINOMHYBRID="false" HYBRIDFORMULA="false" MONOMHYBRID="false" TRINOMHYBRID="false" ANAMORPHIC="false" RANK_ID="763"/>
+  <TAXONNAME NAMETYPE="ICNAFP" ID="57" UUID="6c19c4d3-3faa-4280-981c-d515daf4c347" PROTECTEDTITLECACHE="false" PROTECTEDAUTHORSHIPCACHE="false" PROTECTEDFULLTITLECACHE="false" PROTECTEDNAMECACHE="false" TITLECACHE="Nectandra membranacea fo. floribunda"   AUTHORSHIPCACHE="Turl."  NAMECACHE="Nectandra membranacea fo. floribunda"                       INFRAGENERICEPITHET="" GENUSORUNINOMIAL="Nectandra" INFRASPECIFICEPITHET="floribunda"           SPECIFICEPITHET="membranacea"           COMBINATIONAUTHORSHIP_ID="1" BINOMHYBRID="false" HYBRIDFORMULA="false" MONOMHYBRID="false" TRINOMHYBRID="false" ANAMORPHIC="false" RANK_ID="765"/>
  <TAXONNAME NAMETYPE="ICNAFP" ID="58" UUID="a598ab3f-b33b-4b4b-b237-d616fcb6b5b1" PROTECTEDTITLECACHE="false" PROTECTEDAUTHORSHIPCACHE="false" PROTECTEDFULLTITLECACHE="false" PROTECTEDNAMECACHE="false" TITLECACHE="Nectandra mollis subsp. laureli"                 AUTHORSHIPCACHE="Turl."  NAMECACHE="Nectandra mollis subsp. laureli"                            INFRAGENERICEPITHET="" GENUSORUNINOMIAL="Nectandra" INFRASPECIFICEPITHET="laureli"                      SPECIFICEPITHET="mollis"                        COMBINATIONAUTHORSHIP_ID="1" BINOMHYBRID="false" HYBRIDFORMULA="false" MONOMHYBRID="false" TRINOMHYBRID="false" ANAMORPHIC="false" RANK_ID="763"/>
-    <TAXONNAME NAMETYPE="ICNAFP"    ID="60" UUID="80dda188-c7f4-4319-9f30-3596c2540705"  PROTECTEDTITLECACHE="false"     PROTECTEDAUTHORSHIPCACHE="false"    PROTECTEDFULLTITLECACHE="false"     PROTECTEDNAMECACHE="false" TITLECACHE="Yermoloffia Bél."   AUTHORSHIPCACHE="Bél."  NAMECACHE="Yermoloffia" GENUSORUNINOMIAL="Yermoloffia"  INFRAGENERICEPITHET=""  SPECIFICEPITHET=""  INFRASPECIFICEPITHET="" COMBINATIONAUTHORSHIP_ID="1"    BINOMHYBRID="false" HYBRIDFORMULA="false"   MONOMHYBRID="false"  TRINOMHYBRID="false"    ANAMORPHIC="false" RANK_ID="765"/>
-  <TAXONNAME NAMETYPE="ICNAFP"  ID="61" UUID="61e322a4-d6d9-4e18-ab51-ab55c6b8841a"  PROTECTEDTITLECACHE="false"     PROTECTEDAUTHORSHIPCACHE="false"    PROTECTEDFULLTITLECACHE="false"     PROTECTEDNAMECACHE="false" TITLECACHE="Yervamora Kuntze"   AUTHORSHIPCACHE="Kuntze"    NAMECACHE="Yervamora"   GENUSORUNINOMIAL="Yervamora"    INFRAGENERICEPITHET=""  SPECIFICEPITHET=""  INFRASPECIFICEPITHET="" COMBINATIONAUTHORSHIP_ID="1"    BINOMHYBRID="false" HYBRIDFORMULA="false"   MONOMHYBRID="false"  TRINOMHYBRID="false"    ANAMORPHIC="false" RANK_ID="765"/>
+    <TAXONNAME NAMETYPE="ICNAFP"    ID="60" UUID="80dda188-c7f4-4319-9f30-3596c2540705"  PROTECTEDTITLECACHE="false"     PROTECTEDAUTHORSHIPCACHE="false"    PROTECTEDFULLTITLECACHE="false"     PROTECTEDNAMECACHE="false" TITLECACHE="Yermoloffia Bél."   AUTHORSHIPCACHE="Bél."  NAMECACHE="Yermoloffia" GENUSORUNINOMIAL="Yermoloffia"  INFRAGENERICEPITHET=""  SPECIFICEPITHET=""  INFRASPECIFICEPITHET="" COMBINATIONAUTHORSHIP_ID="1"    BINOMHYBRID="false" HYBRIDFORMULA="false"   MONOMHYBRID="false"  TRINOMHYBRID="false"    ANAMORPHIC="false" RANK_ID="774"/>
+  <TAXONNAME NAMETYPE="ICNAFP"  ID="61" UUID="61e322a4-d6d9-4e18-ab51-ab55c6b8841a"  PROTECTEDTITLECACHE="false"     PROTECTEDAUTHORSHIPCACHE="false"    PROTECTEDFULLTITLECACHE="false"     PROTECTEDNAMECACHE="false" TITLECACHE="Yervamora Kuntze"   AUTHORSHIPCACHE="Kuntze"    NAMECACHE="Yervamora"   GENUSORUNINOMIAL="Yervamora"    INFRAGENERICEPITHET=""  SPECIFICEPITHET=""  INFRASPECIFICEPITHET="" COMBINATIONAUTHORSHIP_ID="1"    BINOMHYBRID="false" HYBRIDFORMULA="false"   MONOMHYBRID="false"  TRINOMHYBRID="false"    ANAMORPHIC="false" RANK_ID="774"/>
   <TAXONNAME NAMETYPE="ICNAFP"  ID="62" UUID="c77cf87f-c87a-4b33-9c6a-3feb83a067c2"  PROTECTEDTITLECACHE="false"     PROTECTEDAUTHORSHIPCACHE="false"    PROTECTEDFULLTITLECACHE="false"     PROTECTEDNAMECACHE="false" TITLECACHE="Yervamora canariensis Kuntze"   AUTHORSHIPCACHE="Kuntze"    NAMECACHE="Yervamora canariensis"   GENUSORUNINOMIAL="Yervamora"    INFRAGENERICEPITHET=""  SPECIFICEPITHET="canariensis"   INFRASPECIFICEPITHET="" COMBINATIONAUTHORSHIP_ID="1"    BINOMHYBRID="false" HYBRIDFORMULA="false"   MONOMHYBRID="false"  TRINOMHYBRID="false"    ANAMORPHIC="false" RANK_ID="765"/>
   <TAXONNAME NAMETYPE="ICNAFP"  ID="63" UUID="73030192-ed9d-404d-ac96-6aa77f996f24"  PROTECTEDTITLECACHE="false"     PROTECTEDAUTHORSHIPCACHE="false"    PROTECTEDFULLTITLECACHE="false"     PROTECTEDNAMECACHE="false" TITLECACHE="Yildirimlia pacis (Güzel, Kayıkçı &amp; S. Yıldız) Kılıç"   AUTHORSHIPCACHE="(Güzel, Kayıkçı &amp; S. Yıldız) Kılıç"    NAMECACHE="Yildirimlia pacis"   GENUSORUNINOMIAL="Yildirimlia"  INFRAGENERICEPITHET=""  SPECIFICEPITHET="pacis" INFRASPECIFICEPITHET="" COMBINATIONAUTHORSHIP_ID="1"    BINOMHYBRID="false" HYBRIDFORMULA="false"   MONOMHYBRID="false"  TRINOMHYBRID="false"    ANAMORPHIC="false" RANK_ID="765"/>
-  <TAXONNAME NAMETYPE="ICNAFP"  ID="64" UUID="00c83e21-9dec-4132-ae09-c1bc2225ee4b"  PROTECTEDTITLECACHE="false"     PROTECTEDAUTHORSHIPCACHE="false"    PROTECTEDFULLTITLECACHE="false"     PROTECTEDNAMECACHE="false" TITLECACHE="Youngia Cass."  AUTHORSHIPCACHE="Cass." NAMECACHE="Youngia" GENUSORUNINOMIAL="Youngia"  INFRAGENERICEPITHET=""  SPECIFICEPITHET=""  INFRASPECIFICEPITHET="" COMBINATIONAUTHORSHIP_ID="1"    BINOMHYBRID="false" HYBRIDFORMULA="false"   MONOMHYBRID="false"  TRINOMHYBRID="false"    ANAMORPHIC="false" RANK_ID="765"/>
+  <TAXONNAME NAMETYPE="ICNAFP"  ID="64" UUID="00c83e21-9dec-4132-ae09-c1bc2225ee4b"  PROTECTEDTITLECACHE="false"     PROTECTEDAUTHORSHIPCACHE="false"    PROTECTEDFULLTITLECACHE="false"     PROTECTEDNAMECACHE="false" TITLECACHE="Youngia Cass."  AUTHORSHIPCACHE="Cass." NAMECACHE="Youngia" GENUSORUNINOMIAL="Youngia"  INFRAGENERICEPITHET=""  SPECIFICEPITHET=""  INFRASPECIFICEPITHET="" COMBINATIONAUTHORSHIP_ID="1"    BINOMHYBRID="false" HYBRIDFORMULA="false"   MONOMHYBRID="false"  TRINOMHYBRID="false"    ANAMORPHIC="false" RANK_ID="774"/>
   <TAXONNAME NAMETYPE="ICNAFP"  ID="65" UUID="84400145-c775-4856-a737-6cc2e93d60a8"  PROTECTEDTITLECACHE="false"     PROTECTEDAUTHORSHIPCACHE="false"    PROTECTEDFULLTITLECACHE="false"     PROTECTEDNAMECACHE="false" TITLECACHE="Youngia dentata (Thunb.) DC."   AUTHORSHIPCACHE="(Thunb.) DC."  NAMECACHE="Youngia dentata" GENUSORUNINOMIAL="Youngia"  INFRAGENERICEPITHET=""  SPECIFICEPITHET="dentata"   INFRASPECIFICEPITHET="" COMBINATIONAUTHORSHIP_ID="1"    BINOMHYBRID="false" HYBRIDFORMULA="false"   MONOMHYBRID="false"  TRINOMHYBRID="false"    ANAMORPHIC="false" RANK_ID="765"/>
   <TAXONNAME NAMETYPE="ICNAFP"  ID="66" UUID="c3f72fa2-4368-4cb6-a15f-a2f7d4667396"  PROTECTEDTITLECACHE="false"     PROTECTEDAUTHORSHIPCACHE="false"    PROTECTEDFULLTITLECACHE="false"     PROTECTEDNAMECACHE="false" TITLECACHE="Youngia japonica (L.) DC."  AUTHORSHIPCACHE="(L.) DC."  NAMECACHE="Youngia japonica"    GENUSORUNINOMIAL="Youngia"  INFRAGENERICEPITHET=""  SPECIFICEPITHET="japonica"  INFRASPECIFICEPITHET="" COMBINATIONAUTHORSHIP_ID="1"    BINOMHYBRID="false" HYBRIDFORMULA="false"   MONOMHYBRID="false"  TRINOMHYBRID="false"    ANAMORPHIC="false" RANK_ID="765"/>
-  <TAXONNAME NAMETYPE="ICNAFP"  ID="67" UUID="d3875b99-1a9d-446f-a543-f7042a6422ac"  PROTECTEDTITLECACHE="false"     PROTECTEDAUTHORSHIPCACHE="false"    PROTECTEDFULLTITLECACHE="false"     PROTECTEDNAMECACHE="false" TITLECACHE="Yucca L."   AUTHORSHIPCACHE="L."    NAMECACHE="Yucca"   GENUSORUNINOMIAL="Yucca"    INFRAGENERICEPITHET=""  SPECIFICEPITHET=""  INFRASPECIFICEPITHET="" COMBINATIONAUTHORSHIP_ID="1"    BINOMHYBRID="false" HYBRIDFORMULA="false"   MONOMHYBRID="false"  TRINOMHYBRID="false"    ANAMORPHIC="false" RANK_ID="765"/>
+  <TAXONNAME NAMETYPE="ICNAFP"  ID="67" UUID="d3875b99-1a9d-446f-a543-f7042a6422ac"  PROTECTEDTITLECACHE="false"     PROTECTEDAUTHORSHIPCACHE="false"    PROTECTEDFULLTITLECACHE="false"     PROTECTEDNAMECACHE="false" TITLECACHE="Yucca L."   AUTHORSHIPCACHE="L."    NAMECACHE="Yucca"   GENUSORUNINOMIAL="Yucca"    INFRAGENERICEPITHET=""  SPECIFICEPITHET=""  INFRASPECIFICEPITHET="" COMBINATIONAUTHORSHIP_ID="1"    BINOMHYBRID="false" HYBRIDFORMULA="false"   MONOMHYBRID="false"  TRINOMHYBRID="false"    ANAMORPHIC="false" RANK_ID="774"/>
   <TAXONNAME NAMETYPE="ICNAFP"  ID="68" UUID="3dc99ff0-182b-4143-9f8c-3cf3b985b81b"  PROTECTEDTITLECACHE="false"     PROTECTEDAUTHORSHIPCACHE="false"    PROTECTEDFULLTITLECACHE="false"     PROTECTEDNAMECACHE="false" TITLECACHE="Yucca acuminata Sweet"  AUTHORSHIPCACHE="Sweet" NAMECACHE="Yucca acuminata" GENUSORUNINOMIAL="Yucca"    INFRAGENERICEPITHET=""  SPECIFICEPITHET="acuminata" INFRASPECIFICEPITHET="" COMBINATIONAUTHORSHIP_ID="1"    BINOMHYBRID="false" HYBRIDFORMULA="false"   MONOMHYBRID="false"  TRINOMHYBRID="false"    ANAMORPHIC="false" RANK_ID="765"/>
   <TAXONNAME NAMETYPE="ICNAFP"  ID="69" UUID="7b3f8a62-7dde-4280-9aca-07a86b2e9040"  PROTECTEDTITLECACHE="false"     PROTECTEDAUTHORSHIPCACHE="false"    PROTECTEDFULLTITLECACHE="false"     PROTECTEDNAMECACHE="false" TITLECACHE="Yucca aloifolia L." AUTHORSHIPCACHE="L."    NAMECACHE="Yucca aloifolia" GENUSORUNINOMIAL="Yucca"    INFRAGENERICEPITHET=""  SPECIFICEPITHET="aloifolia" INFRASPECIFICEPITHET="" COMBINATIONAUTHORSHIP_ID="1"    BINOMHYBRID="false" HYBRIDFORMULA="false"   MONOMHYBRID="false"  TRINOMHYBRID="false"    ANAMORPHIC="false" RANK_ID="765"/>
   <TAXONNAME NAMETYPE="ICNAFP"  ID="70" UUID="9ba460a4-0130-446d-9fec-671a3e949ba6"  PROTECTEDTITLECACHE="false"     PROTECTEDAUTHORSHIPCACHE="false"    PROTECTEDFULLTITLECACHE="false"     PROTECTEDNAMECACHE="false" TITLECACHE="Yucca ensifolia Groenl."    AUTHORSHIPCACHE="Groenl."   NAMECACHE="Yucca ensifolia" GENUSORUNINOMIAL="Yucca"    INFRAGENERICEPITHET=""  SPECIFICEPITHET="ensifolia" INFRASPECIFICEPITHET="" COMBINATIONAUTHORSHIP_ID="1"    BINOMHYBRID="false" HYBRIDFORMULA="false"   MONOMHYBRID="false"  TRINOMHYBRID="false"    ANAMORPHIC="false" RANK_ID="765"/>
   <TAXONNAME NAMETYPE="ICNAFP"  ID="71" UUID="56c1c33e-5447-497d-86bb-1eef72ae5a1b"  PROTECTEDTITLECACHE="false"     PROTECTEDAUTHORSHIPCACHE="false"    PROTECTEDFULLTITLECACHE="false"     PROTECTEDNAMECACHE="false" TITLECACHE="Yucca filamentosa L."   AUTHORSHIPCACHE="L."    NAMECACHE="Yucca filamentosa"   GENUSORUNINOMIAL="Yucca"    INFRAGENERICEPITHET=""  SPECIFICEPITHET="filamentosa"   INFRASPECIFICEPITHET="" COMBINATIONAUTHORSHIP_ID="1"    BINOMHYBRID="false" HYBRIDFORMULA="false"   MONOMHYBRID="false"  TRINOMHYBRID="false"    ANAMORPHIC="false" RANK_ID="765"/>
   <TAXONNAME NAMETYPE="ICNAFP"  ID="72" UUID="0da37b94-2667-4ad6-aff7-6f6ecb46c061"  PROTECTEDTITLECACHE="false"     PROTECTEDAUTHORSHIPCACHE="false"    PROTECTEDFULLTITLECACHE="false"     PROTECTEDNAMECACHE="false" TITLECACHE="Yucca filamentosa L."   AUTHORSHIPCACHE="L."    NAMECACHE="Yucca filamentosa"   GENUSORUNINOMIAL="Yucca"    INFRAGENERICEPITHET=""  SPECIFICEPITHET="filamentosa"   INFRASPECIFICEPITHET="" COMBINATIONAUTHORSHIP_ID="1"    BINOMHYBRID="false" HYBRIDFORMULA="false"   MONOMHYBRID="false"  TRINOMHYBRID="false"    ANAMORPHIC="false" RANK_ID="765"/>
-  <TAXONNAME NAMETYPE="ICNAFP"  ID="73" UUID="c5865725-efa6-443b-9492-55887e58246e"  PROTECTEDTITLECACHE="false"     PROTECTEDAUTHORSHIPCACHE="false"    PROTECTEDFULLTITLECACHE="false"     PROTECTEDNAMECACHE="false" TITLECACHE="Yucca filamentosa f. genuina Engelm."   AUTHORSHIPCACHE="Engelm."   NAMECACHE="Yucca filamentosa f. genuina"    GENUSORUNINOMIAL="Yucca"    INFRAGENERICEPITHET=""  SPECIFICEPITHET="filamentosa"   INFRASPECIFICEPITHET="genuina"  COMBINATIONAUTHORSHIP_ID="1"    BINOMHYBRID="false" HYBRIDFORMULA="false"   MONOMHYBRID="false"  TRINOMHYBRID="false"    ANAMORPHIC="false" RANK_ID="765"/>
+  <TAXONNAME NAMETYPE="ICNAFP"  ID="73" UUID="c5865725-efa6-443b-9492-55887e58246e"  PROTECTEDTITLECACHE="false"     PROTECTEDAUTHORSHIPCACHE="false"    PROTECTEDFULLTITLECACHE="false"     PROTECTEDNAMECACHE="false" TITLECACHE="Yucca filamentosa f. genuina Engelm."   AUTHORSHIPCACHE="Engelm."   NAMECACHE="Yucca filamentosa f. genuina"    GENUSORUNINOMIAL="Yucca"    INFRAGENERICEPITHET=""  SPECIFICEPITHET="filamentosa"   INFRASPECIFICEPITHET="genuina"  COMBINATIONAUTHORSHIP_ID="1"    BINOMHYBRID="false" HYBRIDFORMULA="false"   MONOMHYBRID="false"  TRINOMHYBRID="false"    ANAMORPHIC="false" RANK_ID="755"/>
   <TAXONNAME NAMETYPE="ICNAFP"  ID="74" UUID="484401f1-3480-480b-be3f-47cc95646e7c"  PROTECTEDTITLECACHE="false"     PROTECTEDAUTHORSHIPCACHE="false"    PROTECTEDFULLTITLECACHE="false"     PROTECTEDNAMECACHE="false" TITLECACHE="Yucca gigantea Lem."    AUTHORSHIPCACHE="Lem."  NAMECACHE="Yucca gigantea"  GENUSORUNINOMIAL="Yucca"    INFRAGENERICEPITHET=""  SPECIFICEPITHET="gigantea"  INFRASPECIFICEPITHET="" COMBINATIONAUTHORSHIP_ID="1"    BINOMHYBRID="false" HYBRIDFORMULA="false"   MONOMHYBRID="false"  TRINOMHYBRID="false"    ANAMORPHIC="false" RANK_ID="765"/>
   <TAXONNAME NAMETYPE="ICNAFP"  ID="75" UUID="588ae1cc-2e21-47b5-b303-b07df0fe845f"  PROTECTEDTITLECACHE="false"     PROTECTEDAUTHORSHIPCACHE="false"    PROTECTEDFULLTITLECACHE="false"     PROTECTEDNAMECACHE="false" TITLECACHE="Yucca gloriosa L."  AUTHORSHIPCACHE="L."    NAMECACHE="Yucca gloriosa"  GENUSORUNINOMIAL="Yucca"    INFRAGENERICEPITHET=""  SPECIFICEPITHET="gloriosa"  INFRASPECIFICEPITHET="" COMBINATIONAUTHORSHIP_ID="1"    BINOMHYBRID="false" HYBRIDFORMULA="false"   MONOMHYBRID="false"  TRINOMHYBRID="false"    ANAMORPHIC="false" RANK_ID="765"/>
   <TAXONNAME NAMETYPE="ICNAFP"  ID="76" UUID="136c5d50-e54c-458c-aae0-58c3cbd39168"  PROTECTEDTITLECACHE="false"     PROTECTEDAUTHORSHIPCACHE="false"    PROTECTEDFULLTITLECACHE="false"     PROTECTEDNAMECACHE="false" TITLECACHE="Yucca gloriosa L."  AUTHORSHIPCACHE="L."    NAMECACHE="Yucca gloriosa"  GENUSORUNINOMIAL="Yucca"    INFRAGENERICEPITHET=""  SPECIFICEPITHET="gloriosa"  INFRASPECIFICEPITHET="" COMBINATIONAUTHORSHIP_ID="1"    BINOMHYBRID="false" HYBRIDFORMULA="false"   MONOMHYBRID="false"  TRINOMHYBRID="false"    ANAMORPHIC="false" RANK_ID="765"/>
-  <TAXONNAME NAMETYPE="ICNAFP"  ID="77" UUID="297fe18b-6158-418a-ad8d-905ef5f66693"  PROTECTEDTITLECACHE="false"     PROTECTEDAUTHORSHIPCACHE="false"    PROTECTEDFULLTITLECACHE="false"     PROTECTEDNAMECACHE="false" TITLECACHE="Yucca gloriosa f. genuina Engelm."  AUTHORSHIPCACHE="Engelm."   NAMECACHE="Yucca gloriosa f. genuina"   GENUSORUNINOMIAL="Yucca"    INFRAGENERICEPITHET=""  SPECIFICEPITHET="gloriosa"  INFRASPECIFICEPITHET="genuina"  COMBINATIONAUTHORSHIP_ID="1"    BINOMHYBRID="false" HYBRIDFORMULA="false"   MONOMHYBRID="false"  TRINOMHYBRID="false"    ANAMORPHIC="false" RANK_ID="765"/>
-  <TAXONNAME NAMETYPE="ICNAFP"  ID="78" UUID="07cef315-2e29-4f12-9355-c62eb08d71ad"  PROTECTEDTITLECACHE="false"     PROTECTEDAUTHORSHIPCACHE="false"    PROTECTEDFULLTITLECACHE="false"     PROTECTEDNAMECACHE="false" TITLECACHE="Yucca gloriosa L. var. gloriosa"    AUTHORSHIPCACHE="L."    NAMECACHE="Yucca gloriosa var. gloriosa"    GENUSORUNINOMIAL="Yucca"    INFRAGENERICEPITHET=""  SPECIFICEPITHET="gloriosa"  INFRASPECIFICEPITHET="gloriosa" COMBINATIONAUTHORSHIP_ID="1"    BINOMHYBRID="false" HYBRIDFORMULA="false"   MONOMHYBRID="false"  TRINOMHYBRID="false"    ANAMORPHIC="false" RANK_ID="765"/>
-  <TAXONNAME NAMETYPE="ICNAFP"  ID="79" UUID="756d75db-4992-44eb-847f-275986e4544d"  PROTECTEDTITLECACHE="false"     PROTECTEDAUTHORSHIPCACHE="false"    PROTECTEDFULLTITLECACHE="false"     PROTECTEDNAMECACHE="false" TITLECACHE="Yucca gloriosa var. plicata Carrière"   AUTHORSHIPCACHE="Carrière"  NAMECACHE="Yucca gloriosa var. plicata" GENUSORUNINOMIAL="Yucca"    INFRAGENERICEPITHET=""  SPECIFICEPITHET="gloriosa"  INFRASPECIFICEPITHET="plicata"  COMBINATIONAUTHORSHIP_ID="1"    BINOMHYBRID="false" HYBRIDFORMULA="false"   MONOMHYBRID="false"  TRINOMHYBRID="false"    ANAMORPHIC="false" RANK_ID="765"/>
-  <TAXONNAME NAMETYPE="ICNAFP"  ID="80" UUID="f7cb46e3-b2a2-4ecf-bf7d-763806238660"  PROTECTEDTITLECACHE="false"     PROTECTEDAUTHORSHIPCACHE="false"    PROTECTEDFULLTITLECACHE="false"     PROTECTEDNAMECACHE="false" TITLECACHE="Yucca gloriosa var. superba Baker"  AUTHORSHIPCACHE="Baker" NAMECACHE="Yucca gloriosa var. superba" GENUSORUNINOMIAL="Yucca"    INFRAGENERICEPITHET=""  SPECIFICEPITHET="gloriosa"  INFRASPECIFICEPITHET="superba"  COMBINATIONAUTHORSHIP_ID="1"    BINOMHYBRID="false" HYBRIDFORMULA="false"   MONOMHYBRID="false"  TRINOMHYBRID="false"    ANAMORPHIC="false" RANK_ID="765"/>
+  <TAXONNAME NAMETYPE="ICNAFP"  ID="77" UUID="297fe18b-6158-418a-ad8d-905ef5f66693"  PROTECTEDTITLECACHE="false"     PROTECTEDAUTHORSHIPCACHE="false"    PROTECTEDFULLTITLECACHE="false"     PROTECTEDNAMECACHE="false" TITLECACHE="Yucca gloriosa f. genuina Engelm."  AUTHORSHIPCACHE="Engelm."   NAMECACHE="Yucca gloriosa f. genuina"   GENUSORUNINOMIAL="Yucca"    INFRAGENERICEPITHET=""  SPECIFICEPITHET="gloriosa"  INFRASPECIFICEPITHET="genuina"  COMBINATIONAUTHORSHIP_ID="1"    BINOMHYBRID="false" HYBRIDFORMULA="false"   MONOMHYBRID="false"  TRINOMHYBRID="false"    ANAMORPHIC="false" RANK_ID="755"/>
+  <TAXONNAME NAMETYPE="ICNAFP"  ID="78" UUID="07cef315-2e29-4f12-9355-c62eb08d71ad"  PROTECTEDTITLECACHE="false"     PROTECTEDAUTHORSHIPCACHE="false"    PROTECTEDFULLTITLECACHE="false"     PROTECTEDNAMECACHE="false" TITLECACHE="Yucca gloriosa L. var. gloriosa"    AUTHORSHIPCACHE="L."    NAMECACHE="Yucca gloriosa var. gloriosa"    GENUSORUNINOMIAL="Yucca"    INFRAGENERICEPITHET=""  SPECIFICEPITHET="gloriosa"  INFRASPECIFICEPITHET="gloriosa" COMBINATIONAUTHORSHIP_ID="1"    BINOMHYBRID="false" HYBRIDFORMULA="false"   MONOMHYBRID="false"  TRINOMHYBRID="false"    ANAMORPHIC="false" RANK_ID="761"/>
+  <TAXONNAME NAMETYPE="ICNAFP"  ID="79" UUID="756d75db-4992-44eb-847f-275986e4544d"  PROTECTEDTITLECACHE="false"     PROTECTEDAUTHORSHIPCACHE="false"    PROTECTEDFULLTITLECACHE="false"     PROTECTEDNAMECACHE="false" TITLECACHE="Yucca gloriosa var. plicata Carrière"   AUTHORSHIPCACHE="Carrière"  NAMECACHE="Yucca gloriosa var. plicata" GENUSORUNINOMIAL="Yucca"    INFRAGENERICEPITHET=""  SPECIFICEPITHET="gloriosa"  INFRASPECIFICEPITHET="plicata"  COMBINATIONAUTHORSHIP_ID="1"    BINOMHYBRID="false" HYBRIDFORMULA="false"   MONOMHYBRID="false"  TRINOMHYBRID="false"    ANAMORPHIC="false" RANK_ID="761"/>
+  <TAXONNAME NAMETYPE="ICNAFP"  ID="80" UUID="f7cb46e3-b2a2-4ecf-bf7d-763806238660"  PROTECTEDTITLECACHE="false"     PROTECTEDAUTHORSHIPCACHE="false"    PROTECTEDFULLTITLECACHE="false"     PROTECTEDNAMECACHE="false" TITLECACHE="Yucca gloriosa var. superba Baker"  AUTHORSHIPCACHE="Baker" NAMECACHE="Yucca gloriosa var. superba" GENUSORUNINOMIAL="Yucca"    INFRAGENERICEPITHET=""  SPECIFICEPITHET="gloriosa"  INFRASPECIFICEPITHET="superba"  COMBINATIONAUTHORSHIP_ID="1"    BINOMHYBRID="false" HYBRIDFORMULA="false"   MONOMHYBRID="false"  TRINOMHYBRID="false"    ANAMORPHIC="false" RANK_ID="761"/>
   <TAXONNAME NAMETYPE="ICNAFP"  ID="81" UUID="d2645642-f645-46a1-baa9-3a4077d419f2"  PROTECTEDTITLECACHE="false"     PROTECTEDAUTHORSHIPCACHE="false"    PROTECTEDFULLTITLECACHE="false"     PROTECTEDNAMECACHE="false" TITLECACHE="Yucca parmentieri Roezl"    AUTHORSHIPCACHE="Roezl" NAMECACHE="Yucca parmentieri"   GENUSORUNINOMIAL="Yucca"    INFRAGENERICEPITHET=""  SPECIFICEPITHET="parmentieri"   INFRASPECIFICEPITHET="" COMBINATIONAUTHORSHIP_ID="1"    BINOMHYBRID="false" HYBRIDFORMULA="false"   MONOMHYBRID="false"  TRINOMHYBRID="false"    ANAMORPHIC="false" RANK_ID="765"/>
   <TAXONNAME NAMETYPE="ICNAFP"  ID="82" UUID="606a35da-79c3-4383-a47a-de33e35e330f"  PROTECTEDTITLECACHE="false"     PROTECTEDAUTHORSHIPCACHE="false"    PROTECTEDFULLTITLECACHE="false"     PROTECTEDNAMECACHE="false" TITLECACHE="Yucca patens André" AUTHORSHIPCACHE="André" NAMECACHE="Yucca patens"    GENUSORUNINOMIAL="Yucca"    INFRAGENERICEPITHET=""  SPECIFICEPITHET="patens"    INFRASPECIFICEPITHET="" COMBINATIONAUTHORSHIP_ID="1"    BINOMHYBRID="false" HYBRIDFORMULA="false"   MONOMHYBRID="false"  TRINOMHYBRID="false"    ANAMORPHIC="false" RANK_ID="765"/>
   <TAXONNAME NAMETYPE="ICNAFP"  ID="83" UUID="1c647536-edcc-4f27-8842-3e5076b1b183"  PROTECTEDTITLECACHE="false"     PROTECTEDAUTHORSHIPCACHE="false"    PROTECTEDFULLTITLECACHE="false"     PROTECTEDNAMECACHE="false" TITLECACHE="Yucca pruinosa Baker"   AUTHORSHIPCACHE="Baker" NAMECACHE="Yucca pruinosa"  GENUSORUNINOMIAL="Yucca"    INFRAGENERICEPITHET=""  SPECIFICEPITHET="pruinosa"  INFRASPECIFICEPITHET="" COMBINATIONAUTHORSHIP_ID="1"    BINOMHYBRID="false" HYBRIDFORMULA="false"   MONOMHYBRID="false"  TRINOMHYBRID="false"    ANAMORPHIC="false" RANK_ID="765"/>
   <TAXONNAME NAMETYPE="ICNAFP"  ID="84" UUID="80378f23-0405-48f4-abca-7217612798c0"  PROTECTEDTITLECACHE="false"     PROTECTEDAUTHORSHIPCACHE="false"    PROTECTEDFULLTITLECACHE="false"     PROTECTEDNAMECACHE="false" TITLECACHE="Yucca recurvifolia Salisb." AUTHORSHIPCACHE="Salisb."   NAMECACHE="Yucca recurvifolia"  GENUSORUNINOMIAL="Yucca"    INFRAGENERICEPITHET=""  SPECIFICEPITHET="recurvifolia"  INFRASPECIFICEPITHET="" COMBINATIONAUTHORSHIP_ID="1"    BINOMHYBRID="false" HYBRIDFORMULA="false"   MONOMHYBRID="false"  TRINOMHYBRID="false"    ANAMORPHIC="false" RANK_ID="765"/>
   <TAXONNAME NAMETYPE="ICNAFP"  ID="85" UUID="bc6467e7-65e7-4db6-93be-a6f0b7fb7a23"  PROTECTEDTITLECACHE="false"     PROTECTEDAUTHORSHIPCACHE="false"    PROTECTEDFULLTITLECACHE="false"     PROTECTEDNAMECACHE="false" TITLECACHE="Yucca superba Roxb."    AUTHORSHIPCACHE="Roxb." NAMECACHE="Yucca superba"   GENUSORUNINOMIAL="Yucca"    INFRAGENERICEPITHET=""  SPECIFICEPITHET="superba"   INFRASPECIFICEPITHET="" COMBINATIONAUTHORSHIP_ID="1"    BINOMHYBRID="false" HYBRIDFORMULA="false"   MONOMHYBRID="false"  TRINOMHYBRID="false"    ANAMORPHIC="false" RANK_ID="765"/>
-  <TAXONNAME NAMETYPE="ICNAFP"  ID="86" UUID="328aef66-f30e-4acf-afba-0f45e311d327"  PROTECTEDTITLECACHE="false"     PROTECTEDAUTHORSHIPCACHE="false"    PROTECTEDFULLTITLECACHE="false"     PROTECTEDNAMECACHE="false" TITLECACHE="Yushania Keng f."   AUTHORSHIPCACHE="Keng f."   NAMECACHE="Yushania"    GENUSORUNINOMIAL="Yushania" INFRAGENERICEPITHET=""  SPECIFICEPITHET=""  INFRASPECIFICEPITHET="" COMBINATIONAUTHORSHIP_ID="1"    BINOMHYBRID="false" HYBRIDFORMULA="false"   MONOMHYBRID="false"  TRINOMHYBRID="false"    ANAMORPHIC="false" RANK_ID="765"/>
+  <TAXONNAME NAMETYPE="ICNAFP"  ID="86" UUID="328aef66-f30e-4acf-afba-0f45e311d327"  PROTECTEDTITLECACHE="false"     PROTECTEDAUTHORSHIPCACHE="false"    PROTECTEDFULLTITLECACHE="false"     PROTECTEDNAMECACHE="false" TITLECACHE="Yushania Keng f."   AUTHORSHIPCACHE="Keng f."   NAMECACHE="Yushania"    GENUSORUNINOMIAL="Yushania" INFRAGENERICEPITHET=""  SPECIFICEPITHET=""  INFRASPECIFICEPITHET="" COMBINATIONAUTHORSHIP_ID="1"    BINOMHYBRID="false" HYBRIDFORMULA="false"   MONOMHYBRID="false"  TRINOMHYBRID="false"    ANAMORPHIC="false" RANK_ID="774"/>
   <TAXONNAME NAMETYPE="ICNAFP"  ID="87" UUID="399acb17-80d3-4470-983b-92ff4d1ec883"  PROTECTEDTITLECACHE="false"     PROTECTEDAUTHORSHIPCACHE="false"    PROTECTEDFULLTITLECACHE="false"     PROTECTEDNAMECACHE="false" TITLECACHE="Yushania anceps (Mitford) W. C. Lin"    AUTHORSHIPCACHE="(Mitford) W. C. Lin"   NAMECACHE="Yushania anceps" GENUSORUNINOMIAL="Yushania" INFRAGENERICEPITHET=""  SPECIFICEPITHET="anceps"    INFRASPECIFICEPITHET="" COMBINATIONAUTHORSHIP_ID="1"    BINOMHYBRID="false" HYBRIDFORMULA="false"   MONOMHYBRID="false"  TRINOMHYBRID="false"    ANAMORPHIC="false" RANK_ID="765"/>
   
   <AGENTBASE DTYPE="Person" ID="1" UUID="a598ab3f-b33b-4b4b-b237-d616fcb6b5b1" TITLECACHE="Turland, N.J." PROTECTEDTITLECACHE="true" NOMENCLATURALTITLE="Turl." FAMILYNAME="Turland" INITIALS="N.J." />