]> git.ipfire.org Git - thirdparty/sqlalchemy/sqlalchemy.git/commitdiff
some apparent refactorings
authorMike Bayer <mike_mp@zzzcomputing.com>
Sun, 21 Mar 2010 16:58:14 +0000 (12:58 -0400)
committerMike Bayer <mike_mp@zzzcomputing.com>
Sun, 21 Mar 2010 16:58:14 +0000 (12:58 -0400)
lib/sqlalchemy/orm/unitofwork.py
lib/sqlalchemy/topological.py

index c0a088b01f66a98c2481fc2911db7575b1c306ad..30b0b61e5ee47dc559d3ceafce019c885a65debc 100644 (file)
@@ -483,6 +483,7 @@ class UOWTask(object):
         per-mapper topological structure is found to have cycles.
         
         """
+
         dependencies = {}
         def set_processor_for_state(state, depprocessor, target_state, isdelete):
             if state not in dependencies:
index 76c0c717fd06728497deed524d8b78b47786a461..d35213f6b5afc58e6243c30dc8cdb3b2a1bdf56f 100644 (file)
@@ -172,7 +172,7 @@ def _sort(tuples, allitems, allow_cycles=False, ignore_self_cycles=False):
                 n = nodes[id0]
                 n.cycles = set([n])
             elif not ignore_self_cycles:
-                raise CircularDependencyError("Self-referential dependency detected " + repr(t))
+                raise CircularDependencyError("Self-referential dependency detected: %r" % t)
             continue
         childnode = nodes[id1]
         parentnode = nodes[id0]
@@ -207,7 +207,7 @@ def _sort(tuples, allitems, allow_cycles=False, ignore_self_cycles=False):
                 continue
             else:
                 # long cycles not allowed
-                raise CircularDependencyError("Circular dependency detected " + repr(edges) + repr(queue))
+                raise CircularDependencyError("Circular dependency detected: %r %r " % (edges, queue))
         node = queue.pop()
         if not hasattr(node, '_cyclical'):
             output.append(node)
@@ -264,35 +264,30 @@ def _organize_as_tree(nodes):
     return (head.item, [n.item for n in head.cycles or []], head.children)
 
 def _find_cycles(edges):
-    involved_in_cycles = set()
     cycles = {}
-    def traverse(node, goal=None, cycle=None):
-        if goal is None:
-            goal = node
-            cycle = []
-        elif node is goal:
-            return True
 
+    def traverse(node, cycle, goal):
         for (n, key) in edges.edges_by_parent(node):
             if key in cycle:
                 continue
-            cycle.append(key)
-            if traverse(key, goal, cycle):
+            cycle.add(key)
+            if key is goal:
                 cycset = set(cycle)
                 for x in cycle:
-                    involved_in_cycles.add(x)
                     if x in cycles:
                         existing_set = cycles[x]
-                        [existing_set.add(y) for y in cycset]
+                        existing_set.update(cycset)
                         for y in existing_set:
                             cycles[y] = existing_set
                         cycset = existing_set
                     else:
                         cycles[x] = cycset
+            else:
+                traverse(key, cycle, goal)
             cycle.pop()
 
     for parent in edges.get_parents():
-        traverse(parent)
+        traverse(parent, set(), parent)
 
     unique_cycles = set(tuple(s) for s in cycles.values())