diff --git a/openmetadata-service/src/main/java/org/openmetadata/service/jdbi3/DomainRepository.java b/openmetadata-service/src/main/java/org/openmetadata/service/jdbi3/DomainRepository.java index ac0109ab9e3..3cfa33d70d9 100644 --- a/openmetadata-service/src/main/java/org/openmetadata/service/jdbi3/DomainRepository.java +++ b/openmetadata-service/src/main/java/org/openmetadata/service/jdbi3/DomainRepository.java @@ -16,10 +16,8 @@ package org.openmetadata.service.jdbi3; import static org.openmetadata.common.utils.CommonUtil.listOrEmpty; import static org.openmetadata.schema.type.Include.ALL; import static org.openmetadata.service.Entity.DOMAIN; -import static org.openmetadata.service.Entity.FIELD_EXPERTS; import static org.openmetadata.service.resources.EntityResource.searchClient; -import java.util.List; import lombok.extern.slf4j.Slf4j; import org.openmetadata.schema.entity.domains.Domain; import org.openmetadata.schema.type.EntityReference; @@ -59,7 +57,6 @@ public class DomainRepository extends EntityRepository { @Override public void storeEntity(Domain entity, boolean update) { EntityReference parent = entity.getParent(); - List children = entity.getChildren(); entity.withParent(null); store(entity, update); entity.withParent(parent); @@ -133,21 +130,7 @@ public class DomainRepository extends EntityRepository { @Override public void entitySpecificUpdate() { - updateExperts(); - } - - private void updateExperts() { - List origExperts = listOrEmpty(original.getExperts()); - List updatedExperts = listOrEmpty(updated.getExperts()); - updateToRelationships( - FIELD_EXPERTS, - DOMAIN, - original.getId(), - Relationship.EXPERT, - Entity.USER, - origExperts, - updatedExperts, - false); + recordChange("domainType", original.getDomainType(), updated.getDomainType()); } } } diff --git a/openmetadata-service/src/main/java/org/openmetadata/service/jdbi3/EntityRepository.java b/openmetadata-service/src/main/java/org/openmetadata/service/jdbi3/EntityRepository.java index c212698e130..b4d92ba419e 100644 --- a/openmetadata-service/src/main/java/org/openmetadata/service/jdbi3/EntityRepository.java +++ b/openmetadata-service/src/main/java/org/openmetadata/service/jdbi3/EntityRepository.java @@ -416,7 +416,7 @@ public abstract class EntityRepository { // Clone the entity from the cache and reset all the fields that are not already set // Cloning is necessary to ensure different threads making a call to this method don't // overwrite the fields of the entity being returned - T entityClone = JsonUtils.readValue(JsonUtils.pojoToJson(entity), entityClass); + T entityClone = JsonUtils.deepCopy(entity, entityClass); clearFieldsInternal(entityClone, fields); return withHref(uriInfo, entityClone); } @@ -461,7 +461,7 @@ public abstract class EntityRepository { // Clone the entity from the cache and reset all the fields that are not already set // Cloning is necessary to ensure different threads making a call to this method don't // overwrite the fields of the entity being returned - T entityClone = JsonUtils.readValue(JsonUtils.pojoToJson(entity), entityClass); + T entityClone = JsonUtils.deepCopy(entity, entityClass); clearFieldsInternal(entityClone, fields); return withHref(uriInfo, entityClone); } @@ -1931,7 +1931,7 @@ public abstract class EntityRepository { List updatedExperts = listOrEmpty(updated.getExperts()); updateToRelationships( FIELD_EXPERTS, - Entity.DATA_PRODUCT, + entityType, original.getId(), Relationship.EXPERT, Entity.USER, diff --git a/openmetadata-service/src/test/java/org/openmetadata/service/resources/EntityResourceTest.java b/openmetadata-service/src/test/java/org/openmetadata/service/resources/EntityResourceTest.java index 3ceba7a059a..2e20c3b28a3 100644 --- a/openmetadata-service/src/test/java/org/openmetadata/service/resources/EntityResourceTest.java +++ b/openmetadata-service/src/test/java/org/openmetadata/service/resources/EntityResourceTest.java @@ -133,6 +133,7 @@ import org.openmetadata.schema.CreateEntity; import org.openmetadata.schema.EntityInterface; import org.openmetadata.schema.api.data.RestoreEntity; import org.openmetadata.schema.api.data.TermReference; +import org.openmetadata.schema.api.domains.CreateDomain.DomainType; import org.openmetadata.schema.api.feed.CreateThread; import org.openmetadata.schema.api.teams.CreateTeam; import org.openmetadata.schema.api.teams.CreateTeam.TeamType; @@ -2427,6 +2428,8 @@ public abstract class EntityResourceTest assertNotNull(tagLabel.getDescription())); } else if (fieldName.startsWith("extension")) { // Custom properties related extension field changes assertEquals(expected.toString(), actual.toString()); + } else if (fieldName.equals("domainType")) { // Custom properties related extension field changes + assertEquals(expected, DomainType.fromValue(actual.toString())); } else { // All the other fields assertEquals(expected, actual, "Field name " + fieldName); diff --git a/openmetadata-service/src/test/java/org/openmetadata/service/resources/domains/DomainResourceTest.java b/openmetadata-service/src/test/java/org/openmetadata/service/resources/domains/DomainResourceTest.java index 88c9dc13d3f..1b0e81645ab 100644 --- a/openmetadata-service/src/test/java/org/openmetadata/service/resources/domains/DomainResourceTest.java +++ b/openmetadata-service/src/test/java/org/openmetadata/service/resources/domains/DomainResourceTest.java @@ -2,6 +2,9 @@ package org.openmetadata.service.resources.domains; import static org.junit.jupiter.api.Assertions.assertEquals; import static org.openmetadata.common.utils.CommonUtil.listOf; +import static org.openmetadata.service.util.EntityUtil.fieldAdded; +import static org.openmetadata.service.util.EntityUtil.fieldDeleted; +import static org.openmetadata.service.util.EntityUtil.fieldUpdated; import static org.openmetadata.service.util.TestUtils.ADMIN_AUTH_HEADERS; import static org.openmetadata.service.util.TestUtils.assertEntityReferenceNames; import static org.openmetadata.service.util.TestUtils.assertListNotNull; @@ -10,16 +13,20 @@ import static org.openmetadata.service.util.TestUtils.assertListNull; import java.io.IOException; import java.util.List; import java.util.Map; +import javax.ws.rs.core.Response.Status; import org.apache.http.client.HttpResponseException; +import org.junit.jupiter.api.Test; import org.junit.jupiter.api.TestInfo; import org.openmetadata.schema.api.domains.CreateDomain; import org.openmetadata.schema.api.domains.CreateDomain.DomainType; import org.openmetadata.schema.entity.domains.Domain; +import org.openmetadata.schema.type.ChangeDescription; import org.openmetadata.schema.type.EntityReference; import org.openmetadata.service.Entity; import org.openmetadata.service.resources.EntityResourceTest; import org.openmetadata.service.resources.domains.DomainResource.DomainList; import org.openmetadata.service.util.JsonUtils; +import org.openmetadata.service.util.TestUtils.UpdateType; public class DomainResourceTest extends EntityResourceTest { public DomainResourceTest() { @@ -32,6 +39,57 @@ public class DomainResourceTest extends EntityResourceTest createEntity(createRequest("sub-domain").withParent(DOMAIN.getFullyQualifiedName()), ADMIN_AUTH_HEADERS); } + @Test + void testDomainExpertsUpdate(TestInfo test) throws IOException { + CreateDomain create = createRequest(getEntityName(test)).withExperts(listOf(USER1.getFullyQualifiedName())); + Domain domain = createAndCheckEntity(create, ADMIN_AUTH_HEADERS); + + // Add User2 as expert using PUT + create.withExperts(List.of(USER1.getFullyQualifiedName(), USER2.getFullyQualifiedName())); + ChangeDescription change = getChangeDescription(domain.getVersion()); + fieldAdded(change, "experts", listOf(USER2.getEntityReference())); + domain = updateAndCheckEntity(create, Status.OK, ADMIN_AUTH_HEADERS, UpdateType.MINOR_UPDATE, change); + + // Remove User2 as expert using PUT + create.withExperts(List.of(USER1.getFullyQualifiedName())); + change = getChangeDescription(domain.getVersion()); + fieldDeleted(change, "experts", listOf(USER2.getEntityReference())); + domain = updateAndCheckEntity(create, Status.OK, ADMIN_AUTH_HEADERS, UpdateType.MINOR_UPDATE, change); + + // Add User2 as expert using PATCH + String json = JsonUtils.pojoToJson(domain); + domain.withExperts(List.of(USER1.getEntityReference(), USER2.getEntityReference())); + change = getChangeDescription(domain.getVersion()); + fieldAdded(change, "experts", listOf(USER2.getEntityReference())); + domain = patchEntityAndCheck(domain, json, ADMIN_AUTH_HEADERS, UpdateType.MINOR_UPDATE, change); + + // Remove User2 as expert using PATCH + json = JsonUtils.pojoToJson(domain); + domain.withExperts(List.of(USER1.getEntityReference())); + change = getChangeDescription(domain.getVersion()); + fieldDeleted(change, "experts", listOf(USER2.getEntityReference())); + patchEntityAndCheck(domain, json, ADMIN_AUTH_HEADERS, UpdateType.MINOR_UPDATE, change); + } + + @Test + void testDomainTypeUpdate(TestInfo test) throws IOException { + CreateDomain create = createRequest(getEntityName(test)).withExperts(listOf(USER1.getFullyQualifiedName())); + Domain domain = createAndCheckEntity(create, ADMIN_AUTH_HEADERS); + + // Change domain type from AGGREGATE to SOURCE_ALIGNED using PUT + create.withDomainType(DomainType.SOURCE_ALIGNED); + ChangeDescription change = getChangeDescription(domain.getVersion()); + fieldUpdated(change, "domainType", DomainType.AGGREGATE, DomainType.SOURCE_ALIGNED); + domain = updateAndCheckEntity(create, Status.OK, ADMIN_AUTH_HEADERS, UpdateType.MINOR_UPDATE, change); + + // Change domain type from SOURCE_ALIGNED to CONSUMER_ALIGNED using PATCH + String json = JsonUtils.pojoToJson(domain); + domain.withDomainType(DomainType.CONSUMER_ALIGNED); + change = getChangeDescription(domain.getVersion()); + fieldUpdated(change, "domainType", DomainType.SOURCE_ALIGNED, DomainType.CONSUMER_ALIGNED); + patchEntityAndCheck(domain, json, ADMIN_AUTH_HEADERS, UpdateType.MINOR_UPDATE, change); + } + @Override public CreateDomain createRequest(String name) { return new CreateDomain()