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:
