diff --git a/catalog-rest-service/src/main/java/org/openmetadata/catalog/jdbi3/CollectionDAO.java b/catalog-rest-service/src/main/java/org/openmetadata/catalog/jdbi3/CollectionDAO.java index f1aaa532265..06e7a75c393 100644 --- a/catalog-rest-service/src/main/java/org/openmetadata/catalog/jdbi3/CollectionDAO.java +++ b/catalog-rest-service/src/main/java/org/openmetadata/catalog/jdbi3/CollectionDAO.java @@ -1297,6 +1297,9 @@ public interface CollectionDAO { @SqlUpdate("DELETE FROM tag_usage where tagFQN LIKE CONCAT(:tagFQN, '.%') AND source = :source") void deleteTagLabelsByPrefix(@Bind("source") int source, @Bind("tagFQN") String tagFQN); + @SqlUpdate("DELETE FROM tag_usage where targetFQN LIKE CONCAT(:targetFQN, '%')") + void deleteTagLabelsByTargetPrefix(@Bind("targetFQN") String targetFQN); + class TagLabelMapper implements RowMapper { @Override public TagLabel map(ResultSet r, StatementContext ctx) throws SQLException { diff --git a/catalog-rest-service/src/main/java/org/openmetadata/catalog/jdbi3/EntityRepository.java b/catalog-rest-service/src/main/java/org/openmetadata/catalog/jdbi3/EntityRepository.java index bb75f53c3de..76db3604602 100644 --- a/catalog-rest-service/src/main/java/org/openmetadata/catalog/jdbi3/EntityRepository.java +++ b/catalog-rest-service/src/main/java/org/openmetadata/catalog/jdbi3/EntityRepository.java @@ -492,20 +492,7 @@ public abstract class EntityRepository { T original = JsonUtils.readValue(json, entityClass); setFields(original, putFields); // TODO why this? - // If an entity being deleted contains other **non-deleted** children entities, it can't be deleted - List contains = - daoCollection.relationshipDAO().findTo(id, entityType, Relationship.CONTAINS.ordinal()); - - if (!contains.isEmpty()) { - if (!recursive) { - throw new IllegalArgumentException(CatalogExceptionMessage.entityIsNotEmpty(entityType)); - } - // Soft delete all the contained entities - for (EntityReference entityReference : contains) { - LOG.info("Recursively deleting {} {}", entityReference.getType(), entityReference.getId()); - Entity.deleteEntity(updatedBy, entityReference.getType(), entityReference.getId(), true, hardDelete, true); - } - } + deleteChildren(id, recursive, hardDelete, updatedBy); String changeType; T updated = JsonUtils.readValue(json, entityClass); @@ -517,16 +504,53 @@ public abstract class EntityRepository { updater.update(); changeType = RestUtil.ENTITY_SOFT_DELETED; } else { - // Hard delete - daoCollection.relationshipDAO().deleteAll(id, entityType); - daoCollection.fieldRelationshipDAO().deleteAllByPrefix(entityInterface.getFullyQualifiedName()); - daoCollection.entityExtensionDAO().deleteAll(id); - dao.delete(id); + cleanup(entityInterface); changeType = RestUtil.ENTITY_DELETED; } return new DeleteResponse<>(updated, changeType); } + private void deleteChildren(String id, boolean recursive, boolean hardDelete, String updatedBy) throws IOException { + // If an entity being deleted contains other **non-deleted** children entities, it can't be deleted + List contains = + daoCollection.relationshipDAO().findTo(id, entityType, Relationship.CONTAINS.ordinal()); + + if (contains.isEmpty()) { + return; + } + // Entity being deleted contains children entities + if (!recursive) { + throw new IllegalArgumentException(CatalogExceptionMessage.entityIsNotEmpty(entityType)); + } + // Delete all the contained entities + for (EntityReference entityReference : contains) { + LOG.info("Recursively deleting {} {}", entityReference.getType(), entityReference.getId()); + Entity.deleteEntity(updatedBy, entityReference.getType(), entityReference.getId(), true, hardDelete, true); + } + } + + protected void cleanup(EntityInterface entityInterface) { + String id = entityInterface.getId().toString(); + + // Delete all the relationships to other entities + daoCollection.relationshipDAO().deleteAll(id, entityType); + + // Delete all the field relationships to other entities + daoCollection.fieldRelationshipDAO().deleteAllByPrefix(entityInterface.getFullyQualifiedName()); + + // Delete all the extensions of entity + daoCollection.entityExtensionDAO().deleteAll(id); + + // Delete all the tag labels + daoCollection.tagUsageDAO().deleteTagLabelsByTargetPrefix(entityInterface.getFullyQualifiedName()); + + // Delete all the usage data + daoCollection.usageDAO().delete(id); + + // Finally, delete the entity + dao.delete(id); + } + @Transaction public PutResponse deleteFollower(String updatedBy, UUID entityId, UUID userId) throws IOException { T entity = dao.findEntityById(entityId);