diff --git a/arkindex/documents/api/elements.py b/arkindex/documents/api/elements.py index b461bb16ad05441abfeb6b3c4f2b46cd125d93b3..94b8486df5fe5f3ca184babe7306b8c6a3775f56 100644 --- a/arkindex/documents/api/elements.py +++ b/arkindex/documents/api/elements.py @@ -360,7 +360,9 @@ class ElementsListBase(CorpusACLMixin, DestroyModelMixin, ListAPIView): return context def get_prefetch(self): - prefetch = {'zone__image__server'} + # Select the zone, image and server in one separate query + prefetch = {Prefetch('zone', queryset=Zone.objects.select_related('image__server'))} + with_best_classes = self.clean_params.get('with_best_classes') if with_best_classes and with_best_classes.lower() not in ('false', '0'): prefetch.add(best_classifications_prefetch) @@ -375,7 +377,7 @@ class ElementsListBase(CorpusACLMixin, DestroyModelMixin, ListAPIView): queryset = queryset \ .filter(**self.get_filters()) \ .prefetch_related(*self.get_prefetch()) \ - .select_related('type', 'corpus', 'zone') \ + .select_related('type', 'corpus') \ .order_by(*self.get_order_by()) class_filters = self.get_classifications_filters() diff --git a/arkindex/documents/tests/test_children_elements.py b/arkindex/documents/tests/test_children_elements.py index 9a01b442fe7eb4482f50a897bebad22ad5f7e6a4..da2bff818bb884cfe6d4c27e91725116c7ea2979 100644 --- a/arkindex/documents/tests/test_children_elements.py +++ b/arkindex/documents/tests/test_children_elements.py @@ -232,7 +232,7 @@ class TestChildrenElements(FixtureAPITestCase): def test_element_children_worker_version(self): self.corpus.elements.filter(name__contains='page 1r').update(worker_version=self.worker_version) - with self.assertNumQueries(7): + with self.assertNumQueries(6): response = self.client.get( reverse('api:elements-children', kwargs={'pk': str(self.vol.id)}), data={'worker_version': str(self.worker_version.id)} @@ -291,7 +291,7 @@ class TestChildrenElements(FixtureAPITestCase): ) element.add_parent(self.vol) - with self.assertNumQueries(8): + with self.assertNumQueries(7): response = self.client.get( reverse('api:elements-children', kwargs={'pk': str(self.vol.id)}), data={'with_has_children': True}, @@ -331,7 +331,7 @@ class TestChildrenElements(FixtureAPITestCase): def test_children_modified_since(self): self.corpus.elements.filter(name='Volume 1, page 1r').update(updated='2099-04-02T13:37:43Z') - with self.assertNumQueries(7): + with self.assertNumQueries(6): response = self.client.get( reverse('api:elements-children', kwargs={'pk': str(self.vol.id)}), HTTP_IF_MODIFIED_SINCE='Thu, 02 Apr 2099 13:37:42 GMT', diff --git a/arkindex/documents/tests/test_classes.py b/arkindex/documents/tests/test_classes.py index b9ecef256ae37ef2a6514b54683d9105152a2057..fa35887709d1721da2370cbad0f52e7dc2f92d91 100644 --- a/arkindex/documents/tests/test_classes.py +++ b/arkindex/documents/tests/test_classes.py @@ -215,7 +215,7 @@ class TestClasses(FixtureAPITestCase): }) def test_list_elements_db_queries(self): - with self.assertNumQueries(3): + with self.assertNumQueries(4): response = self.client.get( reverse('api:corpus-elements', kwargs={'corpus': self.corpus.id}), data={'type': self.classified.slug} @@ -224,7 +224,7 @@ class TestClasses(FixtureAPITestCase): self.assertEqual(response.json()['count'], 12) def test_list_elements_best_classes(self): - with self.assertNumQueries(4): + with self.assertNumQueries(5): response = self.client.get( reverse('api:corpus-elements', kwargs={'corpus': self.corpus.id}), data={'type': self.classified.slug, 'with_best_classes': True} @@ -239,7 +239,7 @@ class TestClasses(FixtureAPITestCase): ) def test_list_elements_best_classes_false(self): - with self.assertNumQueries(3): + with self.assertNumQueries(4): response = self.client.get( reverse('api:corpus-elements', kwargs={'corpus': self.corpus.id}), data={ @@ -252,7 +252,7 @@ class TestClasses(FixtureAPITestCase): self.assertIsNone(elt['best_classes']) def test_element_parents_best_classes(self): - with self.assertNumQueries(4): + with self.assertNumQueries(5): response = self.client.get( reverse('api:elements-parents', kwargs={'pk': str(self.common_children.id)}), data={'type': self.classified.slug, 'with_best_classes': 1} @@ -267,7 +267,7 @@ class TestClasses(FixtureAPITestCase): ) def test_element_children_best_classes(self): - with self.assertNumQueries(5): + with self.assertNumQueries(6): response = self.client.get( reverse('api:elements-children', kwargs={'pk': str(self.parent.id)}), data={'type': self.classified.slug, 'with_best_classes': 'yes'} @@ -287,7 +287,7 @@ class TestClasses(FixtureAPITestCase): """ child = Element.objects.filter(type=self.classified.id).first() child.classifications.all().update(state=ClassificationState.Rejected) - with self.assertNumQueries(5): + with self.assertNumQueries(6): response = self.client.get( reverse('api:elements-children', kwargs={'pk': str(self.parent.id)}), data={'type': self.classified.slug, 'with_best_classes': 'yes'} @@ -382,7 +382,7 @@ class TestClasses(FixtureAPITestCase): confidence=.1337, high_confidence=True, ) - with self.assertNumQueries(3): + with self.assertNumQueries(4): response = self.client.get( reverse('api:corpus-elements', kwargs={'corpus': self.corpus.id}), data={'type': self.classified.slug, 'best_class': str(self.text.id)} @@ -396,7 +396,7 @@ class TestClasses(FixtureAPITestCase): parent = Element.objects.get_ascending(self.common_children.id).get(name='elt_1') self.assertEqual(parent.classifications.filter(ml_class=self.text).count(), 2) parent.classifications.filter(ml_class=self.text).update(state=ClassificationState.Validated) - with self.assertNumQueries(3): + with self.assertNumQueries(4): response = self.client.get( reverse('api:elements-parents', kwargs={'pk': str(self.common_children.id)}), data={'type': self.classified.slug, 'best_class': str(self.text.id)} @@ -409,7 +409,7 @@ class TestClasses(FixtureAPITestCase): def test_class_filter_list_children(self): child = Element.objects.filter(type=self.classified.id).first() child.classifications.all().filter(confidence=.7).update(state=ClassificationState.Validated) - with self.assertNumQueries(4): + with self.assertNumQueries(5): response = self.client.get( reverse('api:elements-children', kwargs={'pk': str(self.parent.id)}), data={'type': self.classified.slug, 'best_class': str(self.text.id)} @@ -422,7 +422,7 @@ class TestClasses(FixtureAPITestCase): def test_class_filter_list_elements_distinct(self): self.assertEqual(Classification.objects.filter(high_confidence=True).count(), 24) self.assertEqual(Classification.objects.filter(high_confidence=True).distinct('element_id').count(), 12) - with self.assertNumQueries(3): + with self.assertNumQueries(4): response = self.client.get( reverse('api:corpus-elements', kwargs={'corpus': self.corpus.id}), data={'type': self.classified.slug, 'best_class': str(self.cover.id)} @@ -437,7 +437,7 @@ class TestClasses(FixtureAPITestCase): def test_class_filter_list_parents_distinct(self): self.assertEqual(Classification.objects.filter(high_confidence=True).count(), 24) self.assertEqual(Classification.objects.filter(high_confidence=True).distinct('element_id').count(), 12) - with self.assertNumQueries(3): + with self.assertNumQueries(4): response = self.client.get( reverse('api:elements-parents', kwargs={'pk': str(self.common_children.id)}), data={'type': self.classified.slug, 'best_class': str(self.cover.id)} @@ -452,7 +452,7 @@ class TestClasses(FixtureAPITestCase): def test_class_filter_list_children_distinct(self): self.assertEqual(Classification.objects.filter(high_confidence=True).count(), 24) self.assertEqual(Classification.objects.filter(high_confidence=True).distinct('element_id').count(), 12) - with self.assertNumQueries(4): + with self.assertNumQueries(5): response = self.client.get( reverse('api:elements-children', kwargs={'pk': str(self.parent.id)}), data={'type': self.classified.slug, 'best_class': str(self.cover.id)} @@ -473,7 +473,7 @@ class TestClasses(FixtureAPITestCase): confidence=.1337, high_confidence=True, ) - with self.assertNumQueries(4): + with self.assertNumQueries(5): response = self.client.get( reverse('api:corpus-elements', kwargs={'corpus': self.corpus.id}), data={'type': self.classified.slug, 'best_class': 'true', 'with_best_classes': 'true'}, @@ -497,7 +497,7 @@ class TestClasses(FixtureAPITestCase): confidence=.1337, high_confidence=False, ) - with self.assertNumQueries(4): + with self.assertNumQueries(5): response = self.client.get( reverse('api:corpus-elements', kwargs={'corpus': self.corpus.id}), data={'type': self.classified.slug, 'best_class': 'false', 'with_best_classes': 'true'}, diff --git a/arkindex/documents/tests/test_corpus_elements.py b/arkindex/documents/tests/test_corpus_elements.py index 67fed9174c05392eabcc812233e0be23cd0898f4..c5335c47219b08a2b2bcd1aadc09fec95e9607c3 100644 --- a/arkindex/documents/tests/test_corpus_elements.py +++ b/arkindex/documents/tests/test_corpus_elements.py @@ -18,7 +18,7 @@ class TestListElements(FixtureAPITestCase): def test_list_elements_filter_name(self): nameSelected = 'ol' - with self.assertNumQueries(5): + with self.assertNumQueries(4): response = self.client.get( reverse('api:corpus-elements', kwargs={'corpus': self.corpus.id}), data={'name': nameSelected} @@ -63,7 +63,7 @@ class TestListElements(FixtureAPITestCase): self.assertEqual(result['type'], 'act') def test_list_with_has_children(self): - with self.assertNumQueries(7): + with self.assertNumQueries(6): response = self.client.get( reverse('api:corpus-elements', kwargs={'corpus': self.corpus.id}), data={'with_has_children': True} @@ -108,7 +108,7 @@ class TestListElements(FixtureAPITestCase): self.assertTrue(str(query).endswith('AND "documents_elementpath"."id" IS NULL)')) def test_list_top_level(self): - with self.assertNumQueries(3): + with self.assertNumQueries(4): response = self.client.get( reverse('api:corpus-elements', kwargs={'corpus': self.corpus.id}), data={'top_level': True}, @@ -129,7 +129,7 @@ class TestListElements(FixtureAPITestCase): self.corpus.top_level_type = element_type self.corpus.save() - with self.assertNumQueries(3): + with self.assertNumQueries(4): response = self.client.get( reverse('api:corpus-elements', kwargs={'corpus': self.corpus.id}), data={'top_level': True}, @@ -143,7 +143,7 @@ class TestListElements(FixtureAPITestCase): def test_list_elements_filter_worker_version(self): self.corpus.elements.filter(name__contains='Volume 2').update(worker_version=self.worker_version) - with self.assertNumQueries(6): + with self.assertNumQueries(5): response = self.client.get( reverse('api:corpus-elements', kwargs={'corpus': self.corpus.id}), data={'worker_version': str(self.worker_version.id)}, @@ -190,7 +190,7 @@ class TestListElements(FixtureAPITestCase): def test_list_elements_filter_modified_since(self): self.corpus.elements.filter(name='Volume 1').update(updated='2099-04-02T13:37:43Z') - with self.assertNumQueries(6): + with self.assertNumQueries(5): response = self.client.get( reverse('api:corpus-elements', kwargs={'corpus': self.corpus.id}), HTTP_IF_MODIFIED_SINCE='Thu, 02 Apr 2099 13:37:42 GMT', @@ -199,7 +199,7 @@ class TestListElements(FixtureAPITestCase): self.assertEqual(response.json()['count'], self.corpus.elements.count()) def test_list_elements_with_corpus_false(self): - with self.assertNumQueries(5): + with self.assertNumQueries(4): response = self.client.get( reverse('api:corpus-elements', kwargs={'corpus': self.corpus.id}) + '?with_corpus=false' diff --git a/arkindex/documents/tests/test_parents_elements.py b/arkindex/documents/tests/test_parents_elements.py index d7ef86c05a0b323e3460424d5eb12503872a6299..08e25dc9a41dcd97cbeffca05d8a93d53e624476 100644 --- a/arkindex/documents/tests/test_parents_elements.py +++ b/arkindex/documents/tests/test_parents_elements.py @@ -93,7 +93,7 @@ class TestParentsElements(FixtureAPITestCase): """ self.corpus.elements.filter(name__contains='Volume 1').update(worker_version=self.worker_version) - with self.assertNumQueries(4): + with self.assertNumQueries(5): response = self.client.get( reverse('api:elements-parents', kwargs={'pk': str(self.page.id)}), data={'worker_version': str(self.worker_version.id)}, @@ -124,7 +124,7 @@ class TestParentsElements(FixtureAPITestCase): def test_parents_with_has_children(self): surface = Element.objects.get(name='Surface A') - with self.assertNumQueries(5): + with self.assertNumQueries(6): response = self.client.get( reverse('api:elements-parents', kwargs={'pk': str(surface.id)}), data={'recursive': True, 'with_has_children': True}, @@ -157,7 +157,7 @@ class TestParentsElements(FixtureAPITestCase): def test_parents_modified_since(self): self.corpus.elements.filter(name='Volume 1').update(updated='2099-04-02T13:37:43Z') - with self.assertNumQueries(4): + with self.assertNumQueries(5): response = self.client.get( reverse('api:elements-parents', kwargs={'pk': str(self.page.id)}), HTTP_IF_MODIFIED_SINCE='Thu, 02 Apr 2099 13:37:42 GMT',