rpms/ReviewBoard/EL-5 0001-Optimize-several-queries-for-review-requests.patch, NONE, 1.1 ReviewBoard.spec, 1.6, 1.7 0001-Greatly-reduce-the-number-of-SQL-queries-in-the-Dash.patch, 1.1, NONE

Stephen Gallagher sgallagh at fedoraproject.org
Mon Apr 19 12:06:52 UTC 2010


Author: sgallagh

Update of /cvs/pkgs/rpms/ReviewBoard/EL-5
In directory cvs01.phx2.fedoraproject.org:/tmp/cvs-serv3709

Modified Files:
	ReviewBoard.spec 
Added Files:
	0001-Optimize-several-queries-for-review-requests.patch 
Removed Files:
	0001-Greatly-reduce-the-number-of-SQL-queries-in-the-Dash.patch 
Log Message:
* Mon Apr 19 2010 Stephen Gallagher <sgallagh at redhat.com> - 1.5-8.beta1
- Reduce complexity of database lookups. Eliminate unneccessary joins
- between account and group tables.


0001-Optimize-several-queries-for-review-requests.patch:
 datagrids.py |   24 ++++++++----------------
 managers.py  |   38 +++++++++++++++++++++++++++++---------
 2 files changed, 37 insertions(+), 25 deletions(-)

--- NEW FILE 0001-Optimize-several-queries-for-review-requests.patch ---
>From 8f5a16fbab3ef522ff9efe051aea632874ae855a Mon Sep 17 00:00:00 2001
From: Christian Hammond <chipx86 at chipx86.com>
Date: Thu, 1 Apr 2010 21:17:52 -0700
Subject: [PATCH] Optimize several queries for review requests.

The Dashboard, despite recent improvements, is still slow for really huge
deployments. Most of this turned out to be a bug where, instead of passing in
a calculated list of IDs to another query, we were passing in the query to
get the list of IDs. This is slow. We're now properly getting that list of
IDs.

We also do smaller, less complicated queries for many things. Previously,
we were doing complex queries that caused the Profile and Group tables to be
joined. Now we look up the values we need beforehand and pass in the IDs
to the more complicated query. This reduces the overall time for these
queries and helps use the database sql query cache.
---
 reviewboard/reviews/datagrids.py |   24 ++++++++----------------
 reviewboard/reviews/managers.py  |   37 +++++++++++++++++++++++++++++--------
 2 files changed, 37 insertions(+), 24 deletions(-)

diff --git a/reviewboard/reviews/datagrids.py b/reviewboard/reviews/datagrids.py
index 33a6cb01e9a7877cef8e69bf0ee4e503f89410ee..82fe82e900ba3e780135f3390dab680a985bef83 100644
--- a/reviewboard/reviews/datagrids.py
+++ b/reviewboard/reviews/datagrids.py
@@ -433,38 +433,30 @@ class DashboardDataGrid(ReviewRequestDataGrid):
         user = self.request.user
 
         if view == 'outgoing':
-            self.queryset = ReviewRequest.objects.from_user(user.username,
-                                                            user,
-                                                            with_counts=True)
+            self.queryset = ReviewRequest.objects.from_user(user, user)
             self.title = _(u"All Outgoing Review Requests")
         elif view == 'mine':
-            self.queryset = ReviewRequest.objects.from_user(user.username, user,
-                                                            None,
-                                                            with_counts=True)
+            self.queryset = ReviewRequest.objects.from_user(user, user, None)
             self.title = _(u"All My Review Requests")
         elif view == 'to-me':
             self.queryset = \
-                ReviewRequest.objects.to_user_directly(user.username, user,
-                                                       with_counts=True)
+                ReviewRequest.objects.to_user_directly(user, user)
             self.title = _(u"Incoming Review Requests to Me")
         elif view == 'to-group':
             if group != "":
-                self.queryset = ReviewRequest.objects.to_group(group, user,
-                                                               with_counts=True)
+                self.queryset = ReviewRequest.objects.to_group(group, user)
                 self.title = _(u"Incoming Review Requests to %s") % group
             else:
                 self.queryset = \
-                    ReviewRequest.objects.to_user_groups(user.username, user,
-                                                         with_counts=True)
+                    ReviewRequest.objects.to_user_groups(user, user)
                 self.title = _(u"All Incoming Review Requests to My Groups")
         elif view == 'starred':
             profile = user.get_profile()
             self.queryset = \
-                profile.starred_review_requests.public(user, with_counts=True)
+                profile.starred_review_requests.public(user)
             self.title = _(u"Starred Review Requests")
         else: # "incoming" or invalid
-            self.queryset = ReviewRequest.objects.to_user(user.username, user,
-                                                          with_counts=True)
+            self.queryset = ReviewRequest.objects.to_user(user, user)
             self.title = _(u"All Incoming Review Requests")
 
         # Pre-load all querysets for the sidebar.
