Skip to content

Commit 03279e3

Browse files
committed
Ensure that when fetching the length of a result set that the whole index isn't consumed (especially on Whoosh & Xapian).
1 parent 3b473cd commit 03279e3

File tree

5 files changed

+27
-5
lines changed

5 files changed

+27
-5
lines changed

haystack/backends/__init__.py

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -396,6 +396,11 @@ def get_count(self):
396396
the results.
397397
"""
398398
if self._hit_count is None:
399+
# Limit the slice to 10 so we get a count without consuming
400+
# everything.
401+
if not self.end_offset:
402+
self.end_offset = 10
403+
399404
if self._more_like_this:
400405
# Special case for MLT.
401406
self.run_mlt()

haystack/backends/whoosh_backend.py

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -344,9 +344,6 @@ def search(self, query_string, sort_by=None, start_offset=0, end_offset=None,
344344
if narrowed_results:
345345
raw_results.filter(narrowed_results)
346346

347-
# Make sure we don't process bits we already have.
348-
# import pdb; pdb.set_trace()
349-
350347
# Determine the page.
351348
page_num = 0
352349

tests/core/tests/mocks.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -43,7 +43,7 @@ def search(self, query_string, sort_by=None, start_offset=0, end_offset=None,
4343
hits = len(self.mock_search_results)
4444
indexed_models = site.get_indexed_models()
4545

46-
sliced = self.mock_search_results[start_offset:end_offset]
46+
sliced = self.mock_search_results
4747

4848
for result in sliced:
4949
model = get_model('core', self.model_name)
@@ -57,7 +57,7 @@ def search(self, query_string, sort_by=None, start_offset=0, end_offset=None,
5757
hits -= 1
5858

5959
return {
60-
'results': results,
60+
'results': results[start_offset:end_offset],
6161
'hits': hits,
6262
}
6363

tests/core/tests/query.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -478,6 +478,7 @@ def test_load_all(self):
478478

479479
# If nothing is registered, you get nothing.
480480
haystack.site.unregister(MockModel)
481+
haystack.site.unregister(CharPKMockModel)
481482
sqs = self.msqs.load_all()
482483
self.assert_(isinstance(sqs, SearchQuerySet))
483484
self.assertEqual(len(sqs), 0)

tests/whoosh_tests/tests/whoosh_backend.py

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -580,6 +580,25 @@ def test_cache_is_full(self):
580580
fire_the_iterator_and_fill_cache = [result for result in results]
581581
self.assertEqual(results._cache_is_full(), True)
582582
self.assertEqual(len(backends.queries), 1)
583+
584+
def test_count(self):
585+
more_samples = []
586+
587+
for i in xrange(1, 50):
588+
mock = MockModel()
589+
mock.id = i
590+
mock.author = 'daniel%s' % i
591+
mock.pub_date = date(2009, 2, 25) - timedelta(days=i)
592+
more_samples.append(mock)
593+
594+
self.sb.update(self.smmi, more_samples)
595+
596+
backends.reset_search_queries()
597+
self.assertEqual(len(backends.queries), 0)
598+
results = self.sqs.all()
599+
self.assertEqual(len(results), 49)
600+
self.assertEqual(results._cache_is_full(), False)
601+
self.assertEqual(len(backends.queries), 1)
583602

584603

585604
class WhooshRoundTripSearchIndex(SearchIndex):

0 commit comments

Comments
 (0)