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:
