diff --git a/catalog-rest-service/src/main/java/org/openmetadata/catalog/jdbi3/EntityRepository.java b/catalog-rest-service/src/main/java/org/openmetadata/catalog/jdbi3/EntityRepository.java index b5bcf5a080a..a6e089cb541 100644 --- a/catalog-rest-service/src/main/java/org/openmetadata/catalog/jdbi3/EntityRepository.java +++ b/catalog-rest-service/src/main/java/org/openmetadata/catalog/jdbi3/EntityRepository.java @@ -23,6 +23,7 @@ import static org.openmetadata.catalog.util.EntityUtil.entityReferenceMatch; import static org.openmetadata.catalog.util.EntityUtil.nextMajorVersion; import static org.openmetadata.catalog.util.EntityUtil.nextVersion; import static org.openmetadata.catalog.util.EntityUtil.objectMatch; +import static org.openmetadata.catalog.util.EntityUtil.tagLabelMatch; import static org.openmetadata.common.utils.CommonUtil.listOrEmpty; import com.fasterxml.jackson.core.JsonProcessingException; @@ -566,11 +567,17 @@ public abstract class EntityRepository { return tagLabels; } - List updatedTagLabels = new ArrayList<>(tagLabels); + List updatedTagLabels = new ArrayList<>(); for (TagLabel tagLabel : tagLabels) { + TagLabel existingTag = + updatedTagLabels.stream().filter(c -> tagLabelMatch.test(c, tagLabel)).findAny().orElse(null); + if (existingTag != null) { + continue; // tag label is already seen. Don't add duplicate tags. + } + + updatedTagLabels.add(tagLabel); if (tagLabel.getSource() != Source.TAG) { - // Related tags are not supported for Glossary yet - continue; + continue; // Related tags are not supported for Glossary yet } String json = daoCollection.tagDAO().findTag(tagLabel.getTagFQN()); if (json == null) { @@ -997,7 +1004,7 @@ public abstract class EntityRepository { List addedTags = new ArrayList<>(); List deletedTags = new ArrayList<>(); - recordListChange(fieldName, origTags, updatedTags, addedTags, deletedTags, EntityUtil.tagLabelMatch); + recordListChange(fieldName, origTags, updatedTags, addedTags, deletedTags, tagLabelMatch); updatedTags.sort(compareTagLabel); applyTags(updatedTags, fqn); } diff --git a/catalog-rest-service/src/test/java/org/openmetadata/catalog/resources/EntityResourceTest.java b/catalog-rest-service/src/test/java/org/openmetadata/catalog/resources/EntityResourceTest.java index 1daa8c179c0..7441be758bf 100644 --- a/catalog-rest-service/src/test/java/org/openmetadata/catalog/resources/EntityResourceTest.java +++ b/catalog-rest-service/src/test/java/org/openmetadata/catalog/resources/EntityResourceTest.java @@ -1208,8 +1208,12 @@ public abstract class EntityResourceTest extends CatalogApplicationTest { if (supportsTags) { entityInterface.setTags(new ArrayList<>()); entityInterface.getTags().add(USER_ADDRESS_TAG_LABEL); + entityInterface.getTags().add(USER_ADDRESS_TAG_LABEL); // Add duplicated tags and make sure only one tag is added entityInterface.getTags().add(GLOSSARY2_TERM1_LABEL); - change.getFieldsAdded().add(new FieldChange().withName("tags").withNewValue(entityInterface.getTags())); + entityInterface.getTags().add(GLOSSARY2_TERM1_LABEL); // Add duplicated tags and make sure only one tag is added + change + .getFieldsAdded() + .add(new FieldChange().withName("tags").withNewValue(List.of(USER_ADDRESS_TAG_LABEL, GLOSSARY2_TERM1_LABEL))); } change .getFieldsAdded() diff --git a/catalog-rest-service/src/test/java/org/openmetadata/catalog/resources/databases/TableResourceTest.java b/catalog-rest-service/src/test/java/org/openmetadata/catalog/resources/databases/TableResourceTest.java index 820996b9308..d4611489f0e 100644 --- a/catalog-rest-service/src/test/java/org/openmetadata/catalog/resources/databases/TableResourceTest.java +++ b/catalog-rest-service/src/test/java/org/openmetadata/catalog/resources/databases/TableResourceTest.java @@ -570,6 +570,7 @@ public class TableResourceTest extends EntityResourceTest { // List tags = new ArrayList<>(); tags.add(USER_ADDRESS_TAG_LABEL); + tags.add(USER_ADDRESS_TAG_LABEL); // Duplicated tags should be handled List columns = new ArrayList<>(); columns.add(getColumn("c1", BIGINT, null).withTags(tags)); @@ -588,6 +589,7 @@ public class TableResourceTest extends EntityResourceTest { // Ensure description and previous tag is carried forward during update // tags.add(GLOSSARY1_TERM1_LABEL); + tags.add(GLOSSARY1_TERM1_LABEL); // Duplicated tags should be handled List updatedColumns = new ArrayList<>(); updatedColumns.add(getColumn("c1", BIGINT, null).withTags(tags)); ChangeDescription change = getChangeDescription(table.getVersion());