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