]> git.ipfire.org Git - thirdparty/patchwork.git/commitdiff
REST: Fix duplicate project queries
authorMete Polat <metepolat2000@gmail.com>
Wed, 29 Jan 2020 19:01:22 +0000 (20:01 +0100)
committerStephen Finucane <stephen@that.guru>
Sun, 2 Feb 2020 10:49:26 +0000 (10:49 +0000)
Eliminates duplicate project queries caused by calling
get_absolute_url() in the embedded serializers. Following foreign keys
with 'series__project' will cache the project of the series as well as
the series itself.

Signed-off-by: Mete Polat <metepolat2000@gmail.com>
Signed-off-by: Stephen Finucane <stephen@that.guru>
Closes: #335
patchwork/api/cover.py
patchwork/api/event.py
patchwork/api/patch.py
patchwork/api/series.py
patchwork/tests/api/test_cover.py
patchwork/tests/api/test_event.py
patchwork/tests/api/test_patch.py
patchwork/tests/api/test_series.py

index caf9a386efa5b8fcc1e4b19e9cf23219cffc3f7c..9e86d47e00e5cd2e54185c961f55d191d20b43bc 100644 (file)
@@ -101,7 +101,7 @@ class CoverLetterList(ListAPIView):
 
     def get_queryset(self):
         return CoverLetter.objects.all()\
-            .select_related('project', 'submitter', 'series')\
+            .select_related('project', 'submitter', 'series__project')\
             .defer('content', 'headers')
 
 
index a066faaec63bb0889ad4231b5c57609b8506645a..fdff6a4f2fa60fecfc9fe0203736bb4b2187908a 100644 (file)
@@ -86,7 +86,7 @@ class EventList(ListAPIView):
 
     def get_queryset(self):
         return Event.objects.all()\
-            .prefetch_related('project', 'patch', 'series', 'cover',
-                              'previous_state', 'current_state',
+            .prefetch_related('project', 'patch__project', 'series__project',
+                              'cover', 'previous_state', 'current_state',
                               'previous_delegate', 'current_delegate',
                               'created_check')
index a29a1ab0eb71b7be8deb115f14eefe1b1828b538..1a3ce9057490ac4d9275f82741e837f1248afe14 100644 (file)
@@ -176,7 +176,7 @@ class PatchList(ListAPIView):
         return Patch.objects.all()\
             .prefetch_related('check_set')\
             .select_related('project', 'state', 'submitter', 'delegate',
-                            'series')\
+                            'series__project')\
             .defer('content', 'diff', 'headers')
 
 
index f7bb8c06a6c9b6994544d30fd586e3b93406bbd9..df28f95dab1be11f92550964d3b582053f706ee5 100644 (file)
@@ -55,8 +55,9 @@ class SeriesMixin(object):
     serializer_class = SeriesSerializer
 
     def get_queryset(self):
-        return Series.objects.all().prefetch_related('patches',)\
-            .select_related('submitter', 'cover_letter', 'project')
+        return Series.objects.all()\
+            .prefetch_related('patches__project',)\
+            .select_related('submitter', 'cover_letter__project', 'project')
 
 
 class SeriesList(SeriesMixin, ListAPIView):
index 891c55425aeb90da7328a5cd1290440831ec315c..16cc0cd96f26559936ea6ef38445a0e15e07972b 100644 (file)
@@ -127,8 +127,7 @@ class TestCoverLetterAPI(utils.APITestCase):
         series = create_series()
         create_covers(5, series=series)
 
-        # FIXME(stephenfin): This should result in 2 queries
-        with self.assertNumQueries(3):
+        with self.assertNumQueries(2):
             self.client.get(self.api_url())
 
     @utils.store_samples('cover-detail')
index e0fca6851f38cb369ed6551b2de78929162fbc10..54935d0b19d3de40f444311ed855508593ebc491 100644 (file)
@@ -183,8 +183,7 @@ class TestEventAPI(utils.APITestCase):
         for _ in range(3):
             self._create_events()
 
-        # FIXME(stephenfin): This should result in 28 queries
-        with self.assertNumQueries(32):
+        with self.assertNumQueries(28):
             self.client.get(self.api_url())
 
     def test_order_by_date_default(self):
index 888a257d6ef2566c35bc3b38aba922c6523bd76f..6e5e6a02bc57ad50a2d5e693c1a91b23eca15446 100644 (file)
@@ -215,8 +215,7 @@ class TestPatchAPI(utils.APITestCase):
         series = create_series()
         create_patches(5, series=series)
 
-        # FIXME(stephenfin): This should result in 3 queries
-        with self.assertNumQueries(8):
+        with self.assertNumQueries(3):
             self.client.get(self.api_url())
 
     @utils.store_samples('patch-detail')
index 4ad82fe810831f3b8b2a2cb1a0b21deabc82f52c..87518719b8872c98450204662f25e3d7649d1f72 100644 (file)
@@ -142,8 +142,7 @@ class TestSeriesAPI(utils.APITestCase):
         """Ensure we retrieve the embedded cover letter project once."""
         self._create_series()
 
-        # FIXME(stephenfin): This should result in 4 queries
-        with self.assertNumQueries(5):
+        with self.assertNumQueries(4):
             self.client.get(self.api_url())
 
     @utils.store_samples('series-detail')