Skip to content

Commit 7adc1a4

Browse files
committed
Optimize ElasticSearch backend (closes django-haystack#1590)
Thanks to @klass-ivan for the patch
2 parents 514023e + e25d605 commit 7adc1a4

File tree

2 files changed

+28
-2
lines changed

2 files changed

+28
-2
lines changed

haystack/backends/elasticsearch_backend.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -625,8 +625,8 @@ def from_timestamp(tm):
625625
model = haystack_get_model(app_label, model_name)
626626

627627
if model and model in indexed_models:
628+
index = source and unified_index.get_index(model)
628629
for key, value in source.items():
629-
index = unified_index.get_index(model)
630630
string_key = str(key)
631631

632632
if string_key in index.fields and hasattr(index.fields[string_key], 'convert'):

test_haystack/elasticsearch_tests/test_elasticsearch_backend.py

Lines changed: 27 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
import logging as std_logging
66
import operator
77
import unittest
8+
from contextlib import contextmanager
89
from decimal import Decimal
910

1011
import elasticsearch
@@ -229,6 +230,24 @@ def test_kwargs_are_passed_on(self):
229230
self.assertEqual(backend.conn.transport.max_retries, 42)
230231

231232

233+
class ElasticSearchMockUnifiedIndex(UnifiedIndex):
234+
235+
spy_args = None
236+
237+
def get_index(self, model_klass):
238+
if self.spy_args is not None:
239+
self.spy_args.setdefault('get_index', []).append(model_klass)
240+
return super(ElasticSearchMockUnifiedIndex, self).get_index(model_klass)
241+
242+
@contextmanager
243+
def spy(self):
244+
try:
245+
self.spy_args = {}
246+
yield self.spy_args
247+
finally:
248+
self.spy_args = None
249+
250+
232251
class ElasticsearchSearchBackendTestCase(TestCase):
233252
def setUp(self):
234253
super(ElasticsearchSearchBackendTestCase, self).setUp()
@@ -239,7 +258,7 @@ def setUp(self):
239258

240259
# Stow.
241260
self.old_ui = connections['elasticsearch'].get_unified_index()
242-
self.ui = UnifiedIndex()
261+
self.ui = ElasticSearchMockUnifiedIndex()
243262
self.smmi = ElasticsearchMockSearchIndex()
244263
self.smmidni = ElasticsearchMockSearchIndexWithSkipDocument()
245264
self.smtmmi = ElasticsearchMaintainTypeMockSearchIndex()
@@ -412,6 +431,13 @@ def test_clear(self):
412431
self.sb.clear([AnotherMockModel, MockModel])
413432
self.assertEqual(self.raw_search('*:*').get('hits', {}).get('total', 0), 0)
414433

434+
def test_results_ask_for_index_per_entry(self):
435+
# Test that index class is obtained per result entry, not per every entry field
436+
self.sb.update(self.smmi, self.sample_objs)
437+
with self.ui.spy() as spy:
438+
self.sb.search('*:*', limit_to_registered_models=False)
439+
self.assertEqual(len(spy.get('get_index', [])), len(self.sample_objs))
440+
415441
def test_search(self):
416442
self.sb.update(self.smmi, self.sample_objs)
417443
self.assertEqual(self.raw_search('*:*')['hits']['total'], 3)

0 commit comments

Comments
 (0)