Merge branch 'dev-bulkinsertsignal' of https://github.com/colinhowe/mongoengine into bulk

This commit is contained in:
Ross Lawley 2011-10-27 01:13:59 -07:00
commit 5dc998ed52
5 changed files with 65 additions and 4 deletions

View File

@ -93,6 +93,7 @@ Changes in v0.5
way the user has specified them way the user has specified them
- Fixed various errors - Fixed various errors
- Added many tests - Added many tests
- Added pre and post bulk-insert signals
Changes in v0.4 Changes in v0.4
=============== ===============

View File

@ -9,7 +9,7 @@ Signal support is provided by the excellent `blinker`_ library and
will gracefully fall back if it is not available. will gracefully fall back if it is not available.
The following document signals exist in MongoEngine and are pretty self explaintary: The following document signals exist in MongoEngine and are pretty self explanatory:
* `mongoengine.signals.pre_init` * `mongoengine.signals.pre_init`
* `mongoengine.signals.post_init` * `mongoengine.signals.post_init`
@ -17,6 +17,8 @@ The following document signals exist in MongoEngine and are pretty self explaint
* `mongoengine.signals.post_save` * `mongoengine.signals.post_save`
* `mongoengine.signals.pre_delete` * `mongoengine.signals.pre_delete`
* `mongoengine.signals.post_delete` * `mongoengine.signals.post_delete`
* `mongoengine.signals.pre_bulk_insert`
* `mongoengine.signals.post_bulk_insert`
Example usage:: Example usage::

View File

@ -1,4 +1,5 @@
from connection import _get_db from connection import _get_db
from mongoengine import signals
import pprint import pprint
import pymongo import pymongo
@ -829,15 +830,20 @@ class QuerySet(object):
raise OperationError(msg) raise OperationError(msg)
raw.append(doc.to_mongo()) raw.append(doc.to_mongo())
signals.pre_bulk_insert.send(self._document, documents=docs)
ids = self._collection.insert(raw) ids = self._collection.insert(raw)
if not load_bulk: if not load_bulk:
signals.post_bulk_insert.send(
self._document, documents=docs, loaded=False)
return return_one and ids[0] or ids return return_one and ids[0] or ids
documents = self.in_bulk(ids) documents = self.in_bulk(ids)
results = [] results = []
for obj_id in ids: for obj_id in ids:
results.append(documents.get(obj_id)) results.append(documents.get(obj_id))
signals.post_bulk_insert.send(
self._document, documents=results, loaded=True)
return return_one and results[0] or results return return_one and results[0] or results
def with_id(self, object_id): def with_id(self, object_id):

View File

@ -42,3 +42,5 @@ pre_save = _signals.signal('pre_save')
post_save = _signals.signal('post_save') post_save = _signals.signal('post_save')
pre_delete = _signals.signal('pre_delete') pre_delete = _signals.signal('pre_delete')
post_delete = _signals.signal('post_delete') post_delete = _signals.signal('post_delete')
pre_bulk_insert = _signals.signal('pre_bulk_insert')
post_bulk_insert = _signals.signal('post_bulk_insert')

View File

