This is an automated email from the ASF dual-hosted git repository.
yuqi4733 pushed a commit to branch branch-0.9
in repository https://gitbox.apache.org/repos/asf/gravitino.git
The following commit(s) were added to refs/heads/branch-0.9 by this push:
new 8a34633db2 [#7688] fix(server): Fix duplicated tags when list tags for
a metadata object. (#7834)
8a34633db2 is described below
commit 8a34633db25d8ccee02df4ce9cdd8ef58ca3555d
Author: github-actions[bot]
<41898282+github-actions[bot]@users.noreply.github.com>
AuthorDate: Wed Jul 30 21:08:28 2025 +0800
[#7688] fix(server): Fix duplicated tags when list tags for a metadata
object. (#7834)
### What changes were proposed in this pull request?
Use set to remove duplicated tags when list all tags for a metadata
object.
### Why are the changes needed?
We need to eliminate duplicates.
Fix: #7688
### Does this PR introduce _any_ user-facing change?
N/A
### How was this patch tested?
UT
Co-authored-by: Mini Yu <[email protected]>
---
.../gravitino/client/integration/test/TagIT.java | 5 ++-
.../web/rest/MetadataObjectTagOperations.java | 11 +++---
.../web/rest/TestMetadataObjectTagOperations.java | 41 ++++++++++++++++++++++
3 files changed, 48 insertions(+), 9 deletions(-)
diff --git
a/clients/client-java/src/test/java/org/apache/gravitino/client/integration/test/TagIT.java
b/clients/client-java/src/test/java/org/apache/gravitino/client/integration/test/TagIT.java
index c532bc93f3..91d1c7e85a 100644
---
a/clients/client-java/src/test/java/org/apache/gravitino/client/integration/test/TagIT.java
+++
b/clients/client-java/src/test/java/org/apache/gravitino/client/integration/test/TagIT.java
@@ -434,7 +434,7 @@ public class TagIT extends BaseIT {
// Test list associated tags with details for schema
Tag[] tags2 = schema.supportsTags().listTagsInfo();
- Assertions.assertEquals(3, tags2.length);
+ Assertions.assertEquals(2, tags2.length);
Set<Tag> nonInheritedTags =
Arrays.stream(tags2).filter(tag ->
!tag.inherited().get()).collect(Collectors.toSet());
@@ -442,10 +442,9 @@ public class TagIT extends BaseIT {
Arrays.stream(tags2).filter(tag ->
tag.inherited().get()).collect(Collectors.toSet());
Assertions.assertEquals(2, nonInheritedTags.size());
- Assertions.assertEquals(1, inheritedTags.size());
+ Assertions.assertEquals(0, inheritedTags.size());
Assertions.assertTrue(nonInheritedTags.contains(tag1));
Assertions.assertTrue(nonInheritedTags.contains(tag2));
- Assertions.assertTrue(inheritedTags.contains(tag1));
Assertions.assertFalse(inheritedTags.contains(tag2));
// Test get associated tag for schema
diff --git
a/server/src/main/java/org/apache/gravitino/server/web/rest/MetadataObjectTagOperations.java
b/server/src/main/java/org/apache/gravitino/server/web/rest/MetadataObjectTagOperations.java
index 9c3eda52b3..2abc645e60 100644
---
a/server/src/main/java/org/apache/gravitino/server/web/rest/MetadataObjectTagOperations.java
+++
b/server/src/main/java/org/apache/gravitino/server/web/rest/MetadataObjectTagOperations.java
@@ -20,12 +20,11 @@ package org.apache.gravitino.server.web.rest;
import com.codahale.metrics.annotation.ResponseMetered;
import com.codahale.metrics.annotation.Timed;
-import com.google.common.collect.Lists;
import java.util.Arrays;
import java.util.Collections;
-import java.util.List;
import java.util.Locale;
import java.util.Optional;
+import java.util.Set;
import javax.inject.Inject;
import javax.servlet.http.HttpServletRequest;
import javax.ws.rs.DefaultValue;
@@ -51,6 +50,7 @@ import org.apache.gravitino.metrics.MetricNames;
import org.apache.gravitino.server.web.Utils;
import org.apache.gravitino.tag.Tag;
import org.apache.gravitino.tag.TagDispatcher;
+import org.glassfish.jersey.internal.guava.Sets;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
@@ -163,7 +163,7 @@ public class MetadataObjectTagOperations {
MetadataObjects.parse(
fullName,
MetadataObject.Type.valueOf(type.toUpperCase(Locale.ROOT)));
- List<TagDTO> tags = Lists.newArrayList();
+ Set<TagDTO> tags = Sets.newHashSet();
Tag[] nonInheritedTags =
tagDispatcher.listTagsInfoForMetadataObject(metalake, object);
if (ArrayUtils.isNotEmpty(nonInheritedTags)) {
Collections.addAll(
@@ -197,9 +197,8 @@ public class MetadataObjectTagOperations {
return Utils.ok(new TagListResponse(tags.toArray(new
TagDTO[0])));
} else {
- // Due to same name tag will be associated to both parent and
child objects, so we
- // need to deduplicate the tag names.
- String[] tagNames =
tags.stream().map(TagDTO::name).distinct().toArray(String[]::new);
+ // We have used Set to avoid duplicate tag names
+ String[] tagNames =
tags.stream().map(TagDTO::name).toArray(String[]::new);
LOG.info(
"List {} tags for object type: {}, full name: {} under
metalake: {}",
diff --git
a/server/src/test/java/org/apache/gravitino/server/web/rest/TestMetadataObjectTagOperations.java
b/server/src/test/java/org/apache/gravitino/server/web/rest/TestMetadataObjectTagOperations.java
index 8a1d09d21e..f95f0ca5a1 100644
---
a/server/src/test/java/org/apache/gravitino/server/web/rest/TestMetadataObjectTagOperations.java
+++
b/server/src/test/java/org/apache/gravitino/server/web/rest/TestMetadataObjectTagOperations.java
@@ -338,6 +338,47 @@ public class TestMetadataObjectTagOperations extends
JerseyTest {
Assertions.assertTrue(resultNames2.contains("tag3"));
Assertions.assertTrue(resultNames2.contains("tag5"));
Assertions.assertTrue(resultNames2.contains("tag7"));
+
+ tableTagInfos =
+ new Tag[] {
+
TagEntity.builder().withName("tag5").withId(1L).withAuditInfo(testAuditInfo1).build(),
+ // Tag tag3 already associated with schema
+
TagEntity.builder().withName("tag3").withId(2L).withAuditInfo(testAuditInfo1).build(),
+ // Tag tag1 already associated with catalog
+
TagEntity.builder().withName("tag1").withId(3L).withAuditInfo(testAuditInfo1).build(),
+
TagEntity.builder().withName("tag0").withId(3L).withAuditInfo(testAuditInfo1).build()
+ };
+ when(tagManager.listTagsInfoForMetadataObject(metalake,
table)).thenReturn(tableTagInfos);
+
+ Response response8 =
+ target(basePath(metalake))
+ .path(table.type().toString())
+ .path(table.fullName())
+ .path("tags")
+ .queryParam("details", true)
+ .request(MediaType.APPLICATION_JSON_TYPE)
+ .accept("application/vnd.gravitino.v1+json")
+ .get();
+
+ Assertions.assertEquals(Response.Status.OK.getStatusCode(),
response8.getStatus());
+
+ TagListResponse tagListResponse8 =
response8.readEntity(TagListResponse.class);
+ Assertions.assertEquals(0, tagListResponse8.getCode());
+ Assertions.assertEquals(4, tagListResponse8.getTags().length);
+
+ Map<String, Tag> resultTags8 =
+ Arrays.stream(tagListResponse8.getTags())
+ .collect(Collectors.toMap(Tag::name, Function.identity()));
+
+ Assertions.assertTrue(resultTags8.containsKey("tag0"));
+ Assertions.assertTrue(resultTags8.containsKey("tag1"));
+ Assertions.assertTrue(resultTags8.containsKey("tag3"));
+ Assertions.assertTrue(resultTags8.containsKey("tag5"));
+
+ Assertions.assertFalse(resultTags8.get("tag1").inherited().get());
+ Assertions.assertFalse(resultTags8.get("tag3").inherited().get());
+ Assertions.assertFalse(resultTags8.get("tag5").inherited().get());
+ Assertions.assertFalse(resultTags8.get("tag0").inherited().get());
}
@Test