diff --git a/openmetadata-service/src/main/java/org/openmetadata/service/jdbi3/TableRepository.java b/openmetadata-service/src/main/java/org/openmetadata/service/jdbi3/TableRepository.java
index 78afccca08f..16282dbd6eb 100644
--- a/openmetadata-service/src/main/java/org/openmetadata/service/jdbi3/TableRepository.java
+++ b/openmetadata-service/src/main/java/org/openmetadata/service/jdbi3/TableRepository.java
@@ -782,20 +782,31 @@ public class TableRepository extends EntityRepository
{
Table table = (Table) entity;
for (Column col : table.getColumns()) {
if (col.getFullyQualifiedName().equals(columnFQN)) {
- if (suggestion.getType().equals(SuggestionType.SuggestTagLabel)) {
- List tags = new ArrayList<>(col.getTags());
- tags.addAll(suggestion.getTagLabels());
- col.setTags(tags);
- } else if (suggestion.getType().equals(SuggestionType.SuggestDescription)) {
- col.setDescription(suggestion.getDescription());
- } else {
- throw new SuggestionException("Invalid suggestion Type");
+ applySuggestionToColumn(col, suggestion);
+ }
+ if (col.getChildren() != null && !col.getChildren().isEmpty()) {
+ for (Column child : col.getChildren()) {
+ if (child.getFullyQualifiedName().equals(columnFQN)) {
+ applySuggestionToColumn(child, suggestion);
+ }
}
}
}
return table;
}
+ public void applySuggestionToColumn(Column column, Suggestion suggestion) {
+ if (suggestion.getType().equals(SuggestionType.SuggestTagLabel)) {
+ List tags = new ArrayList<>(column.getTags());
+ tags.addAll(suggestion.getTagLabels());
+ column.setTags(tags);
+ } else if (suggestion.getType().equals(SuggestionType.SuggestDescription)) {
+ column.setDescription(suggestion.getDescription());
+ } else {
+ throw new SuggestionException("Invalid suggestion Type");
+ }
+ }
+
@Override
public String exportToCsv(String name, String user, boolean recursive) throws IOException {
// Validate table
diff --git a/openmetadata-service/src/test/java/org/openmetadata/service/resources/feeds/SuggestionsResourceTest.java b/openmetadata-service/src/test/java/org/openmetadata/service/resources/feeds/SuggestionsResourceTest.java
index dea47791288..7f54a8751e7 100644
--- a/openmetadata-service/src/test/java/org/openmetadata/service/resources/feeds/SuggestionsResourceTest.java
+++ b/openmetadata-service/src/test/java/org/openmetadata/service/resources/feeds/SuggestionsResourceTest.java
@@ -1,5 +1,6 @@
package org.openmetadata.service.resources.feeds;
+import static java.util.Collections.singletonList;
import static javax.ws.rs.core.Response.Status.BAD_REQUEST;
import static javax.ws.rs.core.Response.Status.CREATED;
import static javax.ws.rs.core.Response.Status.FORBIDDEN;
@@ -7,6 +8,8 @@ import static javax.ws.rs.core.Response.Status.NOT_FOUND;
import static org.junit.jupiter.api.Assertions.assertEquals;
import static org.junit.jupiter.api.Assertions.assertNotNull;
import static org.junit.jupiter.api.Assertions.assertNull;
+import static org.openmetadata.schema.type.ColumnDataType.INT;
+import static org.openmetadata.schema.type.ColumnDataType.STRUCT;
import static org.openmetadata.service.exception.CatalogExceptionMessage.entityNotFound;
import static org.openmetadata.service.resources.EntityResourceTest.C1;
import static org.openmetadata.service.resources.EntityResourceTest.C2;
@@ -14,6 +17,8 @@ import static org.openmetadata.service.resources.EntityResourceTest.PERSONAL_DAT
import static org.openmetadata.service.resources.EntityResourceTest.PII_SENSITIVE_TAG_LABEL;
import static org.openmetadata.service.resources.EntityResourceTest.TIER1_TAG_LABEL;
import static org.openmetadata.service.resources.EntityResourceTest.TIER2_TAG_LABEL;
+import static org.openmetadata.service.resources.EntityResourceTest.USER_ADDRESS_TAG_LABEL;
+import static org.openmetadata.service.resources.databases.TableResourceTest.getColumn;
import static org.openmetadata.service.security.SecurityUtil.authHeaders;
import static org.openmetadata.service.util.TestUtils.ADMIN_AUTH_HEADERS;
import static org.openmetadata.service.util.TestUtils.assertResponse;
@@ -67,6 +72,7 @@ import org.openmetadata.service.util.TestUtils;
public class SuggestionsResourceTest extends OpenMetadataApplicationTest {
public static Table TABLE;
public static Table TABLE2;
+ public static Table TABLE_NESTED;
public static Table TABLE_WITHOUT_OWNER;
public static String TABLE_LINK;
@@ -74,6 +80,7 @@ public class SuggestionsResourceTest extends OpenMetadataApplicationTest {
public static String TABLE_WITHOUT_OWNER_LINK;
public static String TABLE_COLUMN1_LINK;
public static String TABLE_COLUMN2_LINK;
+ public static String TABLE_NESTED_LINK;
public static List COLUMNS;
public static User USER;
public static String USER_LINK;
@@ -119,6 +126,22 @@ public class SuggestionsResourceTest extends OpenMetadataApplicationTest {
TABLE_WITHOUT_OWNER =
TABLE_RESOURCE_TEST.createAndCheckEntity(createTable3, ADMIN_AUTH_HEADERS);
+ Column c2_c_d = getColumn("d", INT, USER_ADDRESS_TAG_LABEL);
+ Column c2_c =
+ getColumn("c", STRUCT, USER_ADDRESS_TAG_LABEL)
+ .withChildren(new ArrayList<>(singletonList(c2_c_d)));
+
+ CreateTable createTableNested =
+ TABLE_RESOURCE_TEST
+ .createRequest(test)
+ .withColumns(new ArrayList<>(singletonList(c2_c)))
+ .withName("table_with_nested_suggestion")
+ .withTableConstraints(null);
+
+ TABLE_NESTED = TABLE_RESOURCE_TEST.createAndCheckEntity(createTableNested, ADMIN_AUTH_HEADERS);
+ TABLE_NESTED_LINK =
+ String.format("<#E::table::%s::columns::c.d>", TABLE_NESTED.getFullyQualifiedName());
+
COLUMNS =
Collections.singletonList(
new Column().withName("column1").withDataType(ColumnDataType.BIGINT));
@@ -561,6 +584,22 @@ public class SuggestionsResourceTest extends OpenMetadataApplicationTest {
validateAppliedTags(expectedTags, table.getTags());
}
+ @Test
+ @Order(7)
+ void put_acceptSuggestionNested_200(TestInfo test) throws IOException {
+ CreateSuggestion create = create().withEntityLink(TABLE_NESTED_LINK);
+ Suggestion suggestion = createSuggestion(create, USER_AUTH_HEADERS);
+ Assertions.assertEquals(create.getEntityLink(), suggestion.getEntityLink());
+
+ // When accepting the suggestion, the nested column column1.column2 should have the Updated
+ // Description
+ acceptSuggestion(suggestion.getId(), USER_AUTH_HEADERS);
+ TableResourceTest tableResourceTest = new TableResourceTest();
+ Table table = tableResourceTest.getEntity(TABLE_NESTED.getId(), "columns", USER_AUTH_HEADERS);
+ Column nestedColumn = table.getColumns().get(0).getChildren().get(0);
+ assertEquals("Update description", nestedColumn.getDescription());
+ }
+
public Suggestion createSuggestion(CreateSuggestion create, Map authHeaders)
throws HttpResponseException {
return TestUtils.post(getResource("suggestions"), create, Suggestion.class, authHeaders);