server/hook.py
changeset 3720 5376aaadd16b
parent 3660 7b41a6ba7400
child 3998 94cc7cad3d2d
--- 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