From fb7bca84bd13070f944c061c6649a2eba0e80c4b Mon Sep 17 00:00:00 2001
From: Erwan Rouchet <rouchet@teklia.com>
Date: Mon, 26 Feb 2024 14:11:43 +0100
Subject: [PATCH] Delete worker activities when using DestroyWorkerResults with
 a model version filter

---
 arkindex/documents/tasks.py                   |  5 ++--
 .../worker_results_delete_all_versions.sql    |  6 ++---
 ...er_results_delete_configuration_filter.sql |  1 -
 ...ults_delete_model_version_under_parent.sql | 23 ++++++++++++++++++-
 ...ker_results_delete_unset_configuration.sql |  6 ++---
 5 files changed, 28 insertions(+), 13 deletions(-)

diff --git a/arkindex/documents/tasks.py b/arkindex/documents/tasks.py
index 7e0421e4e4..acd269aede 100644
--- a/arkindex/documents/tasks.py
+++ b/arkindex/documents/tasks.py
@@ -185,6 +185,7 @@ def worker_results_delete(
     # a worker version but without a worker run.)
     # We use worker_version_id != None and not worker_version_id__isnull=False,
     # because isnull would cause an unnecessary LEFT JOIN query.
+    # No extra filtering is needed on worker activities, since worker versions cannot be null there.
     else:
         elements = elements.exclude(worker_version_id=None)
         classifications = classifications.exclude(worker_version_id=None)
@@ -192,7 +193,6 @@ def worker_results_delete(
         transcription_entities = transcription_entities.exclude(transcription__worker_version_id=None)
         worker_transcription_entities = worker_transcription_entities.exclude(worker_version_id=None)
         metadata = metadata.exclude(worker_version_id=None)
-        worker_activities = worker_activities.exclude(worker_version_id=None)
 
     if element_id:
         # include_children causes a deletion *only* on the element's descendants.
@@ -227,8 +227,7 @@ def worker_results_delete(
         transcription_entities = transcription_entities.filter(transcription__worker_run__model_version_id=model_version_id)
         worker_transcription_entities = worker_transcription_entities.filter(worker_run__model_version_id=model_version_id)
         metadata = metadata.filter(worker_run__model_version_id=model_version_id)
-        # Activities are not linked to a worker run and cannot be filtered by model version
-        worker_activities = worker_activities.none()
+        worker_activities = worker_activities.filter(model_version_id=model_version_id)
 
     if not worker_run_id and configuration_id is not None:
         if configuration_id is False:
diff --git a/arkindex/sql_validation/worker_results_delete_all_versions.sql b/arkindex/sql_validation/worker_results_delete_all_versions.sql
index fdc4a049dd..b0fe051fd7 100644
--- a/arkindex/sql_validation/worker_results_delete_all_versions.sql
+++ b/arkindex/sql_validation/worker_results_delete_all_versions.sql
@@ -270,9 +270,7 @@ WHERE "documents_metadata"."id" IN
 
 DELETE
 FROM "process_workeractivity"
-WHERE "process_workeractivity"."id" IN
-        (SELECT U0."id"
+WHERE "process_workeractivity"."id" IN (SELECT U0."id"
          FROM "process_workeractivity" U0
          INNER JOIN "documents_element" U1 ON (U0."element_id" = U1."id")
-         WHERE (U1."corpus_id" = '{corpus_id}'::uuid
-                AND NOT (U0."worker_version_id" IS NULL)))
+         WHERE U1."corpus_id" = '{corpus_id}'::uuid)
diff --git a/arkindex/sql_validation/worker_results_delete_configuration_filter.sql b/arkindex/sql_validation/worker_results_delete_configuration_filter.sql
index df6e8fd9da..f1e2ed0627 100644
--- a/arkindex/sql_validation/worker_results_delete_configuration_filter.sql
+++ b/arkindex/sql_validation/worker_results_delete_configuration_filter.sql
@@ -182,5 +182,4 @@ WHERE "process_workeractivity"."id" IN
          FROM "process_workeractivity" U0
          INNER JOIN "documents_element" U1 ON (U0."element_id" = U1."id")
          WHERE (U1."corpus_id" = '{corpus_id}'::uuid
-                AND NOT (U0."worker_version_id" IS NULL)
                 AND U0."configuration_id" = '{configuration_id}'::uuid))
diff --git a/arkindex/sql_validation/worker_results_delete_model_version_under_parent.sql b/arkindex/sql_validation/worker_results_delete_model_version_under_parent.sql
index 434cb3402d..cbee78f2f6 100644
--- a/arkindex/sql_validation/worker_results_delete_model_version_under_parent.sql
+++ b/arkindex/sql_validation/worker_results_delete_model_version_under_parent.sql
@@ -207,6 +207,17 @@ WHERE "documents_metadata"."id" IN
                 AND U4."path" && (ARRAY['{element_id}'::uuid])::uuid[]
                 AND U5."model_version_id" = '{model_version_id}'::uuid));
 
