Skip to content

Commit e4ffe5c

Browse files
committed
Fix: Address performance and backward compatibility issues in TestCase relationship cleanup
1 parent 21979d7 commit e4ffe5c

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
@@ -4453,7 +4453,7 @@ void test_testCaseDeleteCleanup(TestNamespace ns) {
44534453
List<CollectionDAO.EntityRelationshipRecord> relationships =
44544454
Entity.getCollectionDAO()
44554455
.relationshipDAO()
4456-
.findTo(testCase.getId(), Entity.TEST_CASE, Relationship.RELATED_TO.ordinal());
4456+
.findTo(testCase.getId(), Entity.TEST_CASE, Relationship.PARENT_OF.ordinal());
44574457

44584458
assertNotNull(relationships);
44594459
long statusCount =
@@ -4467,13 +4467,14 @@ void test_testCaseDeleteCleanup(TestNamespace ns) {
44674467
// 4. Hard delete the test case
44684468
java.util.Map<String, String> params = new java.util.HashMap<>();
44694469
params.put("hardDelete", "true");
4470+
params.put("recursive", "true");
44704471
client.testCases().delete(testCase.getId().toString(), params);
44714472

44724473
// 5. Verify relationships are cleaned up
44734474
List<CollectionDAO.EntityRelationshipRecord> relationshipsAfter =
44744475
Entity.getCollectionDAO()
44754476
.relationshipDAO()
4476-
.findTo(testCase.getId(), Entity.TEST_CASE, Relationship.RELATED_TO.ordinal());
4477+
.findTo(testCase.getId(), Entity.TEST_CASE, Relationship.PARENT_OF.ordinal());
44774478

44784479
long statusCountAfter =
44794480
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
@@ -773,11 +773,8 @@ public static void deleteEntity(
773773
String updatedBy, String entityType, UUID entityId, boolean recursive, boolean hardDelete) {
774774
if (entityType.equalsIgnoreCase(Entity.TEST_CASE_RESOLUTION_STATUS)
775775
|| entityType.equalsIgnoreCase(Entity.TEST_CASE_RESULT)) {
776-
// TimeSeries entities don't have a standard repository delete flow.
777-
// We only want to delete their relationships if they are orphaned.
778-
EntityTimeSeriesRepository<?> repository = getEntityTimeSeriesRepository(entityType);
779-
// We don't call repository.delete(entityId) here because we want to preserve history.
780-
// The relationships will be cleaned up by the caller's relationshipDAO().deleteAll().
776+
// TimeSeries entities are cleaned up via entitySpecificCleanup,
777+
// not through the standard repository delete flow.
781778
return;
782779
}
783780
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
@@ -2398,7 +2398,7 @@ default void deleteAll(UUID id, String entity) {
23982398

23992399
@SqlUpdate(
24002400
"DELETE FROM entity_relationship WHERE toEntity = :toEntity AND fromEntity = :fromEntity "
2401-
+ "AND fromId NOT IN (SELECT id FROM <table>)")
2401+
+ "AND NOT EXISTS (SELECT 1 FROM <table> t WHERE t.id = entity_relationship.fromId)")
24022402
int deleteOrphanedRelationships(
24032403
@Bind("fromEntity") String fromEntity,
24042404
@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
@@ -897,8 +897,7 @@ protected void entitySpecificCleanup(TestCase entityInterface) {
897897
TestCaseResolutionStatusRepository testCaseResolutionStatusRepository =
898898
(TestCaseResolutionStatusRepository)
899899
Entity.getEntityTimeSeriesRepository(Entity.TEST_CASE_RESOLUTION_STATUS);
900-
testCaseResolutionStatusRepository.deleteAllRelationshipsByTestCase(
901-
entityInterface.getFullyQualifiedName());
900+
testCaseResolutionStatusRepository.deleteAllRelationshipsByTestCase(entityInterface.getId());
902901
}
903902

904903
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
@@ -236,18 +236,14 @@ public void storeInternal(
236236
recordEntity.withTestCaseReference(testCaseReference);
237237
}
238238

239-
public void deleteAllRelationshipsByTestCase(String testCaseFQN) {
240-
List<String> jsons =
241-
((CollectionDAO.TestCaseResolutionStatusTimeSeriesDAO) timeSeriesDao)
242-
.listTestCaseResolutionForEntityFQNHash(testCaseFQN);
243-
if (jsons.isEmpty()) {
244-
return;
245-
}
246-
List<UUID> statusIds =
247-
jsons.stream()
248-
.map(json -> JsonUtils.readValue(json, TestCaseResolutionStatus.class).getId())
249-
.toList();
250-
daoCollection.relationshipDAO().batchDeleteRelationships(statusIds, entityType);
239+
public void deleteAllRelationshipsByTestCase(UUID testCaseId) {
240+
daoCollection
241+
.relationshipDAO()
242+
.deleteFrom(
243+
testCaseId,
244+
Entity.TEST_CASE,
245+
Relationship.PARENT_OF.ordinal(),
246+
Entity.TEST_CASE_RESOLUTION_STATUS);
251247
}
252248

253249
@Override
@@ -257,15 +253,15 @@ protected void storeRelationship(TestCaseResolutionStatus recordEntity) {
257253
recordEntity.getId(),
258254
Entity.TEST_CASE,
259255
Entity.TEST_CASE_RESOLUTION_STATUS,
260-
Relationship.RELATED_TO,
256+
Relationship.PARENT_OF,
261257
null,
262258
false);
263259
}
264260

265261
@Override
266262
protected void setInheritedFields(TestCaseResolutionStatus recordEntity) {
267263
recordEntity.setTestCaseReference(
268-
getFromEntityRef(recordEntity.getId(), Relationship.RELATED_TO, Entity.TEST_CASE, true));
264+
getFromEntityRef(recordEntity.getId(), Relationship.PARENT_OF, Entity.TEST_CASE, true));
269265
}
270266

271267
private void openOrAssignTask(TestCaseResolutionStatus incidentStatus) {

0 commit comments

Comments
 (0)