@ -17,6 +17,7 @@ class SignalTests(unittest.TestCase):
global signal_output global signal_output
signal_output = [] signal_output = []
fn(*args, **kwargs) fn(*args, **kwargs)
print signal_output
return signal_output return signal_output
def setUp(self): def setUp(self):
@ -56,6 +57,18 @@ class SignalTests(unittest.TestCase):
@classmethod @classmethod
def post_delete(cls, sender, document, **kwargs): def post_delete(cls, sender, document, **kwargs):
signal_output.append('post_delete signal, %s' % document) signal_output.append('post_delete signal, %s' % document)
@classmethod
def pre_bulk_insert(cls, sender, documents, **kwargs):
signal_output.append('pre_bulk_insert signal, %s' % documents)
@classmethod
def post_bulk_insert(cls, sender, documents, **kwargs):
signal_output.append('post_bulk_insert signal, %s' % documents)
if kwargs.get('loaded', False):
signal_output.append('Is loaded')
else:
signal_output.append('Not loaded')
self.Author = Author self.Author = Author
@ -104,7 +117,9 @@ class SignalTests(unittest.TestCase):
len(signals.pre_save.receivers), len(signals.pre_save.receivers),
len(signals.post_save.receivers), len(signals.post_save.receivers),
len(signals.pre_delete.receivers), len(signals.pre_delete.receivers),
len(signals.post_delete.receivers) len(signals.post_delete.receivers),
len(signals.pre_bulk_insert.receivers),
len(signals.post_bulk_insert.receivers),
) )
signals.pre_init.connect(Author.pre_init, sender=Author) signals.pre_init.connect(Author.pre_init, sender=Author)
@ -113,6 +128,8 @@ class SignalTests(unittest.TestCase):
signals.post_save.connect(Author.post_save, sender=Author) signals.post_save.connect(Author.post_save, sender=Author)
signals.pre_delete.connect(Author.pre_delete, sender=Author) signals.pre_delete.connect(Author.pre_delete, sender=Author)
signals.post_delete.connect(Author.post_delete, sender=Author) signals.post_delete.connect(Author.post_delete, sender=Author)
signals.pre_bulk_insert.connect(Author.pre_bulk_insert, sender=Author)
signals.post_bulk_insert.connect(Author.post_bulk_insert, sender=Author)
signals.pre_init.connect(Another.pre_init, sender=Another) signals.pre_init.connect(Another.pre_init, sender=Another)
signals.post_init.connect(Another.post_init, sender=Another) signals.post_init.connect(Another.post_init, sender=Another)
@ -128,6 +145,8 @@ class SignalTests(unittest.TestCase):
signals.pre_delete.disconnect(self.Author.pre_delete) signals.pre_delete.disconnect(self.Author.pre_delete)
signals.post_save.disconnect(self.Author.post_save) signals.post_save.disconnect(self.Author.post_save)
signals.pre_save.disconnect(self.Author.pre_save) signals.pre_save.disconnect(self.Author.pre_save)
signals.pre_bulk_insert.disconnect(self.Author.pre_bulk_insert)
signals.post_bulk_insert.disconnect(self.Author.post_bulk_insert)
signals.pre_init.disconnect(self.Another.pre_init) signals.pre_init.disconnect(self.Another.pre_init)
signals.post_init.disconnect(self.Another.post_init) signals.post_init.disconnect(self.Another.post_init)
@ -143,7 +162,9 @@ class SignalTests(unittest.TestCase):
len(signals.pre_save.receivers), len(signals.pre_save.receivers),
len(signals.post_save.receivers), len(signals.post_save.receivers),
len(signals.pre_delete.receivers), len(signals.pre_delete.receivers),
len(signals.post_delete.receivers) len(signals.post_delete.receivers),
len(signals.pre_bulk_insert.receivers),
len(signals.post_bulk_insert.receivers),
) )
self.assertEqual(self.pre_signals, post_signals) self.assertEqual(self.pre_signals, post_signals)
@ -154,6 +175,14 @@ class SignalTests(unittest.TestCase):
def create_author(): def create_author():
a1 = self.Author(name='Bill Shakespeare') a1 = self.Author(name='Bill Shakespeare')
def bulk_create_author_with_load():
a1 = self.Author(name='Bill Shakespeare')
self.Author.objects.insert([a1], load_bulk=True)
def bulk_create_author_without_load():
a1 = self.Author(name='Bill Shakespeare')
self.Author.objects.insert([a1], load_bulk=False)
self.assertEqual(self.get_signal_output(create_author), [ self.assertEqual(self.get_signal_output(create_author), [
"pre_init signal, Author", "pre_init signal, Author",
"{'name': 'Bill Shakespeare'}", "{'name': 'Bill Shakespeare'}",
@ -178,4 +207,25 @@ class SignalTests(unittest.TestCase):
self.assertEqual(self.get_signal_output(a1.delete), [ self.assertEqual(self.get_signal_output(a1.delete), [
'pre_delete signal, William Shakespeare', 'pre_delete signal, William Shakespeare',
'post_delete signal, William Shakespeare', 'post_delete signal, William Shakespeare',
]) ])
signal_output = self.get_signal_output(bulk_create_author_with_load)
# The output of this signal is not entirely deterministic. The reloaded
# object will have an object ID. Hence, we only check part of the output
self.assertEquals(signal_output[3],
"pre_bulk_insert signal, [<Author: Bill Shakespeare>]")
self.assertEquals(signal_output[-2:],
["post_bulk_insert signal, [<Author: Bill Shakespeare>]",
"Is loaded",])
self.assertEqual(self.get_signal_output(bulk_create_author_without_load), [
"pre_init signal, Author",
"{'name': 'Bill Shakespeare'}",
"post_init signal, Bill Shakespeare",
"pre_bulk_insert signal, [<Author: Bill Shakespeare>]",
"post_bulk_insert signal, [<Author: Bill Shakespeare>]",
"Not loaded",
])
self.Author.objects.delete()