]> git.ipfire.org Git - thirdparty/sqlalchemy/sqlalchemy.git/commitdiff
a little refinement to topological options, more to come
authorMike Bayer <mike_mp@zzzcomputing.com>
Fri, 7 Dec 2007 17:27:21 +0000 (17:27 +0000)
committerMike Bayer <mike_mp@zzzcomputing.com>
Fri, 7 Dec 2007 17:27:21 +0000 (17:27 +0000)
lib/sqlalchemy/orm/unitofwork.py
lib/sqlalchemy/sql/util.py
lib/sqlalchemy/topological.py

index 457404b6f2ee8299045fb5923f758c8d9bbe18fc..6854ab7bc2eb4d28a2be46614c14d9362b64e80f 100644 (file)
@@ -480,7 +480,7 @@ class UOWTransaction(object):
 
         # get list of base mappers
         mappers = [t.mapper for t in self.tasks.values() if t.base_task is t]
-        head = topological.QueueDependencySorter(self.dependencies, mappers).sort(allow_all_cycles=True)
+        head = topological.QueueDependencySorter(self.dependencies, mappers).sort(allow_cycles=True)
         if self._should_log_debug:
             self.logger.debug("Dependent tuples:\n" + "\n".join(["(%s->%s)" % (d[0].class_.__name__, d[1].class_.__name__) for d in self.dependencies]))
             self.logger.debug("Dependency sort:\n"+ str(head))
index 1cf0cb1b05f17f1cfec2b41733ffb86cb1b45748..de5797059c2da17bf00e5c82c02d93497d481390 100644 (file)
@@ -16,7 +16,7 @@ def sort_tables(tables, reverse=False):
     vis = TVisitor()
     for table in tables:
         vis.traverse(table)
-    sequence = topological.QueueDependencySorter( tuples, tables).sort(create_tree=False)
+    sequence = topological.QueueDependencySorter( tuples, tables).sort(ignore_self_cycles=True, create_tree=False)
     if reverse:
         return util.reversed(sequence)
     else:
index ccded5d47d57e457eb9da65aabba4166ed0b05f9..258c3bf741abb75088823b25dfb520ed30a26d68 100644 (file)
@@ -143,7 +143,7 @@ class QueueDependencySorter(object):
         self.tuples = tuples
         self.allitems = allitems
 
-    def sort(self, allow_self_cycles=True, allow_all_cycles=False, create_tree=True):
+    def sort(self, allow_cycles=False, ignore_self_cycles=False, create_tree=True):
         (tuples, allitems) = (self.tuples, self.allitems)
         #print "\n---------------------------------\n"
         #print repr([t for t in tuples])
@@ -159,12 +159,12 @@ class QueueDependencySorter(object):
 
         for t in tuples:
             if t[0] is t[1]:
-                if allow_self_cycles:
+                if allow_cycles:
                     n = nodes[id(t[0])]
                     n.cycles = util.Set([n])
-                    continue
-                else:
+                elif not ignore_self_cycles:
                     raise CircularDependencyError("Self-referential dependency detected " + repr(t))
+                continue
             childnode = nodes[id(t[1])]
             parentnode = nodes[id(t[0])]
             edges.add((parentnode, childnode))
@@ -179,7 +179,7 @@ class QueueDependencySorter(object):
             if not queue:
                 # edges remain but no edgeless nodes to remove; this indicates
                 # a cycle
-                if allow_all_cycles:
+                if allow_cycles:
                     for cycle in self._find_cycles(edges):
                         lead = cycle[0][0]
                         lead.cycles = util.Set()
@@ -207,6 +207,8 @@ class QueueDependencySorter(object):
                 queue.append(childnode)
         if create_tree:
             return self._create_batched_tree(output)
+        elif allow_cycles:
+            return output
         else:
             return [n.item for n in output]