diff --git a/dspace-api/src/main/java/org/dspace/discovery/SolrServiceBestMatchIndexingPlugin.java b/dspace-api/src/main/java/org/dspace/discovery/SolrServiceBestMatchIndexingPlugin.java index 39130e9224d2..a1830a3931c7 100644 --- a/dspace-api/src/main/java/org/dspace/discovery/SolrServiceBestMatchIndexingPlugin.java +++ b/dspace-api/src/main/java/org/dspace/discovery/SolrServiceBestMatchIndexingPlugin.java @@ -68,7 +68,7 @@ protected void addIndexValueForPersonItem(Item item, SolrInputDocument document) String lastName = getMetadataValue(item, LASTNAME_FIELD); List fullNames = getMetadataValues(item, FULLNAME_FIELDS); - getAllNameVariants(firstName, lastName, fullNames) + getAllNameVariants(firstName, lastName, fullNames, item.getID().toString()) .forEach(variant -> addIndexValue(document, variant)); } diff --git a/dspace-api/src/main/java/org/dspace/util/PersonNameUtil.java b/dspace-api/src/main/java/org/dspace/util/PersonNameUtil.java index 0e88a0a9cdf5..cea02c76990b 100644 --- a/dspace-api/src/main/java/org/dspace/util/PersonNameUtil.java +++ b/dspace-api/src/main/java/org/dspace/util/PersonNameUtil.java @@ -16,6 +16,7 @@ import org.apache.commons.collections4.iterators.PermutationIterator; import org.apache.commons.lang3.StringUtils; +import org.apache.logging.log4j.Logger; /** * Utility class that handle person names. @@ -24,6 +25,7 @@ * */ public final class PersonNameUtil { + private static Logger log = org.apache.logging.log4j.LogManager.getLogger(PersonNameUtil.class); private PersonNameUtil() { @@ -35,12 +37,14 @@ private PersonNameUtil() { * @param firstName the first name * @param lastName the last name * @param fullNames the full names + * @param uuid the uuid * @return all the variants of the given names */ - public static Set getAllNameVariants(String firstName, String lastName, List fullNames) { + public static Set getAllNameVariants(String firstName, String lastName, List fullNames, + String uuid) { Set variants = new HashSet(); variants.addAll(getNameVariants(firstName, lastName)); - variants.addAll(getNameVariants(fullNames)); + variants.addAll(getNameVariants(fullNames, uuid)); return variants; } @@ -95,24 +99,30 @@ private static List getNameVariants(String[] firstNames, String lastName return variants; } - private static List getNameVariants(List fullNames) { + private static List getNameVariants(List fullNames, String uuid) { return fullNames.stream() .filter(Objects::nonNull) .map(name -> removeComma(name)) .distinct() - .flatMap(name -> getAllNamePermutations(name).stream()) + .flatMap(name -> getAllNamePermutations(name, uuid).stream()) .distinct() .collect(Collectors.toList()); } - private static List getAllNamePermutations(String name) { + private static List getAllNamePermutations(String name, String uuid) { List namePermutations = new ArrayList(); - PermutationIterator permutationIterator = new PermutationIterator(List.of(name.split(" "))); + List names = List.of(name.split(" ")); + if (names.size() < 5) { + PermutationIterator permutationIterator = new PermutationIterator(names); - while (permutationIterator.hasNext()) { - namePermutations.add(String.join(" ", permutationIterator.next())); + while (permutationIterator.hasNext()) { + namePermutations.add(String.join(" ", permutationIterator.next())); + } + } else { + log.warn(String.format("Cannot retrieve variants on the Person with UUID %s because the name is too long", + uuid)); } return namePermutations; diff --git a/dspace-api/src/test/java/org/dspace/util/PersonNameUtilTest.java b/dspace-api/src/test/java/org/dspace/util/PersonNameUtilTest.java index fe80bf143756..c0c5a0c02194 100644 --- a/dspace-api/src/test/java/org/dspace/util/PersonNameUtilTest.java +++ b/dspace-api/src/test/java/org/dspace/util/PersonNameUtilTest.java @@ -27,7 +27,8 @@ public class PersonNameUtilTest { @Test public void testWithAllNames() { - Set variants = getAllNameVariants("Luca", "Giamminonni", List.of("Giamminonni, Luca", "Luke Giammo")); + Set variants = getAllNameVariants("Luca", "Giamminonni", List.of("Giamminonni, Luca", + "Luke Giammo"), "uuid"); assertThat(variants, containsInAnyOrder("Giamminonni Luca", "Luca Giamminonni", "Giamminonni L.", "L. Giamminonni", "Giamminonni L", "L Giamminonni", "Luke Giammo", "Giammo Luke")); @@ -37,7 +38,7 @@ public void testWithAllNames() { public void testWithFirstNameComposedByTwoNames() { Set variants = getAllNameVariants("Luca Paolo", "Giamminonni", - List.of("Giamminonni, Luca", "Luke Giammo")); + List.of("Giamminonni, Luca", "Luke Giammo"), "uuid"); assertThat(variants, containsInAnyOrder("Giamminonni Luca Paolo", "Luca Paolo Giamminonni", "Giamminonni Luca", "Luca Giamminonni", "Giamminonni Paolo", "Paolo Giamminonni", @@ -51,7 +52,7 @@ public void testWithFirstNameComposedByTwoNames() { public void testWithFirstNameComposedByThreeNames() { Set variants = getAllNameVariants("Luca Paolo Claudio", "Giamminonni", - List.of("Giamminonni, Luca", "Luke Giammo")); + List.of("Giamminonni, Luca", "Luke Giammo"), "uuid"); assertThat(variants, containsInAnyOrder("Giamminonni Luca Paolo Claudio", "Luca Paolo Claudio Giamminonni", "Giamminonni Luca Claudio", "Luca Claudio Giamminonni", "Giamminonni Paolo Claudio", @@ -69,7 +70,8 @@ public void testWithFirstNameComposedByThreeNames() { @Test public void testWithoutFirstAndLastName() { - Set variants = getAllNameVariants(null, null, List.of("Giamminonni, Luca Fabio", "Luke Giammo")); + Set variants = getAllNameVariants(null, null, List.of("Giamminonni, Luca Fabio", "Luke Giammo"), + "uuid"); assertThat(variants, containsInAnyOrder("Giamminonni Luca Fabio", "Fabio Luca Giamminonni", "Giamminonni Fabio Luca", "Luca Fabio Giamminonni", "Luca Giamminonni Fabio", @@ -80,12 +82,13 @@ public void testWithoutFirstAndLastName() { @Test public void testWithAlreadyTruncatedName() { - Set variants = getAllNameVariants("L.", "Giamminonni", List.of("Giamminonni, Luca")); + Set variants = getAllNameVariants("L.", "Giamminonni", List.of("Giamminonni, Luca"), + "uuid"); assertThat(variants, containsInAnyOrder("Giamminonni Luca", "Luca Giamminonni", "Giamminonni L.", "L. Giamminonni", "Giamminonni L", "L Giamminonni")); - variants = getAllNameVariants("L. P.", "Giamminonni", List.of("Giamminonni, Luca")); + variants = getAllNameVariants("L. P.", "Giamminonni", List.of("Giamminonni, Luca"), "uuid"); assertThat(variants, containsInAnyOrder("Giamminonni Luca", "Luca Giamminonni", "L. Giamminonni", "Giamminonni L.", "P. Giamminonni", "Giamminonni P.", "Giamminonni L. P.", "L. P. Giamminonni", @@ -97,7 +100,8 @@ public void testWithAlreadyTruncatedName() { @Test public void testWithAlreadyTruncatedNameOnFullName() { - Set variants = getAllNameVariants("Luca", "Giamminonni", List.of("Giamminonni, L.")); + Set variants = getAllNameVariants("Luca", "Giamminonni", List.of("Giamminonni, L."), + "uuid"); assertThat(variants, containsInAnyOrder("Giamminonni Luca", "Luca Giamminonni", "Giamminonni L.", "L. Giamminonni", "Giamminonni L", "L Giamminonni"));