@@ -478,7 +470,7 @@ class DashboardDataGrid(ReviewRequestDataGrid):
         }
 
         q = Group.objects.filter(Q(users=user) | Q(starred_by=user)).distinct()
-        group_names = q.values_list('name', flat=True)
+        group_names = list(q.values_list('name', flat=True))
 
         q = Group.objects.filter(name__in=group_names)
         q = q.filter(Q(review_requests__public=True) |
diff --git a/reviewboard/reviews/managers.py b/reviewboard/reviews/managers.py
index 7b63ce5af11ad13d001e42b87aea5cc2d0740d23..70787faecf96f812c28878163352411108c78dd4 100644
--- a/reviewboard/reviews/managers.py
+++ b/reviewboard/reviews/managers.py
@@ -96,10 +96,16 @@ class ReviewRequestManager(ConcurrencyManager):
         return self._query(extra_query=Q(target_groups__name=group_name),
                            *args, **kwargs)
 
-    def to_user_groups(self, username, *args, **kwargs):
-        return self._query(
-            extra_query=Q(target_groups__users__username=username),
-            *args, **kwargs)
+    def to_user_groups(self, user_or_username, *args, **kwargs):
+        if isinstance(user_or_username, User):
+            query_user = user_or_username
+        else:
+            query_user = User.objects.get(username=user_or_username)
+
+        groups = list(query_user.review_groups.values_list('pk', flat=True))
+
+        return self._query(extra_query=Q(target_groups__in=groups),
+                           *args, **kwargs)
 
     def to_user_directly(self, user_or_username, *args, **kwargs):
         if isinstance(user_or_username, User):
@@ -107,7 +113,14 @@ class ReviewRequestManager(ConcurrencyManager):
         else:
             query_user = User.objects.get(username=user_or_username)
 
-        query = Q(starred_by__user=query_user) | Q(target_people=query_user)
+        query = Q(target_people=query_user)
+
+        try:
+            profile = query_user.get_profile()
+            query = query | Q(starred_by=profile)
+        except ObjectDoesNotExist:
+            pass
+
         return self._query(extra_query=query, *args, **kwargs)
 
     def to_user(self, user_or_username, *args, **kwargs):
@@ -116,9 +129,17 @@ class ReviewRequestManager(ConcurrencyManager):
         else:
             query_user = User.objects.get(username=user_or_username)
 
-        query = Q(starred_by__user=query_user) | \
-                Q(target_people=query_user) | \
-                Q(target_groups__users=query_user)
+        groups = list(query_user.review_groups.values_list('pk', flat=True))
+
+        query = Q(target_people=query_user) | \
+                Q(target_groups__in=groups)
+
+        try:
+            profile = query_user.get_profile()
+            query = query | Q(starred_by=profile)
+        except ObjectDoesNotExist:
+            pass
+
         return self._query(extra_query=query, *args, **kwargs)
 
     def from_user(self, user_or_username, *args, **kwargs):
-- 
1.7.0.1



Index: ReviewBoard.spec
===================================================================
RCS file: /cvs/pkgs/rpms/ReviewBoard/EL-5/ReviewBoard.spec,v
retrieving revision 1.6
retrieving revision 1.7
diff -u -p -r1.6 -r1.7
--- ReviewBoard.spec	17 Apr 2010 15:13:10 -0000	1.6
+++ ReviewBoard.spec	19 Apr 2010 12:06:52 -0000	1.7
@@ -2,7 +2,7 @@
 
 Name:           ReviewBoard
 Version:        1.5
-Release:        6.beta1%{?dist}
+Release:        8.beta1%{?dist}
 Summary:        Web-based code review tool
 Group:          Applications/Internet
 License:        MIT
@@ -27,7 +27,7 @@ Requires:       django-evolution
 Requires:       python-recaptcha-client
 Requires:       python-paramiko
 
-Patch0001: 0001-Greatly-reduce-the-number-of-SQL-queries-in-the-Dash.patch
+Patch0001: 0001-Optimize-several-queries-for-review-requests.patch
 
 %description
 Review Board is a powerful web-based code review tool that offers
@@ -79,6 +79,13 @@ rm -rf $RPM_BUILD_ROOT
 %{python_sitelib}/ReviewBoard*.egg-info/
 
 %changelog
+* Mon Apr 19 2010 Stephen Gallagher <sgallagh at redhat.com> - 1.5-8.beta1
+- Reduce complexity of database lookups. Eliminate unneccessary joins
+- between account and group tables.
+
+* Mon Apr 19 2010 Stephen Gallagher <sgallagh at redhat.com> - 1.5-7.beta1
+- Remove previous patch. It was actually already in the source tree
+
 * Sat Apr 17 2010 Stephen Gallagher <sgallagh at redhat.com> - 1.5-6.beta1
 - Include upstream patch to drastically reduce the number of
 - SQL lookups


--- 0001-Greatly-reduce-the-number-of-SQL-queries-in-the-Dash.patch DELETED ---



More information about the scm-commits mailing list