diff --git a/odoo/api.py b/odoo/api.py index 688b301cf02..22b82d17147 100644 --- a/odoo/api.py +++ b/odoo/api.py @@ -955,7 +955,11 @@ class Environment(Mapping): recs_list = self.all.todo.setdefault(field, []) for i, recs in enumerate(recs_list): if recs.env == records.env: - recs_list[i] |= records + # only add records if not already in the recordset, much much + # cheaper in case recs is big and records is a singleton + # already present + if not records <= recs: + recs_list[i] |= records break else: recs_list.append(records) diff --git a/odoo/models.py b/odoo/models.py index ab6f04fe060..0ca056286dc 100644 --- a/odoo/models.py +++ b/odoo/models.py @@ -4963,6 +4963,11 @@ class BaseModel(MetaModel('DummyModel', (object,), {'_register': False})): def __le__(self, other): if not isinstance(other, BaseModel) or self._name != other._name: raise TypeError("Mixing apples and oranges: %s <= %s" % (self, other)) + # these are much cheaper checks than a proper subset check, so + # optimise for checking if a null or singleton are subsets of a + # recordset + if not self or self in other: + return True return set(self._ids) <= set(other._ids) def __gt__(self, other): @@ -4973,6 +4978,8 @@ class BaseModel(MetaModel('DummyModel', (object,), {'_register': False})): def __ge__(self, other): if not isinstance(other, BaseModel) or self._name != other._name: raise TypeError("Mixing apples and oranges: %s >= %s" % (self, other)) + if not other or other in self: + return True return set(self._ids) >= set(other._ids) def __int__(self):