From 990aee8263fe339ad3fa880e1c46c44be819afa2 Mon Sep 17 00:00:00 2001 From: XingY Date: Tue, 7 Apr 2026 10:14:29 -0700 Subject: [PATCH 1/3] GitHub Issue 954: Add error for duplicate values for parent inputs --- api/src/org/labkey/api/data/NameGenerator.java | 15 ++++++++++++++- 1 file changed, 14 insertions(+), 1 deletion(-) diff --git a/api/src/org/labkey/api/data/NameGenerator.java b/api/src/org/labkey/api/data/NameGenerator.java index 517d7f3574e..3947d27e314 100644 --- a/api/src/org/labkey/api/data/NameGenerator.java +++ b/api/src/org/labkey/api/data/NameGenerator.java @@ -729,7 +729,7 @@ protected int write() .filter(s -> !s.isEmpty()); } - public static Stream parentNames(Object value, String parentColName, TSVWriter tsvWriter, @Nullable BatchValidationException errors) + public static @Nullable Stream parentNames(Object value, String parentColName, TSVWriter tsvWriter, @Nullable BatchValidationException errors) { if (value == null) return Stream.empty(); @@ -783,6 +783,19 @@ else if (value instanceof JSONArray jsonArray) throw new IllegalStateException("For parent values in naming pattern, expected string or collection for '" + parentColName + "': " + value); } + if (values != null) + { + Set valueSet = new HashSet<>(); + List duplicates = values.filter(s -> !valueSet.add(s)).toList(); + if (!duplicates.isEmpty()) + { + if (errors != null) + errors.addRowError(new ValidationException("Duplicate parent names found: " + StringUtils.join(duplicates, ", "), parentColName)); + else + throw new IllegalStateException("Duplicate parent names found: " + StringUtils.join(duplicates, ", ")); + } + } + return values; } From 5668813ad080f4f0a942080e7818570707ebcb18 Mon Sep 17 00:00:00 2001 From: XingY Date: Tue, 7 Apr 2026 13:35:22 -0700 Subject: [PATCH 2/3] jest and api tests --- api/src/org/labkey/api/data/NameGenerator.java | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/api/src/org/labkey/api/data/NameGenerator.java b/api/src/org/labkey/api/data/NameGenerator.java index 3947d27e314..7e45d053587 100644 --- a/api/src/org/labkey/api/data/NameGenerator.java +++ b/api/src/org/labkey/api/data/NameGenerator.java @@ -785,8 +785,9 @@ else if (value instanceof JSONArray jsonArray) if (values != null) { + List valueList = values.toList(); Set valueSet = new HashSet<>(); - List duplicates = values.filter(s -> !valueSet.add(s)).toList(); + List duplicates = valueList.stream().filter(s -> !valueSet.add(s)).toList(); if (!duplicates.isEmpty()) { if (errors != null) @@ -794,6 +795,7 @@ else if (value instanceof JSONArray jsonArray) else throw new IllegalStateException("Duplicate parent names found: " + StringUtils.join(duplicates, ", ")); } + return valueList.stream(); } return values; From e4e7cd96b64c3314e1c1ef7ee9ebc1953e4d03bb Mon Sep 17 00:00:00 2001 From: XingY Date: Thu, 9 Apr 2026 08:21:10 -0700 Subject: [PATCH 3/3] merge from develop --- api/src/org/labkey/api/data/NameGenerator.java | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/api/src/org/labkey/api/data/NameGenerator.java b/api/src/org/labkey/api/data/NameGenerator.java index 7e45d053587..dc2801d40bd 100644 --- a/api/src/org/labkey/api/data/NameGenerator.java +++ b/api/src/org/labkey/api/data/NameGenerator.java @@ -76,6 +76,7 @@ import java.util.function.Supplier; import java.util.regex.Matcher; import java.util.regex.Pattern; +import java.util.stream.Collectors; import java.util.stream.Stream; import static org.labkey.api.exp.api.ExpMaterial.ALIQUOTED_FROM_INPUT; @@ -787,7 +788,7 @@ else if (value instanceof JSONArray jsonArray) { List valueList = values.toList(); Set valueSet = new HashSet<>(); - List duplicates = valueList.stream().filter(s -> !valueSet.add(s)).toList(); + Set duplicates = valueList.stream().filter(s -> !valueSet.add(s)).collect(Collectors.toSet()); if (!duplicates.isEmpty()) { if (errors != null)