Skip to content

Commit ce873f7

Browse files
committed
Fixed a backward-incompatible query syntax change Whoosh introduced between 1.6.1 & 1.6.2 that causes only one model to appear as though it is indexed.
1 parent 873863d commit ce873f7

File tree

2 files changed

+75
-1
lines changed

2 files changed

+75
-1
lines changed

haystack/backends/whoosh_backend.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -304,7 +304,7 @@ def search(self, query_string, sort_by=None, start_offset=0, end_offset=None,
304304
registered_models = self.build_models_list()
305305

306306
if len(registered_models) > 0:
307-
narrow_queries.add('%s:(%s)' % (DJANGO_CT, ' OR '.join(registered_models)))
307+
narrow_queries.add(' OR '.join(['%s:%s' % (DJANGO_CT, rm) for rm in registered_models]))
308308

309309
narrow_searcher = None
310310

tests/whoosh_tests/tests/whoosh_backend.py

Lines changed: 74 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,18 @@ def get_model(self):
2424
return MockModel
2525

2626

27+
class WhooshAnotherMockSearchIndex(indexes.SearchIndex):
28+
text = indexes.CharField(document=True)
29+
name = indexes.CharField(model_attr='author')
30+
pub_date = indexes.DateField(model_attr='pub_date')
31+
32+
def get_model(self):
33+
return AnotherMockModel
34+
35+
def prepare_text(self, obj):
36+
return obj.author
37+
38+
2739
class AllTypesWhooshMockSearchIndex(indexes.SearchIndex):
2840
text = indexes.CharField(document=True, use_template=True)
2941
name = indexes.CharField(model_attr='author', indexed=False)
@@ -217,6 +229,17 @@ def test_search(self):
217229
# Restore.
218230
settings.HAYSTACK_LIMIT_TO_REGISTERED_MODELS = old_limit_to_registered_models
219231

232+
def test_search_all_models(self):
233+
wamsi = WhooshAnotherMockSearchIndex()
234+
self.ui.build(indexes=[self.wmmi, wamsi])
235+
236+
self.sb.update(self.wmmi, self.sample_objs)
237+
self.sb.update(wamsi, AnotherMockModel.objects.all())
238+
239+
self.assertEqual(len(self.whoosh_search(u'*')), 25)
240+
241+
self.ui.build(indexes=[self.wmmi])
242+
220243
def test_more_like_this(self):
221244
self.sb.update(self.wmmi, self.sample_objs)
222245
self.assertEqual(len(self.whoosh_search(u'*')), 23)
@@ -710,6 +733,57 @@ def test_result_class(self):
710733
self.assertTrue(isinstance(sqs[0], SearchResult))
711734

712735

736+
class LiveWhooshMultiSearchQuerySetTestCase(TestCase):
737+
fixtures = ['bulk_data.json']
738+
739+
def setUp(self):
740+
super(LiveWhooshMultiSearchQuerySetTestCase, self).setUp()
741+
742+
# Stow.
743+
temp_path = os.path.join('tmp', 'test_whoosh_query')
744+
self.old_whoosh_path = settings.HAYSTACK_CONNECTIONS['default']['PATH']
745+
settings.HAYSTACK_CONNECTIONS['default']['PATH'] = temp_path
746+
747+
self.old_ui = connections['default'].get_unified_index()
748+
self.ui = UnifiedIndex()
749+
self.wmmi = WhooshMockSearchIndex()
750+
self.wamsi = WhooshAnotherMockSearchIndex()
751+
self.ui.build(indexes=[self.wmmi, self.wamsi])
752+
self.sb = connections['default'].get_backend()
753+
connections['default']._index = self.ui
754+
755+
self.sb.setup()
756+
self.raw_whoosh = self.sb.index
757+
self.parser = QueryParser(self.sb.content_field_name, schema=self.sb.schema)
758+
self.sb.delete_index()
759+
760+
self.wmmi.update()
761+
self.wamsi.update()
762+
763+
self.sqs = SearchQuerySet()
764+
765+
def tearDown(self):
766+
if os.path.exists(settings.HAYSTACK_CONNECTIONS['default']['PATH']):
767+
shutil.rmtree(settings.HAYSTACK_CONNECTIONS['default']['PATH'])
768+
769+
settings.HAYSTACK_CONNECTIONS['default']['PATH'] = self.old_whoosh_path
770+
connections['default']._index = self.old_ui
771+
super(LiveWhooshMultiSearchQuerySetTestCase, self).tearDown()
772+
773+
def test_searchquerysets_with_models(self):
774+
sqs = self.sqs.all()
775+
self.assertEqual(sqs.query.build_query(), u'*')
776+
self.assertEqual(len(sqs), 25)
777+
778+
sqs = self.sqs.models(MockModel)
779+
self.assertEqual(sqs.query.build_query(), u'django_ct:core.mockmodel')
780+
self.assertEqual(len(sqs), 23)
781+
782+
sqs = self.sqs.models(AnotherMockModel)
783+
self.assertEqual(sqs.query.build_query(), u'django_ct:core.anothermockmodel')
784+
self.assertEqual(len(sqs), 2)
785+
786+
713787
class LiveWhooshAutocompleteTestCase(TestCase):
714788
fixtures = ['bulk_data.json']
715789

0 commit comments

Comments
 (0)