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