summaryrefslogtreecommitdiff
path: root/tests
diff options
context:
space:
mode:
authorChris Adams <chris@improbable.org>2013-10-07 10:48:19 -0400
committerSimon Charette <charette.s@gmail.com>2013-10-07 13:10:52 -0400
commit698dd82eee1cb83f51d4cd39546461bf76976b5e (patch)
treea705df5116c60757005a8dc5bb0ca06be079beb0 /tests
parent617aceb1b4ec97b4d70f9b3071cb46a645f69f87 (diff)
Fixed #21241 -- Avoid extraneous JOINs in admin changelist search.
Diffstat (limited to 'tests')
-rw-r--r--tests/admin_changelist/tests.py50
1 files changed, 50 insertions, 0 deletions
diff --git a/tests/admin_changelist/tests.py b/tests/admin_changelist/tests.py
index f9ef079904..f63de412fd 100644
--- a/tests/admin_changelist/tests.py
+++ b/tests/admin_changelist/tests.py
@@ -643,6 +643,56 @@ class ChangeListTests(TestCase):
list(real_page_range),
)
+ def test_search_query_efficiency(self):
+ """Ensure that search queries only add one ORM filter rather than one per term"""
+ new_parent = Parent.objects.create(name='parent')
+ for i in range(200):
+ Child.objects.create(name='foo bar baz qux quux corge %s' % i,
+ parent=new_parent)
+
+ m = ParentAdmin(Parent, admin.site)
+
+ request = self.factory.get('/parent/', data={'q': 'foo bar baz'})
+
+ cl = ChangeList(request, Parent, m.list_display, m.list_display_links,
+ m.list_filter, m.date_hierarchy, m.search_fields,
+ m.list_select_related, m.list_per_page,
+ m.list_max_show_all, m.list_editable, m)
+
+ self.assertEqual(2, cl.queryset.query.count_active_tables(),
+ "ChangeList search filters should not cause duplicate JOINs")
+
+ def test_search_query_logic(self):
+ """Changelist search terms should be ANDed"""
+
+ parent1 = Parent.objects.create(name='parent 1')
+ parent2 = Parent.objects.create(name='parent 2')
+
+ Child.objects.create(name='foo bar baz', parent=parent1)
+ Child.objects.create(name='bar baz qux', parent=parent2)
+
+ m = ParentAdmin(Parent, admin.site)
+
+ request = self.factory.get('/parent/', data={'q': 'foo bar baz'})
+
+ cl = ChangeList(request, Parent, m.list_display, m.list_display_links,
+ m.list_filter, m.date_hierarchy, m.search_fields,
+ m.list_select_related, m.list_per_page,
+ m.list_max_show_all, m.list_editable, m)
+
+ cl.get_results(request)
+ self.assertListEqual(["parent 1"], list(cl.queryset.values_list("name", flat=True)))
+
+
+ request2 = self.factory.get('/parent/', data={'q': 'bar baz'})
+ cl2 = ChangeList(request2, Parent, m.list_display, m.list_display_links,
+ m.list_filter, m.date_hierarchy, m.search_fields,
+ m.list_select_related, m.list_per_page,
+ m.list_max_show_all, m.list_editable, m)
+ cl2.get_results(request2)
+ self.assertListEqual(['parent 1', 'parent 2'],
+ list(cl2.queryset.order_by("name").values_list("name", flat=True)))
+
class AdminLogNodeTestCase(TestCase):