+DELETE
+FROM "process_workeractivity"
+WHERE "process_workeractivity"."id" IN
+        (SELECT U0."id"
+         FROM "process_workeractivity" U0
+         INNER JOIN "documents_element" U1 ON (U0."element_id" = U1."id")
+         INNER JOIN "documents_elementpath" U3 ON (U1."id" = U3."element_id")
+         WHERE (U1."corpus_id" = '{corpus_id}'::uuid
+                AND U3."path" && (ARRAY['{element_id}'::uuid])::uuid[]
+                AND U0."model_version_id" = '{model_version_id}'::uuid));
+
 select min(length),
        max(length)
 FROM
@@ -398,4 +409,14 @@ WHERE "documents_metadata"."id" IN
          WHERE (U1."corpus_id" = '{corpus_id}'::uuid
                 AND NOT (U0."worker_version_id" IS NULL)
                 AND U0."element_id" = '{element_id}'::uuid
-                AND U4."model_version_id" = '{model_version_id}'::uuid))
+                AND U4."model_version_id" = '{model_version_id}'::uuid));
+
+DELETE
+FROM "process_workeractivity"
+WHERE "process_workeractivity"."id" IN
+        (SELECT U0."id"
+         FROM "process_workeractivity" U0
+         INNER JOIN "documents_element" U1 ON (U0."element_id" = U1."id")
+         WHERE (U1."corpus_id" = '{corpus_id}'::uuid
+                AND U0."element_id" = '{element_id}'::uuid
+                AND U0."model_version_id" = '{model_version_id}'::uuid))
diff --git a/arkindex/sql_validation/worker_results_delete_unset_configuration.sql b/arkindex/sql_validation/worker_results_delete_unset_configuration.sql
index 57b1e6c358..0ec40721d8 100644
--- a/arkindex/sql_validation/worker_results_delete_unset_configuration.sql
+++ b/arkindex/sql_validation/worker_results_delete_unset_configuration.sql
@@ -213,10 +213,9 @@ WHERE "process_workeractivity"."id" IN
         (SELECT U0."id"
          FROM "process_workeractivity" U0
          INNER JOIN "documents_element" U1 ON (U0."element_id" = U1."id")
-         INNER JOIN "documents_elementpath" U4 ON (U1."id" = U4."element_id")
+         INNER JOIN "documents_elementpath" U3 ON (U1."id" = U3."element_id")
          WHERE (U1."corpus_id" = '{corpus_id}'::uuid
-                AND NOT (U0."worker_version_id" IS NULL)
-                AND U4."path" && (ARRAY['{element_id}'::uuid])::uuid[]
+                AND U3."path" && (ARRAY['{element_id}'::uuid])::uuid[]
                 AND U0."configuration_id" IS NULL));
 
 select min(length),
@@ -419,6 +418,5 @@ WHERE "process_workeractivity"."id" IN
          FROM "process_workeractivity" U0
          INNER JOIN "documents_element" U1 ON (U0."element_id" = U1."id")
          WHERE (U1."corpus_id" = '{corpus_id}'::uuid
-                AND NOT (U0."worker_version_id" IS NULL)
                 AND U0."element_id" = '{element_id}'::uuid
                 AND U0."configuration_id" IS NULL))
-- 
GitLab