You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@allura.apache.org by br...@apache.org on 2022/03/30 18:12:04 UTC
[allura] 01/02: [#4359] Performance improvements when viewing discussion threads
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 <kt...@slashdotmedia.com>
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: