Skip to content

Commit 1ef3074

Browse files
[WEB-4657] refactor: optimize project v2 endpoint and issue detail endpoint #7558
1 parent e3deeb2 commit 1ef3074

File tree

1 file changed

+94
-85
lines changed
  • apps/api/plane/app/views/issue

1 file changed

+94
-85
lines changed

apps/api/plane/app/views/issue/base.py

Lines changed: 94 additions & 85 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@
1515
UUIDField,
1616
Value,
1717
Subquery,
18+
Count,
1819
)
1920
from django.db.models.functions import Coalesce
2021
from django.utils import timezone
@@ -453,10 +454,12 @@ def retrieve(self, request, slug, project_id, pk=None):
453454
project = Project.objects.get(pk=project_id, workspace__slug=slug)
454455

455456
issue = (
456-
Issue.objects.filter(project_id=self.kwargs.get("project_id"))
457-
.filter(workspace__slug=self.kwargs.get("slug"))
458-
.select_related("workspace", "project", "state", "parent")
459-
.prefetch_related("assignees", "labels", "issue_module__module")
457+
Issue.objects.filter(
458+
project_id=self.kwargs.get("project_id"),
459+
workspace__slug=self.kwargs.get("slug"),
460+
pk=pk,
461+
)
462+
.select_related("state")
460463
.annotate(
461464
cycle_id=Subquery(
462465
CycleIssue.objects.filter(issue=OuterRef("id")).values("cycle_id")[
@@ -465,60 +468,63 @@ def retrieve(self, request, slug, project_id, pk=None):
465468
)
466469
)
467470
.annotate(
468-
link_count=IssueLink.objects.filter(issue=OuterRef("id"))
469-
.order_by()
470-
.annotate(count=Func(F("id"), function="Count"))
471-
.values("count")
471+
link_count=Subquery(
472+
IssueLink.objects.filter(issue=OuterRef("id"))
473+
.values("issue")
474+
.annotate(count=Count("id"))
475+
.values("count")
476+
)
472477
)
473478
.annotate(
474-
attachment_count=FileAsset.objects.filter(
475-
issue_id=OuterRef("id"),
476-
entity_type=FileAsset.EntityTypeContext.ISSUE_ATTACHMENT,
479+
attachment_count=Subquery(
480+
FileAsset.objects.filter(
481+
issue_id=OuterRef("id"),
482+
entity_type=FileAsset.EntityTypeContext.ISSUE_ATTACHMENT,
483+
)
484+
.values("issue_id")
485+
.annotate(count=Count("id"))
486+
.values("count")
477487
)
478-
.order_by()
479-
.annotate(count=Func(F("id"), function="Count"))
480-
.values("count")
481488
)
482489
.annotate(
483-
sub_issues_count=Issue.issue_objects.filter(parent=OuterRef("id"))
484-
.order_by()
485-
.annotate(count=Func(F("id"), function="Count"))
486-
.values("count")
490+
sub_issues_count=Subquery(
491+
Issue.issue_objects.filter(parent=OuterRef("id"))
492+
.values("parent")
493+
.annotate(count=Count("id"))
494+
.values("count")
495+
)
487496
)
488-
.filter(pk=pk)
489497
.annotate(
490498
label_ids=Coalesce(
491-
ArrayAgg(
492-
"labels__id",
493-
distinct=True,
494-
filter=Q(
495-
~Q(labels__id__isnull=True)
496-
& Q(label_issue__deleted_at__isnull=True)
497-
),
499+
Subquery(
500+
IssueLabel.objects.filter(issue_id=OuterRef("pk"))
501+
.values("issue_id")
502+
.annotate(arr=ArrayAgg("label_id", distinct=True))
503+
.values("arr")
498504
),
499505
Value([], output_field=ArrayField(UUIDField())),
500506
),
501507
assignee_ids=Coalesce(
502-
ArrayAgg(
503-
"assignees__id",
504-
distinct=True,
505-
filter=Q(
506-
~Q(assignees__id__isnull=True)
507-
& Q(assignees__member_project__is_active=True)
508-
& Q(issue_assignee__deleted_at__isnull=True)
509-
),
508+
Subquery(
509+
IssueAssignee.objects.filter(
510+
issue_id=OuterRef("pk"),
511+
assignee__member_project__is_active=True,
512+
)
513+
.values("issue_id")
514+
.annotate(arr=ArrayAgg("assignee_id", distinct=True))
515+
.values("arr")
510516
),
511517
Value([], output_field=ArrayField(UUIDField())),
512518
),
513519
module_ids=Coalesce(
514-
ArrayAgg(
515-
"issue_module__module_id",
516-
distinct=True,
517-
filter=Q(
518-
~Q(issue_module__module_id__isnull=True)
519-
& Q(issue_module__module__archived_at__isnull=True)
520-
& Q(issue_module__deleted_at__isnull=True)
521-
),
520+
Subquery(
521+
ModuleIssue.objects.filter(
522+
issue_id=OuterRef("pk"),
523+
module__archived_at__isnull=True,
524+
)
525+
.values("issue_id")
526+
.annotate(arr=ArrayAgg("module_id", distinct=True))
527+
.values("arr")
522528
),
523529
Value([], output_field=ArrayField(UUIDField())),
524530
),
@@ -786,37 +792,42 @@ def get_queryset(self):
786792
)
787793

788794
return (
789-
issue_queryset.select_related("workspace", "project", "state", "parent")
790-
.prefetch_related("assignees", "labels", "issue_module__module")
795+
issue_queryset.select_related("state")
791796
.annotate(
792797
cycle_id=Subquery(
793-
CycleIssue.objects.filter(
794-
issue=OuterRef("id"), deleted_at__isnull=True
795-
).values("cycle_id")[:1]
798+
CycleIssue.objects.filter(issue=OuterRef("id")).values("cycle_id")[
799+
:1
800+
]
796801
)
797802
)
798803
.annotate(
799-
link_count=IssueLink.objects.filter(issue=OuterRef("id"))
800-
.order_by()
801-
.annotate(count=Func(F("id"), function="Count"))
802-
.values("count")
804+
link_count=Subquery(
805+
IssueLink.objects.filter(issue=OuterRef("id"))
806+
.values("issue")
807+
.annotate(count=Count("id"))
808+
.values("count")
809+
)
803810
)
804811
.annotate(
805-
attachment_count=FileAsset.objects.filter(
806-
issue_id=OuterRef("id"),
807-
entity_type=FileAsset.EntityTypeContext.ISSUE_ATTACHMENT,
812+
attachment_count=Subquery(
813+
FileAsset.objects.filter(
814+
issue_id=OuterRef("id"),
815+
entity_type=FileAsset.EntityTypeContext.ISSUE_ATTACHMENT,
816+
)
817+
.values("issue_id")
818+
.annotate(count=Count("id"))
819+
.values("count")
808820
)
809-
.order_by()
810-
.annotate(count=Func(F("id"), function="Count"))
811-
.values("count")
812821
)
813822
.annotate(
814-
sub_issues_count=Issue.issue_objects.filter(parent=OuterRef("id"))
815-
.order_by()
816-
.annotate(count=Func(F("id"), function="Count"))
817-
.values("count")
823+
sub_issues_count=Subquery(
824+
Issue.issue_objects.filter(parent=OuterRef("id"))
825+
.values("parent")
826+
.annotate(count=Count("id"))
827+
.values("count")
828+
)
818829
)
819-
).distinct()
830+
)
820831

821832
def process_paginated_result(self, fields, results, timezone):
822833
paginated_data = results.values(*fields)
@@ -896,37 +907,35 @@ def list(self, request, slug, project_id):
896907

897908
queryset = queryset.annotate(
898909
label_ids=Coalesce(
899-
ArrayAgg(
900-
"labels__id",
901-
distinct=True,
902-
filter=Q(
903-
~Q(labels__id__isnull=True)
904-
& Q(label_issue__deleted_at__isnull=True)
905-
),
910+
Subquery(
911+
IssueLabel.objects.filter(issue_id=OuterRef("pk"))
912+
.values("issue_id")
913+
.annotate(arr=ArrayAgg("label_id", distinct=True))
914+
.values("arr")
906915
),
907916
Value([], output_field=ArrayField(UUIDField())),
908917
),
909918
assignee_ids=Coalesce(
910-
ArrayAgg(
911-
"assignees__id",
912-
distinct=True,
913-
filter=Q(
914-
~Q(assignees__id__isnull=True)
915-
& Q(assignees__member_project__is_active=True)
916-
& Q(issue_assignee__deleted_at__isnull=True)
917-
),
919+
Subquery(
920+
IssueAssignee.objects.filter(
921+
issue_id=OuterRef("pk"),
922+
assignee__member_project__is_active=True,
923+
)
924+
.values("issue_id")
925+
.annotate(arr=ArrayAgg("assignee_id", distinct=True))
926+
.values("arr")
918927
),
919928
Value([], output_field=ArrayField(UUIDField())),
920929
),
921930
module_ids=Coalesce(
922-
ArrayAgg(
923-
"issue_module__module_id",
924-
distinct=True,
925-
filter=Q(
926-
~Q(issue_module__module_id__isnull=True)
927-
& Q(issue_module__module__archived_at__isnull=True)
928-
& Q(issue_module__deleted_at__isnull=True)
929-
),
931+
Subquery(
932+
ModuleIssue.objects.filter(
933+
issue_id=OuterRef("pk"),
934+
module__archived_at__isnull=True,
935+
)
936+
.values("issue_id")
937+
.annotate(arr=ArrayAgg("module_id", distinct=True))
938+
.values("arr")
930939
),
931940
Value([], output_field=ArrayField(UUIDField())),
932941
),

0 commit comments

Comments
 (0)