diff options
| author | Mike Bayer <mike_mp@zzzcomputing.com> | 2009-05-17 21:51:40 +0000 |
|---|---|---|
| committer | Mike Bayer <mike_mp@zzzcomputing.com> | 2009-05-17 21:51:40 +0000 |
| commit | 155466aad1c5ae4b43ed167a8b6e6013f0241370 (patch) | |
| tree | 7c237401dd7f0ee68097bb3d0474dd9c33b80500 /lib/sqlalchemy/orm/identity.py | |
| parent | 2be867ffac8881a4a20ca5387063ed207ac876dc (diff) | |
| download | sqlalchemy-155466aad1c5ae4b43ed167a8b6e6013f0241370.tar.gz | |
- Removed all* O(N) scanning behavior from the flush() process,
i.e. operations that were scanning the full session,
including an extremely expensive one that was erroneously
assuming primary key values were changing when this
was not the case.
* one edge case remains which may invoke a full scan,
if an existing primary key attribute is modified
to a new value.
Diffstat (limited to 'lib/sqlalchemy/orm/identity.py')
| -rw-r--r-- | lib/sqlalchemy/orm/identity.py | 31 |
1 files changed, 16 insertions, 15 deletions
diff --git a/lib/sqlalchemy/orm/identity.py b/lib/sqlalchemy/orm/identity.py index aa041a585..dc219e1eb 100644 --- a/lib/sqlalchemy/orm/identity.py +++ b/lib/sqlalchemy/orm/identity.py @@ -12,8 +12,8 @@ from sqlalchemy.orm import attributes class IdentityMap(dict): def __init__(self): - self._mutable_attrs = {} - self.modified = False + self._mutable_attrs = set() + self._modified = set() self._wr = weakref.ref(self) def replace(self, state): @@ -34,28 +34,29 @@ class IdentityMap(dict): def _manage_incoming_state(self, state): state._instance_dict = self._wr - if state.modified: - self.modified = True + if state.modified: + self._modified.add(state) if state.manager.mutable_attributes: - self._mutable_attrs[state] = True + self._mutable_attrs.add(state) def _manage_removed_state(self, state): del state._instance_dict + self._mutable_attrs.discard(state) + self._modified.discard(state) + + def _dirty_states(self): + return self._modified.union(s for s in self._mutable_attrs if s.modified) - if state in self._mutable_attrs: - del self._mutable_attrs[state] - def check_modified(self): """return True if any InstanceStates present have been marked as 'modified'.""" - if not self.modified: - for state in list(self._mutable_attrs): - if state.check_modified(): - return True - else: - return False - else: + if self._modified: return True + else: + for state in self._mutable_attrs: + if state.modified: + return True + return False def has_key(self, key): return key in self |
