Skip to content

Commit 6117bae

Browse files
author
Xin Dong
committed
- evaluate() should return False for empty query
- Before insert the document, sort its _id field if that's a dictionary, which is the behavior of DocLayer.
1 parent ed47ab6 commit 6117bae

File tree

2 files changed

+17
-9
lines changed

2 files changed

+17
-9
lines changed

test/correctness/mongo_model.py

Lines changed: 10 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -529,9 +529,10 @@ def insert(self, input):
529529
oldData = deepcopy(self.data)
530530
try:
531531
if isinstance(input, OrderedDict):
532-
self._insert(input)
532+
self._insert(sorte_id_field(input))
533533
elif isinstance(input, list):
534534
all_ids = set()
535+
input = map(sorte_id_field, input)
535536
for i in input:
536537
if '_id' in i:
537538
if not self.options.object_field_order_matters and isinstance(i['_id'], HashableOrderedDict):
@@ -824,7 +825,7 @@ def process_update_operator_pop(self, key, update_expression):
824825
def process_update_operator_pull_all(self, key, update_expression):
825826
# print "Update Operator: $pullAll ", update_operator, update
826827
for k, v in update_expression.iteritems():
827-
# print "Inc: key: ", k, " value: ", v
828+
# print "pullAll: key: ", k, " value: ", v
828829
if k in self.data[key]:
829830
if isinstance(self.data[key][k], list):
830831
if len(self.data[key][k]) > 0:
@@ -835,7 +836,9 @@ def process_update_operator_pull_all(self, key, update_expression):
835836

836837
def evaluate(self, query, document):
837838
if len(query) == 0:
838-
return True # match empty query, since coll.find({}) returns all docs
839+
# If we made it here, the evaluate function must NOT be called from the `find` function, and thus
840+
# we can return false. Note in find() function, an empty query means maches all documents.
841+
return False
839842
acc = True
840843
for field in query.keys():
841844
if field == '_id':
@@ -861,10 +864,10 @@ def process_update_operator_pull(self, key, update_expression):
861864
if self.evaluate(v, item):
862865
# print "item match0!, remove: ", item
863866
self.data[key][k].remove(item)
864-
elif isinstance(v, list):
865-
if item in v:
866-
# print "item match1!, remove: ", item
867-
self.data[key][k].remove(item)
867+
elif isinstance(v, list):
868+
if item in v:
869+
# print "item match1!, remove: ", item
870+
self.data[key][k].remove(item)
868871
else:
869872
self.data[key][k] = [x for x in self.data[key][k] if x != v]
870873
else:
@@ -1146,10 +1149,8 @@ def update(self, query, update, upsert, multi):
11461149
if not index.inError:
11471150
index.validate_and_build_entry(self.data.values())
11481151
except MongoModelException as e:
1149-
# print "*********************** Reseting update due to {}".format(e)
11501152
self.data = old_data
11511153
raise e
1152-
11531154
# need to create a new doc
11541155
if upsert and not any:
11551156
n += 1

test/correctness/util.py

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -407,6 +407,13 @@ def mongo_sort_list_by_fields_list(array, field_name_list):
407407
# print 'field_name_map:', field_name_map
408408
return mongo_sort_list_by_fields(array, field_name_map)
409409

410+
def sorte_id_field(doc):
411+
if isinstance(doc['_id'], dict):
412+
od = HashableOrderedDict()
413+
for k,v in sorted(doc['_id'].items(), key=lambda kv: kv[0]):
414+
od[k] = v
415+
doc['_id'] = od
416+
return doc
410417

411418
def has_object(str_field, doc):
412419
if type(doc) in [dict, OrderedDict, HashableOrderedDict] and str_field in doc:

0 commit comments

Comments
 (0)