From 97bce917be9ca8171bae6944d9c08105cb4c9107 Mon Sep 17 00:00:00 2001 From: Mohit Yadav <105265192+mohityadav766@users.noreply.github.com> Date: Fri, 7 Mar 2025 12:41:52 +0530 Subject: [PATCH] Fix Deletion of Entities (#20129) --- .../service/jdbi3/AppRepository.java | 3 +- .../service/jdbi3/EntityRepository.java | 64 +++++++++++-------- .../service/jdbi3/FeedRepository.java | 1 - .../service/jdbi3/PipelineRepository.java | 3 +- .../jdbi3/StoredProcedureRepository.java | 3 +- .../service/jdbi3/TeamRepository.java | 3 +- .../service/jdbi3/TestCaseRepository.java | 4 +- 7 files changed, 44 insertions(+), 37 deletions(-) diff --git a/openmetadata-service/src/main/java/org/openmetadata/service/jdbi3/AppRepository.java b/openmetadata-service/src/main/java/org/openmetadata/service/jdbi3/AppRepository.java index af64eaa4e84..18d8027aba2 100644 --- a/openmetadata-service/src/main/java/org/openmetadata/service/jdbi3/AppRepository.java +++ b/openmetadata-service/src/main/java/org/openmetadata/service/jdbi3/AppRepository.java @@ -369,13 +369,12 @@ public class AppRepository extends EntityRepository { } @Override - protected void cleanup(App app) { + protected void entitySpecificCleanup(App app) { // Remove the Pipelines for Application List pipelineRef = getIngestionPipelines(app); pipelineRef.forEach( reference -> Entity.deleteEntity("admin", reference.getType(), reference.getId(), true, true)); - super.cleanup(app); } @Override 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 f6171b08f02..f9fa6ec40cc 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 @@ -1474,42 +1474,56 @@ public abstract class EntityRepository { } } - @Transaction - protected void cleanup(T entityInterface) { - UUID id = entityInterface.getId(); + protected final void cleanup(T entityInterface) { + Entity.getJdbi() + .inTransaction( + handle -> { + // Perform Entity Specific Cleanup + entitySpecificCleanup(entityInterface); - // Delete all the relationships to other entities - daoCollection.relationshipDAO().deleteAll(id, entityType); + UUID id = entityInterface.getId(); - // Delete all the field relationships to other entities - daoCollection.fieldRelationshipDAO().deleteAllByPrefix(entityInterface.getFullyQualifiedName()); + // Delete all the relationships to other entities + daoCollection.relationshipDAO().deleteAll(id, entityType); - // Delete all the extensions of entity - daoCollection.entityExtensionDAO().deleteAll(id); + // Delete all the field relationships to other entities + daoCollection + .fieldRelationshipDAO() + .deleteAllByPrefix(entityInterface.getFullyQualifiedName()); - // Delete all the tag labels - daoCollection - .tagUsageDAO() - .deleteTagLabelsByTargetPrefix(entityInterface.getFullyQualifiedName()); + // Delete all the extensions of entity + daoCollection.entityExtensionDAO().deleteAll(id); - // when the glossary and tag is deleted, delete its usage - daoCollection.tagUsageDAO().deleteTagLabelsByFqn(entityInterface.getFullyQualifiedName()); - // Delete all the usage data - daoCollection.usageDAO().delete(id); + // Delete all the tag labels + daoCollection + .tagUsageDAO() + .deleteTagLabelsByTargetPrefix(entityInterface.getFullyQualifiedName()); - // Delete the extension data storing custom properties - removeExtension(entityInterface); + // when the glossary and tag is deleted, delete its usage + daoCollection + .tagUsageDAO() + .deleteTagLabelsByFqn(entityInterface.getFullyQualifiedName()); + // Delete all the usage data + daoCollection.usageDAO().delete(id); - // Delete all the threads that are about this entity - Entity.getFeedRepository().deleteByAbout(entityInterface.getId()); + // Delete the extension data storing custom properties + removeExtension(entityInterface); - // Remove entity from the cache - invalidate(entityInterface); + // Delete all the threads that are about this entity + Entity.getFeedRepository().deleteByAbout(entityInterface.getId()); - // Finally, delete the entity - dao.delete(id); + // Remove entity from the cache + invalidate(entityInterface); + + // Finally, delete the entity + dao.delete(id); + + return null; + }); } + protected void entitySpecificCleanup(T entityInterface) {} + private void invalidate(T entity) { CACHE_WITH_ID.invalidate(new ImmutablePair<>(entityType, entity.getId())); CACHE_WITH_NAME.invalidate(new ImmutablePair<>(entityType, entity.getFullyQualifiedName())); diff --git a/openmetadata-service/src/main/java/org/openmetadata/service/jdbi3/FeedRepository.java b/openmetadata-service/src/main/java/org/openmetadata/service/jdbi3/FeedRepository.java index c0b7bb64805..d750b7b3323 100644 --- a/openmetadata-service/src/main/java/org/openmetadata/service/jdbi3/FeedRepository.java +++ b/openmetadata-service/src/main/java/org/openmetadata/service/jdbi3/FeedRepository.java @@ -552,7 +552,6 @@ public class FeedRepository { dao.feedDAO().delete(id); } - @Transaction public void deleteByAbout(UUID entityId) { List threadIds = listOrEmpty(dao.feedDAO().findByEntityId(entityId.toString())); for (String threadId : threadIds) { diff --git a/openmetadata-service/src/main/java/org/openmetadata/service/jdbi3/PipelineRepository.java b/openmetadata-service/src/main/java/org/openmetadata/service/jdbi3/PipelineRepository.java index c54b09c0aee..6d362c8fb8c 100644 --- a/openmetadata-service/src/main/java/org/openmetadata/service/jdbi3/PipelineRepository.java +++ b/openmetadata-service/src/main/java/org/openmetadata/service/jdbi3/PipelineRepository.java @@ -305,7 +305,7 @@ public class PipelineRepository extends EntityRepository { } @Override - protected void cleanup(Pipeline pipeline) { + protected void entitySpecificCleanup(Pipeline pipeline) { // When a pipeline is removed , the linege needs to be removed daoCollection .relationshipDAO() @@ -313,7 +313,6 @@ public class PipelineRepository extends EntityRepository { pipeline.getId(), LineageDetails.Source.PIPELINE_LINEAGE.value(), Relationship.UPSTREAM.ordinal()); - super.cleanup(pipeline); } @Override diff --git a/openmetadata-service/src/main/java/org/openmetadata/service/jdbi3/StoredProcedureRepository.java b/openmetadata-service/src/main/java/org/openmetadata/service/jdbi3/StoredProcedureRepository.java index 92922f2a164..f4ebe52cb0e 100644 --- a/openmetadata-service/src/main/java/org/openmetadata/service/jdbi3/StoredProcedureRepository.java +++ b/openmetadata-service/src/main/java/org/openmetadata/service/jdbi3/StoredProcedureRepository.java @@ -72,7 +72,7 @@ public class StoredProcedureRepository extends EntityRepository } @Override - protected void cleanup(StoredProcedure storedProcedure) { + protected void entitySpecificCleanup(StoredProcedure storedProcedure) { // When a pipeline is removed , the linege needs to be removed daoCollection .relationshipDAO() @@ -80,7 +80,6 @@ public class StoredProcedureRepository extends EntityRepository storedProcedure.getId(), LineageDetails.Source.QUERY_LINEAGE.value(), Relationship.UPSTREAM.ordinal()); - super.cleanup(storedProcedure); } @Override diff --git a/openmetadata-service/src/main/java/org/openmetadata/service/jdbi3/TeamRepository.java b/openmetadata-service/src/main/java/org/openmetadata/service/jdbi3/TeamRepository.java index 250edb07c50..768bf70cbd0 100644 --- a/openmetadata-service/src/main/java/org/openmetadata/service/jdbi3/TeamRepository.java +++ b/openmetadata-service/src/main/java/org/openmetadata/service/jdbi3/TeamRepository.java @@ -295,7 +295,7 @@ public class TeamRepository extends EntityRepository { } @Override - protected void cleanup(Team team) { + protected void entitySpecificCleanup(Team team) { // When a team is deleted, if the children team don't have another parent, set Organization as // the parent for (EntityReference child : listOrEmpty(team.getChildren())) { @@ -308,7 +308,6 @@ public class TeamRepository extends EntityRepository { LOG.info("Moving parent of team " + childTeam.getId() + " to organization"); } } - super.cleanup(team); } @Override diff --git a/openmetadata-service/src/main/java/org/openmetadata/service/jdbi3/TestCaseRepository.java b/openmetadata-service/src/main/java/org/openmetadata/service/jdbi3/TestCaseRepository.java index b20f379febe..39ae4b16b70 100644 --- a/openmetadata-service/src/main/java/org/openmetadata/service/jdbi3/TestCaseRepository.java +++ b/openmetadata-service/src/main/java/org/openmetadata/service/jdbi3/TestCaseRepository.java @@ -368,10 +368,8 @@ public class TestCaseRepository extends EntityRepository { } } - @Transaction @Override - protected void cleanup(TestCase entityInterface) { - super.cleanup(entityInterface); + protected void entitySpecificCleanup(TestCase entityInterface) { deleteAllTestCaseResults(entityInterface.getFullyQualifiedName()); }