Skip to content

Commit 2d1c9af

Browse files
authored
Merge pull request MongoEngine#2477 from lukasloetkolben/feature_allow_disk_use
Feature: "allow_disk_use"
2 parents 5858ea1 + 9ff5d84 commit 2d1c9af

File tree

3 files changed

+46
-0
lines changed

3 files changed

+46
-0
lines changed

mongoengine/queryset/base.py

+15
Original file line numberDiff line numberDiff line change
@@ -64,6 +64,7 @@ def __init__(self, document, collection):
6464
self._ordering = None
6565
self._snapshot = False
6666
self._timeout = True
67+
self._allow_disk_use = False
6768
self._read_preference = None
6869
self._read_concern = None
6970
self._iter = False
@@ -799,6 +800,7 @@ def _clone_into(self, new_qs):
799800
"_ordering",
800801
"_snapshot",
801802
"_timeout",
803+
"_allow_disk_use",
802804
"_read_preference",
803805
"_read_concern",
804806
"_iter",
@@ -1165,6 +1167,16 @@ def snapshot(self, enabled):
11651167
queryset._snapshot = enabled
11661168
return queryset
11671169

1170+
def allow_disk_use(self, enabled):
1171+
"""Enable or disable the use of temporary files on disk while processing a blocking sort operation.
1172+
(To store data exceeding the 100 megabyte system memory limit)
1173+
1174+
:param enabled: whether or not temporary files on disk are used
1175+
"""
1176+
queryset = self.clone()
1177+
queryset._allow_disk_use = enabled
1178+
return queryset
1179+
11681180
def timeout(self, enabled):
11691181
"""Enable or disable the default mongod timeout when querying. (no_cursor_timeout option)
11701182
@@ -1604,6 +1616,9 @@ def _cursor_args(self):
16041616
if not self._timeout:
16051617
cursor_args["no_cursor_timeout"] = True
16061618

1619+
if self._allow_disk_use:
1620+
cursor_args["allow_disk_use"] = True
1621+
16071622
if self._loaded_fields:
16081623
cursor_args[fields_name] = self._loaded_fields.as_dict()
16091624

tests/queryset/test_queryset.py

+26
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@
2121
QuerySetManager,
2222
queryset_manager,
2323
)
24+
from tests.utils import requires_mongodb_gte_44
2425

2526

2627
class db_ops_tracker(query_counter):
@@ -5656,6 +5657,31 @@ def test_no_cursor_timeout(self):
56565657
qs = self.Person.objects().timeout(False)
56575658
assert qs._cursor_args == {"no_cursor_timeout": True}
56585659

5660+
@requires_mongodb_gte_44
5661+
def test_allow_disk_use(self):
5662+
qs = self.Person.objects()
5663+
assert qs._cursor_args == {}
5664+
5665+
qs = self.Person.objects().allow_disk_use(False)
5666+
assert qs._cursor_args == {}
5667+
5668+
qs = self.Person.objects().allow_disk_use(True)
5669+
assert qs._cursor_args == {"allow_disk_use": True}
5670+
5671+
# Test if allow_disk_use changes the results
5672+
self.Person.drop_collection()
5673+
self.Person.objects.create(name="Foo", age=12)
5674+
self.Person.objects.create(name="Baz", age=17)
5675+
self.Person.objects.create(name="Bar", age=13)
5676+
5677+
qs_disk = self.Person.objects().order_by("age").allow_disk_use(True)
5678+
qs = self.Person.objects().order_by("age")
5679+
5680+
assert qs_disk.count() == qs.count()
5681+
5682+
for index in range(qs_disk.count()):
5683+
assert qs_disk[index] == qs[index]
5684+
56595685

56605686
if __name__ == "__main__":
56615687
unittest.main()

tests/utils.py

+5
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
import operator
12
import unittest
23

34
import pytest
@@ -33,6 +34,10 @@ def get_as_pymongo(doc):
3334
return doc.__class__.objects.as_pymongo().get(id=doc.id)
3435

3536

37+
def requires_mongodb_gte_44(func):
38+
return _decorated_with_ver_requirement(func, (4, 4), oper=operator.ge)
39+
40+
3641
def _decorated_with_ver_requirement(func, mongo_version_req, oper):
3742
"""Return a MongoDB version requirement decorator.
3843

0 commit comments

Comments
 (0)