From 36eedc987c1ae7ee03de1392c8550c354f6d3803 Mon Sep 17 00:00:00 2001 From: mrigal Date: Thu, 9 Apr 2015 03:45:25 +0200 Subject: [PATCH] adapted index test to new explain output in pymongo3 and added comment to a possible pymongo3 bug --- tests/document/indexes.py | 27 ++++++++++++++++++++++++--- 1 file changed, 24 insertions(+), 3 deletions(-) diff --git a/tests/document/indexes.py b/tests/document/indexes.py index 6256cde3..b1ea3707 100644 --- a/tests/document/indexes.py +++ b/tests/document/indexes.py @@ -432,6 +432,7 @@ class IndexesTest(unittest.TestCase): class Test(Document): a = IntField() + b = IntField() meta = { 'indexes': ['a'], @@ -446,13 +447,30 @@ class IndexesTest(unittest.TestCase): # Need to be explicit about covered indexes as mongoDB doesn't know if # the documents returned might have more keys in that here. query_plan = Test.objects(id=obj.id).exclude('a').explain() - self.assertFalse(query_plan['indexOnly']) + if pymongo.version_tuple[0] < 3: + self.assertFalse(query_plan['indexOnly']) + else: + self.assertEqual(query_plan.get('queryPlanner').get('winningPlan').get('inputStage').get('stage'), 'IDHACK') query_plan = Test.objects(id=obj.id).only('id').explain() - self.assertTrue(query_plan['indexOnly']) + if pymongo.version_tuple[0] < 3: + self.assertTrue(query_plan['indexOnly']) + else: + self.assertEqual(query_plan.get('queryPlanner').get('winningPlan').get('inputStage').get('stage'), 'IDHACK') query_plan = Test.objects(a=1).only('a').exclude('id').explain() - self.assertTrue(query_plan['indexOnly']) + if pymongo.version_tuple[0] < 3: + self.assertTrue(query_plan['indexOnly']) + else: + self.assertEqual(query_plan.get('queryPlanner').get('winningPlan').get('inputStage').get('stage'), 'IXSCAN') + self.assertEqual(query_plan.get('queryPlanner').get('winningPlan').get('stage'), 'PROJECTION') + + query_plan = Test.objects(a=1).explain() + if pymongo.version_tuple[0] < 3: + self.assertFalse(query_plan['indexOnly']) + else: + self.assertEqual(query_plan.get('queryPlanner').get('winningPlan').get('inputStage').get('stage'), 'IXSCAN') + self.assertEqual(query_plan.get('queryPlanner').get('winningPlan').get('stage'), 'FETCH') def test_index_on_id(self): @@ -491,6 +509,9 @@ class IndexesTest(unittest.TestCase): self.assertEqual(BlogPost.objects.count(), 10) self.assertEqual(BlogPost.objects.hint().count(), 10) + # here we seem to have find a bug in PyMongo 3. + # The cursor first makes a SON out of the list of tuples + # Then later reuses it and wonders why is it not a list of tuples self.assertEqual(BlogPost.objects.hint([('tags', 1)]).count(), 10) self.assertEqual(BlogPost.objects.hint([('ZZ', 1)]).count(), 10)