This is an automated email from the ASF dual-hosted git repository.

brondsem pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/allura.git

commit 39285314eb7d7c1c9ba6c2ca8d2f91c89ba0c80e
Author: Kenton Taylor <[email protected]>
AuthorDate: Thu Mar 17 16:56:55 2022 +0000

    [#4359] Performance improvements when viewing discussion threads
---
 Allura/allura/controllers/discuss.py           | 8 ++++++++
 Allura/allura/model/artifact.py                | 3 +++
 Allura/allura/model/notification.py            | 1 +
 ForgeDiscussion/forgediscussion/model/forum.py | 2 ++
 4 files changed, 14 insertions(+)

diff --git a/Allura/allura/controllers/discuss.py 
b/Allura/allura/controllers/discuss.py
index 5fd8956..07afb1e 100644
--- a/Allura/allura/controllers/discuss.py
+++ b/Allura/allura/controllers/discuss.py
@@ -44,6 +44,7 @@ from allura.lib.widgets import discuss as DW
 from allura.lib.widgets import form_fields as ffw
 
 from allura.model.auth import User
+from allura.model.artifact import ArtifactReference
 from .attachments import AttachmentsController, AttachmentController
 from .feed import FeedArgs, FeedController
 import six
@@ -206,6 +207,13 @@ class ThreadController(BaseController, FeedController, 
metaclass=h.ProxiedAttrMe
         M.session.artifact_orm_session._get().skip_mod_date = True
         M.session.artifact_orm_session._get().skip_last_updated = True
         count = self.thread.query_posts(page=page, limit=int(limit)).count()
+
+        # bulk fetch backrefs to save on many queries within EW
+        index_ids = [a.index_id() for a in self.thread.discussion.posts]
+        q = ArtifactReference.query.find(dict(references={'$in': 
index_ids})).all()
+        for a in self.thread.discussion.posts:
+            a._backrefs = [aref._id for aref in q if a.index_id() in 
(aref.references or [])]
+
         return dict(discussion=self.thread.discussion,
                     thread=self.thread,
                     page=int(page),
diff --git a/Allura/allura/model/artifact.py b/Allura/allura/model/artifact.py
index a40c8ab..fe9beb8 100644
--- a/Allura/allura/model/artifact.py
+++ b/Allura/allura/model/artifact.py
@@ -162,6 +162,9 @@ class Artifact(MappedClass, SearchIndexable):
         :return: list of :attr:`allura.model.index.ArtifactReference._id`'s
 
         """
+        if hasattr(self, '_backrefs'):
+            return self._backrefs
+
         q = ArtifactReference.query.find(dict(references=self.index_id()))
         return [aref._id for aref in q]
 
diff --git a/Allura/allura/model/notification.py 
b/Allura/allura/model/notification.py
index 4c0250a..a1f9872 100644
--- a/Allura/allura/model/notification.py
+++ b/Allura/allura/model/notification.py
@@ -35,6 +35,7 @@ Periodically:
 '''
 
 import logging
+from allura.lib.decorators import memoize
 from bson import ObjectId
 from datetime import datetime, timedelta
 from collections import defaultdict
diff --git a/ForgeDiscussion/forgediscussion/model/forum.py 
b/ForgeDiscussion/forgediscussion/model/forum.py
index 89f1558..d9fb583 100644
--- a/ForgeDiscussion/forgediscussion/model/forum.py
+++ b/ForgeDiscussion/forgediscussion/model/forum.py
@@ -32,6 +32,7 @@ from allura import model as M
 from allura.model.notification import MailFooter
 from allura.lib import utils
 from allura.lib import helpers as h
+from allura.lib.decorators import memoize
 
 if typing.TYPE_CHECKING:
     from ming.odm.mapper import Query
@@ -186,6 +187,7 @@ class ForumThread(M.Thread):
     def primary(self):
         return self
 
+    @memoize
     def subscribed(self, user=None, include_parents=True):
         subbed = super().subscribed(user=user, include_parents=include_parents)
         if subbed:

Reply via email to