diff --git a/openmetadata-service/src/main/java/org/openmetadata/service/util/EntityUtil.java b/openmetadata-service/src/main/java/org/openmetadata/service/util/EntityUtil.java index fe6678d77369..5d07469257ce 100644 --- a/openmetadata-service/src/main/java/org/openmetadata/service/util/EntityUtil.java +++ b/openmetadata-service/src/main/java/org/openmetadata/service/util/EntityUtil.java @@ -695,21 +695,30 @@ public static String getColumnField(Column column, String columnField) { : FullyQualifiedName.build("columns", localColumnName, columnField); } - /** Return schema field name of format "schemaFields".fieldName.fieldName */ + /** Return schema field name of format "messageSchema"."schemaFields".fieldName.fieldName */ public static String getSchemaField(Topic topic, Field field, String fieldName) { // Remove topic FQN from schemaField FQN to get the local name String localFieldName = EntityUtil.getLocalColumnName(topic.getFullyQualifiedName(), field.getFullyQualifiedName()); return fieldName == null - ? FullyQualifiedName.build("schemaFields", localFieldName) - : FullyQualifiedName.build("schemaFields", localFieldName, fieldName); + ? FullyQualifiedName.build("messageSchema", "schemaFields", localFieldName) + : FullyQualifiedName.build("messageSchema", "schemaFields", localFieldName, fieldName); } public static String getSchemaField(APIEndpoint apiEndpoint, Field field, String fieldName) { // Remove APIEndpoint FQN from schemaField FQN to get the local name + // localFieldName contains the schema prefix, e.g. "requestSchema.body" or "responseSchema.body" String localFieldName = EntityUtil.getLocalColumnName( apiEndpoint.getFullyQualifiedName(), field.getFullyQualifiedName()); + int dotIndex = localFieldName.indexOf(Entity.SEPARATOR); + if (dotIndex > 0) { + String schemaPrefix = localFieldName.substring(0, dotIndex); + String fieldLocalName = localFieldName.substring(dotIndex + 1); + return fieldName == null + ? FullyQualifiedName.build(schemaPrefix, "schemaFields", fieldLocalName) + : FullyQualifiedName.build(schemaPrefix, "schemaFields", fieldLocalName, fieldName); + } return fieldName == null ? FullyQualifiedName.build("schemaFields", localFieldName) : FullyQualifiedName.build("schemaFields", localFieldName, fieldName); diff --git a/openmetadata-service/src/test/java/org/openmetadata/service/util/EntityUtilTest.java b/openmetadata-service/src/test/java/org/openmetadata/service/util/EntityUtilTest.java index f8268d9793bf..be3c046d554a 100644 --- a/openmetadata-service/src/test/java/org/openmetadata/service/util/EntityUtilTest.java +++ b/openmetadata-service/src/test/java/org/openmetadata/service/util/EntityUtilTest.java @@ -304,10 +304,10 @@ void testVersionAndFieldNameHelpers() { assertEquals("owners.tags", EntityUtil.getFieldName("owners", "tags")); assertEquals("columns.amount.description", EntityUtil.getColumnField(column, "description")); assertEquals( - "schemaFields.\"user.id\".description", + "messageSchema.schemaFields.\"user.id\".description", EntityUtil.getSchemaField(topic, schemaField, "description")); assertEquals( - "schemaFields.\"request.body\".description", + "request.schemaFields.body.description", EntityUtil.getSchemaField(apiEndpoint, apiField, "description")); assertEquals( "fields.\"keyword.raw\".alias", @@ -808,9 +808,11 @@ void testFieldBuilderAndDomainQueryHelpers() { SecurityContext securityContext = mock(SecurityContext.class); assertEquals("columns.amount", EntityUtil.getColumnField(column, null)); - assertEquals("schemaFields.\"user.id\"", EntityUtil.getSchemaField(topic, schemaField, null)); assertEquals( - "schemaFields.\"request.body\"", EntityUtil.getSchemaField(apiEndpoint, apiField, null)); + "messageSchema.schemaFields.\"user.id\"", + EntityUtil.getSchemaField(topic, schemaField, null)); + assertEquals( + "request.schemaFields.body", EntityUtil.getSchemaField(apiEndpoint, apiField, null)); assertEquals( "fields.\"keyword.raw\"", EntityUtil.getSearchIndexField(searchIndex, searchField, null)); assertEquals("rules.maskPII", EntityUtil.getRuleField(rule, null));