|
3 | 3 |
|
4 | 4 | from pymongo.read_preferences import ReadPreference |
5 | 5 |
|
6 | | -from mongoengine import * |
7 | | -from tests.utils import MongoDBTestCase |
| 6 | +from mongoengine import Document, IntField, PointField, StringField |
| 7 | +from mongoengine.mongodb_support import ( |
| 8 | + MONGODB_36, |
| 9 | + get_mongodb_version, |
| 10 | +) |
| 11 | +from tests.utils import MongoDBTestCase, db_ops_tracker |
8 | 12 |
|
9 | 13 |
|
10 | 14 | class TestQuerysetAggregate(MongoDBTestCase): |
@@ -87,6 +91,66 @@ class Person(Document): |
87 | 91 | {"_id": p3.pk, "name": "SANDRA MARA"}, |
88 | 92 | ] |
89 | 93 |
|
| 94 | + def test_aggregation_comment(self): |
| 95 | + """Make sure adding a comment to the query gets added to the query""" |
| 96 | + mongo_ver = get_mongodb_version() |
| 97 | + |
| 98 | + class AggPerson(Document): |
| 99 | + name = StringField() |
| 100 | + |
| 101 | + AggPerson.drop_collection() |
| 102 | + |
| 103 | + pipeline = [{"$project": {"name": {"$toUpper": "$name"}}}] |
| 104 | + comment = "some_comment" |
| 105 | + with db_ops_tracker() as q: |
| 106 | + _ = list(AggPerson.objects.comment(comment).aggregate(pipeline)) |
| 107 | + query_op = q.db.system.profile.find({"ns": "mongoenginetest.agg_person"})[0] |
| 108 | + CMD_QUERY_KEY = "command" if mongo_ver >= MONGODB_36 else "query" |
| 109 | + assert query_op[CMD_QUERY_KEY]["comment"] == comment |
| 110 | + |
| 111 | + def test_aggregation_propagates_hint_collation_and_comment(self): |
| 112 | + """Make sure adding a hint/comment/collation to the query gets added to the query""" |
| 113 | + mongo_ver = get_mongodb_version() |
| 114 | + |
| 115 | + base = {"locale": "en", "strength": 2} |
| 116 | + index_name = "name_1" |
| 117 | + |
| 118 | + class AggPerson(Document): |
| 119 | + name = StringField() |
| 120 | + meta = { |
| 121 | + "indexes": [{"fields": ["name"], "name": index_name, "collation": base}] |
| 122 | + } |
| 123 | + |
| 124 | + AggPerson.drop_collection() |
| 125 | + _ = AggPerson.objects.first() |
| 126 | + |
| 127 | + pipeline = [{"$project": {"name": {"$toUpper": "$name"}}}] |
| 128 | + comment = "test_comment" |
| 129 | + |
| 130 | + with db_ops_tracker() as q: |
| 131 | + _ = list(AggPerson.objects.comment(comment).aggregate(pipeline)) |
| 132 | + query_op = q.db.system.profile.find({"ns": "mongoenginetest.agg_person"})[0] |
| 133 | + CMD_QUERY_KEY = "command" if mongo_ver >= MONGODB_36 else "query" |
| 134 | + assert "hint" not in query_op[CMD_QUERY_KEY] |
| 135 | + assert query_op[CMD_QUERY_KEY]["comment"] == comment |
| 136 | + assert "collation" not in query_op[CMD_QUERY_KEY] |
| 137 | + |
| 138 | + with db_ops_tracker() as q: |
| 139 | + _ = list(AggPerson.objects.hint(index_name).aggregate(pipeline)) |
| 140 | + query_op = q.db.system.profile.find({"ns": "mongoenginetest.agg_person"})[0] |
| 141 | + CMD_QUERY_KEY = "command" if mongo_ver >= MONGODB_36 else "query" |
| 142 | + assert query_op[CMD_QUERY_KEY]["hint"] == "name_1" |
| 143 | + assert "comment" not in query_op[CMD_QUERY_KEY] |
| 144 | + assert "collation" not in query_op[CMD_QUERY_KEY] |
| 145 | + |
| 146 | + with db_ops_tracker() as q: |
| 147 | + _ = list(AggPerson.objects.collation(base).aggregate(pipeline)) |
| 148 | + query_op = q.db.system.profile.find({"ns": "mongoenginetest.agg_person"})[0] |
| 149 | + CMD_QUERY_KEY = "command" if mongo_ver >= MONGODB_36 else "query" |
| 150 | + assert "hint" not in query_op[CMD_QUERY_KEY] |
| 151 | + assert "comment" not in query_op[CMD_QUERY_KEY] |
| 152 | + assert query_op[CMD_QUERY_KEY]["collation"] == base |
| 153 | + |
90 | 154 | def test_queryset_aggregation_with_limit(self): |
91 | 155 | class Person(Document): |
92 | 156 | name = StringField() |
|
0 commit comments