From a2d1e69b6563b931cc259d7c165c1ebce1850fda Mon Sep 17 00:00:00 2001
From: Erwan Rouchet <rouchet@teklia.com>
Date: Wed, 14 Aug 2024 17:18:09 +0200
Subject: [PATCH] Optimize children checks on CreateElementChildren and element
 lists

---
 arkindex/documents/api/elements.py         | 2 +-
 arkindex/documents/serializers/elements.py | 2 +-
 2 files changed, 2 insertions(+), 2 deletions(-)

diff --git a/arkindex/documents/api/elements.py b/arkindex/documents/api/elements.py
index 79a1611358..d14d0ba42e 100644
--- a/arkindex/documents/api/elements.py
+++ b/arkindex/documents/api/elements.py
@@ -137,7 +137,7 @@ def _fetch_has_children(elements):
             cursor,
             "SELECT DISTINCT ON (e.id) e.id, p.id is not null as has_children "
             "FROM (VALUES %s) e (id) "
-            "LEFT JOIN documents_elementpath p ON (ARRAY[e.id] && p.path)",
+            "LEFT JOIN documents_elementpath p ON ARRAY[e.id] && p.path AND p.path[array_length(p.path, 1)] = e.id",
             tuple((element.id, ) for element in elements),
         )
         has_children = dict(cursor.fetchall())
diff --git a/arkindex/documents/serializers/elements.py b/arkindex/documents/serializers/elements.py
index 67eeb6194e..1d599b5da7 100644
--- a/arkindex/documents/serializers/elements.py
+++ b/arkindex/documents/serializers/elements.py
@@ -966,7 +966,7 @@ class ElementChildrenCreateSerializer(serializers.Serializer):
             .filter(id__in=unique_children)
             .annotate(
                 different_corpus=~Q(corpus_id=self.context["parent"].corpus_id),
-                has_children=Exists(ElementPath.objects.filter(path__overlap=[OuterRef("pk")])),
+                has_children=Exists(ElementPath.objects.filter(path__overlap=[OuterRef("pk")], path__last=OuterRef("pk"))),
             )
             .values_list("id", "different_corpus", "has_children")
         )
-- 
GitLab