def test_simple(self): # Create a query query = ElasticSearchQuery(models.SearchTest.objects.all(), "Hello") # Check it expected_result = {'filtered': {'filter': {'prefix': {'content_type': 'searchtests_searchtest'}}, 'query': {'multi_match': {'query': 'Hello', 'fields': ['_all', '_partials']}}}} self.assertDictEqual(query.get_query(), expected_result)
def test_custom_ordering_multiple(self): # Create a query query = ElasticSearchQuery(models.SearchTest.objects.order_by('published_date', 'live'), "Hello", order_by_relevance=False) # Check it expected_result = [{'published_date_filter': 'asc'}, {'live_filter': 'asc'}] self.assertDictEqual(query.get_sort(), expected_result)
def test_startswith_lookup(self): # Create a query query = ElasticSearchQuery(models.SearchTest.objects.filter(title__startswith="Test"), "Hello") # Check it expected_result = {'filtered': {'filter': {'and': [{'prefix': {'content_type': 'searchtests_searchtest'}}, {'prefix': {'title_filter': 'Test'}}]}, 'query': {'multi_match': {'query': 'Hello', 'fields': ['_all', '_partials']}}}} self.assertDictEqual(query.get_query(), expected_result)
def test_lte_lookup(self): # Create a query query = ElasticSearchQuery(models.SearchTest.objects.filter(published_date__lte=datetime.datetime(2014, 4, 29)), "Hello") # Check it expected_result = {'filtered': {'filter': {'and': [{'prefix': {'content_type': 'searchtests_searchtest'}}, {'range': {'published_date_filter': {'lte': '2014-04-29'}}}]}, 'query': {'multi_match': {'query': 'Hello', 'fields': ['_all', '_partials']}}}} self.assertDictEqual(query.get_query(), expected_result)
def test_fields(self): # Create a query query = ElasticSearchQuery(models.SearchTest.objects.all(), "Hello", fields=['title']) # Check it expected_result = {'filtered': {'filter': {'prefix': {'content_type': 'searchtests_searchtest'}}, 'query': {'match': {'title': 'Hello'}}}} self.assertDictEqual(query.get_query(), expected_result)
def test_multiple_fields_with_and_operator(self): # Create a query query = ElasticSearchQuery(models.SearchTest.objects.all(), "Hello", fields=['title', 'content'], operator='and') # Check it expected_result = {'filtered': {'filter': {'prefix': {'content_type': 'searchtests_searchtest'}}, 'query': {'multi_match': {'fields': ['title', 'content'], 'query': 'Hello', 'operator': 'and'}}}} self.assertDictEqual(query.get_query(), expected_result)
def test_none_query_string(self): # Create a query query = ElasticSearchQuery(models.SearchTest.objects.all(), None) # Check it expected_result = {'filtered': {'filter': {'prefix': {'content_type': 'searchtests_searchtest'}}, 'query': {'match_all': {}}}} self.assertDictEqual(query.get_query(), expected_result)
def test_negated_filter(self): # Create a query query = ElasticSearchQuery(models.SearchTest.objects.exclude(live=True), "Hello") # Check it expected_result = {'filtered': {'filter': {'and': [{'prefix': {'content_type': 'searchtests_searchtest'}}, {'not': {'term': {'live_filter': True}}}]}, 'query': {'multi_match': {'query': 'Hello', 'fields': ['_all', '_partials']}}}} self.assertDictEqual(query.get_query(), expected_result)
def test_custom_ordering_multiple(self): # Create a query query = ElasticSearchQuery( models.SearchTest.objects.order_by('published_date', 'live'), "Hello", order_by_relevance=False ) # Check it expected_result = [{'published_date_filter': 'asc'}, {'live_filter': 'asc'}] self.assertDictEqual(query.get_sort(), expected_result)
def test_simple(self): # Create a query query = ElasticSearchQuery(models.SearchTest.objects.all(), "Hello") # Check it expected_result = {'filtered': { 'filter': {'prefix': {'content_type': 'searchtests_searchtest'}}, 'query': {'multi_match': {'query': 'Hello', 'fields': ['_all', '_partials']}} }} self.assertDictEqual(query.get_query(), expected_result)
def test_none_query_string(self): # Create a query query = ElasticSearchQuery(models.SearchTest.objects.all(), None) # Check it expected_result = {'filtered': { 'filter': {'prefix': {'content_type': 'searchtests_searchtest'}}, 'query': {'match_all': {}} }} self.assertDictEqual(query.get_query(), expected_result)
def test_startswith_lookup(self): # Create a query query = ElasticSearchQuery(models.SearchTest.objects.filter(title__startswith="Test"), "Hello") # Check it expected_result = {'filtered': {'filter': {'and': [ {'prefix': {'content_type': 'searchtests_searchtest'}}, {'prefix': {'title_filter': 'Test'}} ]}, 'query': {'multi_match': {'query': 'Hello', 'fields': ['_all', '_partials']}}}} self.assertDictEqual(query.get_query(), expected_result)
def test_multiple_fields(self): # Create a query query = ElasticSearchQuery(models.SearchTest.objects.all(), "Hello", fields=['title', 'content']) # Check it expected_result = {'filtered': { 'filter': {'prefix': {'content_type': 'searchtests_searchtest'}}, 'query': {'multi_match': {'fields': ['title', 'content'], 'query': 'Hello'}} }} self.assertDictEqual(query.get_query(), expected_result)
def test_fields_with_and_operator(self): # Create a query query = ElasticSearchQuery(models.SearchTest.objects.all(), "Hello", fields=['title'], operator='and') # Check it expected_result = {'filtered': { 'filter': {'prefix': {'content_type': 'searchtests_searchtest'}}, 'query': {'match': {'title': {'query': 'Hello', 'operator': 'and'}}} }} self.assertDictEqual(query.get_query(), expected_result)
def test_negated_filter(self): # Create a query query = ElasticSearchQuery(models.SearchTest.objects.exclude(live=True), "Hello") # Check it expected_result = {'filtered': {'filter': {'and': [ {'prefix': {'content_type': 'searchtests_searchtest'}}, {'not': {'term': {'live_filter': True}}} ]}, 'query': {'multi_match': {'query': 'Hello', 'fields': ['_all', '_partials']}}}} self.assertDictEqual(query.get_query(), expected_result)
def test_or_filter(self): # Create a query query = ElasticSearchQuery(models.SearchTest.objects.filter(Q(title="Test") | Q(live=True)), "Hello") # Make sure field filters are sorted (as they can be in any order which may cause false positives) query = query.get_query() field_filters = query['filtered']['filter']['and'][1]['or'] field_filters[:] = sorted(field_filters, key=lambda f: list(f['term'].keys())[0]) # Check it expected_result = {'filtered': {'filter': {'and': [{'prefix': {'content_type': 'searchtests_searchtest'}}, {'or': [{'term': {'live_filter': True}}, {'term': {'title_filter': 'Test'}}]}]}, 'query': {'multi_match': {'query': 'Hello', 'fields': ['_all', '_partials']}}}} self.assertDictEqual(query, expected_result)
def test_lte_lookup(self): # Create a query query = ElasticSearchQuery( models.SearchTest.objects.filter(published_date__lte=datetime.datetime(2014, 4, 29)), "Hello" ) # Check it expected_result = {'filtered': {'filter': {'and': [ {'prefix': {'content_type': 'searchtests_searchtest'}}, {'range': {'published_date_filter': {'lte': '2014-04-29'}}} ]}, 'query': {'multi_match': {'query': 'Hello', 'fields': ['_all', '_partials']}}}} self.assertDictEqual(query.get_query(), expected_result)
def test_or_filter(self): # Create a query query = ElasticSearchQuery(models.SearchTest.objects.filter(Q(title="Test") | Q(live=True)), "Hello") # Make sure field filters are sorted (as they can be in any order which may cause false positives) query = query.get_query() field_filters = query['filtered']['filter']['and'][1]['or'] field_filters[:] = sorted(field_filters, key=lambda f: list(f['term'].keys())[0]) # Check it expected_result = {'filtered': {'filter': {'and': [ {'prefix': {'content_type': 'searchtests_searchtest'}}, {'or': [{'term': {'live_filter': True}}, {'term': {'title_filter': 'Test'}}]} ]}, 'query': {'multi_match': {'query': 'Hello', 'fields': ['_all', '_partials']}}}} self.assertDictEqual(query, expected_result)