Skip to content

Commit 7cd450f

Browse files
committed
Fix: Address performance and backward compatibility issues in TestCase relationship cleanup
1 parent 0399dd9 commit 7cd450f

5 files changed

Lines changed: 17 additions & 24 deletions

File tree

openmetadata-integration-tests/src/test/java/org/openmetadata/it/tests/TestCaseResourceIT.java

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4503,7 +4503,7 @@ void test_testCaseDeleteCleanup(TestNamespace ns) {
45034503
List<CollectionDAO.EntityRelationshipRecord> relationships =
45044504
Entity.getCollectionDAO()
45054505
.relationshipDAO()
4506-
.findTo(testCase.getId(), Entity.TEST_CASE, Relationship.RELATED_TO.ordinal());
4506+
.findTo(testCase.getId(), Entity.TEST_CASE, Relationship.PARENT_OF.ordinal());
45074507

45084508
assertNotNull(relationships);
45094509
long statusCount =
@@ -4517,13 +4517,14 @@ void test_testCaseDeleteCleanup(TestNamespace ns) {
45174517
// 4. Hard delete the test case
45184518
java.util.Map<String, String> params = new java.util.HashMap<>();
45194519
params.put("hardDelete", "true");
4520+
params.put("recursive", "true");
45204521
client.testCases().delete(testCase.getId().toString(), params);
45214522

45224523
// 5. Verify relationships are cleaned up
45234524
List<CollectionDAO.EntityRelationshipRecord> relationshipsAfter =
45244525
Entity.getCollectionDAO()
45254526
.relationshipDAO()
4526-
.findTo(testCase.getId(), Entity.TEST_CASE, Relationship.RELATED_TO.ordinal());
4527+
.findTo(testCase.getId(), Entity.TEST_CASE, Relationship.PARENT_OF.ordinal());
45274528

45284529
long statusCountAfter =
45294530
relationshipsAfter.stream()

openmetadata-service/src/main/java/org/openmetadata/service/Entity.java

Lines changed: 2 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -744,11 +744,8 @@ public static void deleteEntity(
744744
String updatedBy, String entityType, UUID entityId, boolean recursive, boolean hardDelete) {
745745
if (entityType.equalsIgnoreCase(Entity.TEST_CASE_RESOLUTION_STATUS)
746746
|| entityType.equalsIgnoreCase(Entity.TEST_CASE_RESULT)) {
747-
// TimeSeries entities don't have a standard repository delete flow.
748-
// We only want to delete their relationships if they are orphaned.
749-
EntityTimeSeriesRepository<?> repository = getEntityTimeSeriesRepository(entityType);
750-
// We don't call repository.delete(entityId) here because we want to preserve history.
751-
// The relationships will be cleaned up by the caller's relationshipDAO().deleteAll().
747+
// TimeSeries entities are cleaned up via entitySpecificCleanup,
748+
// not through the standard repository delete flow.
752749
return;
753750
}
754751
EntityRepository<?> dao = getEntityRepository(entityType);

openmetadata-service/src/main/java/org/openmetadata/service/jdbi3/CollectionDAO.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2649,7 +2649,7 @@ default void deleteAll(UUID id, String entity) {
26492649

26502650
@SqlUpdate(
26512651
"DELETE FROM entity_relationship WHERE toEntity = :toEntity AND fromEntity = :fromEntity "
2652-
+ "AND fromId NOT IN (SELECT id FROM <table>)")
2652+
+ "AND NOT EXISTS (SELECT 1 FROM <table> t WHERE t.id = entity_relationship.fromId)")
26532653
int deleteOrphanedRelationships(
26542654
@Bind("fromEntity") String fromEntity,
26552655
@Bind("toEntity") String toEntity,

openmetadata-service/src/main/java/org/openmetadata/service/jdbi3/TestCaseRepository.java

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -893,8 +893,7 @@ protected void entitySpecificCleanup(TestCase entityInterface) {
893893
TestCaseResolutionStatusRepository testCaseResolutionStatusRepository =
894894
(TestCaseResolutionStatusRepository)
895895
Entity.getEntityTimeSeriesRepository(Entity.TEST_CASE_RESOLUTION_STATUS);
896-
testCaseResolutionStatusRepository.deleteAllRelationshipsByTestCase(
897-
entityInterface.getFullyQualifiedName());
896+
testCaseResolutionStatusRepository.deleteAllRelationshipsByTestCase(entityInterface.getId());
898897
}
899898

900899
private void deleteAllTestCaseResults(String fqn) {

openmetadata-service/src/main/java/org/openmetadata/service/jdbi3/TestCaseResolutionStatusRepository.java

Lines changed: 10 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -228,18 +228,14 @@ public void storeInternal(
228228
recordEntity.withTestCaseReference(testCaseReference);
229229
}
230230

231-
public void deleteAllRelationshipsByTestCase(String testCaseFQN) {
232-
List<String> jsons =
233-
((CollectionDAO.TestCaseResolutionStatusTimeSeriesDAO) timeSeriesDao)
234-
.listTestCaseResolutionForEntityFQNHash(testCaseFQN);
235-
if (jsons.isEmpty()) {
236-
return;
237-
}
238-
List<UUID> statusIds =
239-
jsons.stream()
240-
.map(json -> JsonUtils.readValue(json, TestCaseResolutionStatus.class).getId())
241-
.toList();
242-
daoCollection.relationshipDAO().batchDeleteRelationships(statusIds, entityType);
231+
public void deleteAllRelationshipsByTestCase(UUID testCaseId) {
232+
daoCollection
233+
.relationshipDAO()
234+
.deleteFrom(
235+
testCaseId,
236+
Entity.TEST_CASE,
237+
Relationship.PARENT_OF.ordinal(),
238+
Entity.TEST_CASE_RESOLUTION_STATUS);
243239
}
244240

245241
@Override
@@ -249,15 +245,15 @@ protected void storeRelationship(TestCaseResolutionStatus recordEntity) {
249245
recordEntity.getId(),
250246
Entity.TEST_CASE,
251247
Entity.TEST_CASE_RESOLUTION_STATUS,
252-
Relationship.RELATED_TO,
248+
Relationship.PARENT_OF,
253249
null,
254250
false);
255251
}
256252

257253
@Override
258254
protected void setInheritedFields(TestCaseResolutionStatus recordEntity) {
259255
recordEntity.setTestCaseReference(
260-
getFromEntityRef(recordEntity.getId(), Relationship.RELATED_TO, Entity.TEST_CASE, true));
256+
getFromEntityRef(recordEntity.getId(), Relationship.PARENT_OF, Entity.TEST_CASE, true));
261257
}
262258

263259
@Override

0 commit comments

Comments
 (0)