Skip to content

Commit 44bc501

Browse files
committed
Ensured that multiple calls to count don't result in multiple queries. Thanks to Nagyman and others for the report!
1 parent 03279e3 commit 44bc501

File tree

2 files changed

+22
-9
lines changed

2 files changed

+22
-9
lines changed

haystack/query.py

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -374,13 +374,11 @@ def auto_query(self, query_string):
374374

375375
def count(self):
376376
"""Returns the total number of matching results."""
377-
clone = self._clone()
378-
return len(clone)
377+
return len(self)
379378

380379
def best_match(self):
381380
"""Returns the best/top search result that matches the query."""
382-
clone = self._clone()
383-
return clone[0]
381+
return self[0]
384382

385383
def latest(self, date_field):
386384
"""Returns the most recent search result that matches the query."""

tests/solr_tests/tests/solr_backend.py

Lines changed: 20 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -490,6 +490,17 @@ def test_slice(self):
490490
self.assertEqual(int(results[21].pk), 22)
491491
self.assertEqual(len(backends.queries), 1)
492492

493+
def test_count(self):
494+
backends.reset_search_queries()
495+
self.assertEqual(len(backends.queries), 0)
496+
sqs = self.sqs.all()
497+
self.assertEqual(sqs.count(), 23)
498+
self.assertEqual(sqs.count(), 23)
499+
self.assertEqual(len(sqs), 23)
500+
self.assertEqual(sqs.count(), 23)
501+
# Should only execute one query to count the length of the result set.
502+
self.assertEqual(len(backends.queries), 1)
503+
493504
def test_manual_iter(self):
494505
results = self.sqs.all()
495506

@@ -709,24 +720,28 @@ def tearDown(self):
709720

710721
def test_more_like_this(self):
711722
mlt = self.sqs.more_like_this(MockModel.objects.get(pk=1))
712-
self.assertEqual(mlt.count(), 25)
723+
self.assertEqual(mlt.count(), 24)
713724
self.assertEqual([result.pk for result in mlt], ['6', '14', '4', '10', '22', '5', '3', '12', '2', '23', '18', '19', '13', '7', '15', '21', '9', '1', '2', '20', '16', '17', '8', '11'])
725+
self.assertEqual(len([result.pk for result in mlt]), 24)
714726

715727
alt_mlt = self.sqs.filter(name='daniel3').more_like_this(MockModel.objects.get(pk=3))
716-
self.assertEqual(alt_mlt.count(), 11)
728+
self.assertEqual(alt_mlt.count(), 10)
717729
self.assertEqual([result.pk for result in alt_mlt], ['23', '13', '17', '16', '22', '19', '4', '10', '1', '2'])
730+
self.assertEqual(len([result.pk for result in alt_mlt]), 10)
718731

719732
alt_mlt_with_models = self.sqs.models(MockModel).more_like_this(MockModel.objects.get(pk=1))
720-
self.assertEqual(alt_mlt_with_models.count(), 23)
733+
self.assertEqual(alt_mlt_with_models.count(), 22)
721734
self.assertEqual([result.pk for result in alt_mlt_with_models], ['6', '14', '4', '10', '22', '5', '3', '12', '2', '23', '18', '19', '13', '7', '15', '21', '9', '20', '16', '17', '8', '11'])
735+
self.assertEqual(len([result.pk for result in alt_mlt_with_models]), 22)
722736

723737
if hasattr(MockModel.objects, 'defer'):
724738
# Make sure MLT works with deferred bits.
725739
mi = MockModel.objects.defer('foo').get(pk=1)
726740
self.assertEqual(mi._deferred, True)
727741
deferred = self.sqs.models(MockModel).more_like_this(mi)
728-
self.assertEqual(alt_mlt_with_models.count(), 23)
729-
self.assertEqual([result.pk for result in alt_mlt_with_models], ['6', '14', '4', '10', '22', '5', '3', '12', '2', '23', '18', '19', '13', '7', '15', '21', '9', '20', '16', '17', '8', '11'])
742+
self.assertEqual(deferred.count(), 0)
743+
self.assertEqual([result.pk for result in deferred], [])
744+
self.assertEqual(len([result.pk for result in deferred]), 0)
730745

731746

732747
class LiveSolrRoundTripTestCase(TestCase):

0 commit comments

Comments
 (0)