diff -r 29f74716fd70 -r 5376aaadd16b server/hook.py --- a/server/hook.py Thu Oct 15 11:20:26 2009 +0200 +++ b/server/hook.py Mon Oct 19 15:16:41 2009 +0200 @@ -245,12 +245,12 @@ eschema = self.schema.eschema(self._cw.describe(self.eidfrom)[0]) execute = self._cw.unsafe_execute for rel in self.subject_relations: - if eschema.has_subject_relation(rel): + if rel in eschema.subjrels: execute('SET R %s P WHERE X eid %%(x)s, P eid %%(p)s, ' 'X %s R, NOT R %s P' % (self.rtype, rel, self.rtype), {'x': self.eidfrom, 'p': self.eidto}, 'x') for rel in self.object_relations: - if eschema.has_object_relation(rel): + if rel in eschema.objrels: execute('SET R %s P WHERE X eid %%(x)s, P eid %%(p)s, ' 'R %s X, NOT R %s P' % (self.rtype, rel, self.rtype), {'x': self.eidfrom, 'p': self.eidto}, 'x') @@ -269,12 +269,12 @@ eschema = self.schema.eschema(self._cw.describe(self.eidfrom)[0]) execute = self._cw.unsafe_execute for rel in self.subject_relations: - if eschema.has_subject_relation(rel): + if rel in eschema.subjrels: execute('DELETE R %s P WHERE X eid %%(x)s, P eid %%(p)s, ' 'X %s R' % (self.rtype, rel), {'x': self.eidfrom, 'p': self.eidto}, 'x') for rel in self.object_relations: - if eschema.has_object_relation(rel): + if rel in eschema.objrels: execute('DELETE R %s P WHERE X eid %%(x)s, P eid %%(p)s, ' 'R %s X' % (self.rtype, rel), {'x': self.eidfrom, 'p': self.eidto}, 'x') @@ -328,10 +328,15 @@ """return the index of the lastest instance which is not a LateOperation instance """ - for i, op in enumerate(self.session.pending_operations): + # faster by inspecting operation in reverse order for heavy transactions + i = None + for i, op in enumerate(reversed(self.session.pending_operations)): if isinstance(op, (LateOperation, SingleLastOperation)): - return i - return None + continue + return -i or None + if i is None: + return None + return -(i + 1) def handle_event(self, event): """delegate event handling to the opertaion""" @@ -395,10 +400,15 @@ """return the index of the lastest instance which is not a SingleLastOperation instance """ - for i, op in enumerate(self.session.pending_operations): + # faster by inspecting operation in reverse order for heavy transactions + i = None + for i, op in enumerate(reversed(self.session.pending_operations)): if isinstance(op, SingleLastOperation): - return i - return None + continue + return -i or None + if i is None: + return None + return -(i + 1) class SingleOperation(Operation): @@ -418,10 +428,9 @@ def equivalent_index(self, operations): """return the index of the equivalent operation if any""" - equivalents = [i for i, op in enumerate(operations) - if op.__class__ is self.__class__] - if equivalents: - return equivalents[0] + for i, op in enumerate(reversed(operations)): + if op.__class__ is self.__class__: + return -(i+1) return None