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

kentontaylor pushed a commit to branch kt/4359
in repository https://gitbox.apache.org/repos/asf/allura.git

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

    [#4329] Performance improvements when viewing discussion threads
---
 Allura/allura/controllers/discuss.py           | 8 ++++++++
 Allura/allura/model/artifact.py                | 3 +++
 Allura/allura/model/discuss.py                 | 7 +++++--
 Allura/allura/model/notification.py            | 2 ++
 ForgeDiscussion/forgediscussion/model/forum.py | 2 ++
 5 files changed, 20 insertions(+), 2 deletions(-)

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/discuss.py b/Allura/allura/model/discuss.py
index e6433f5..65f5a39 100644
--- a/Allura/allura/model/discuss.py
+++ b/Allura/allura/model/discuss.py
@@ -436,8 +436,11 @@ class Thread(Artifact, ActivityObject):
 
     def find_posts(self, page=None, limit=None, timestamp=None,
                    style='threaded'):
-        return self.query_posts(page=page, limit=limit,
-                                timestamp=timestamp, style=style).all()
+        if self.posts:
+            return self.posts
+        else:
+            return self.query_posts(page=page, limit=limit,
+                                   timestamp=timestamp, style=style).all()
 
     def url(self):
         # Can't use self.discussion because it might change during the req
diff --git a/Allura/allura/model/notification.py 
b/Allura/allura/model/notification.py
index 4c0250a..02cc77d 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
@@ -515,6 +516,7 @@ class Mailbox(MappedClass):
             artifact_index_id=artifact_index_id,
             topic=topic))
 
+    @memoize
     @classmethod
     def subscribed(
             cls, user_id=None, project_id=None, app_config_id=None,
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