From: Mike Bayer Date: Fri, 7 Dec 2007 17:27:21 +0000 (+0000) Subject: a little refinement to topological options, more to come X-Git-Tag: rel_0_4_2~95 X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=6f5f86ad4a1f0e208eed93c751f1b71d7cb55c17;p=thirdparty%2Fsqlalchemy%2Fsqlalchemy.git a little refinement to topological options, more to come --- diff --git a/lib/sqlalchemy/orm/unitofwork.py b/lib/sqlalchemy/orm/unitofwork.py index 457404b6f2..6854ab7bc2 100644 --- a/lib/sqlalchemy/orm/unitofwork.py +++ b/lib/sqlalchemy/orm/unitofwork.py @@ -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)) diff --git a/lib/sqlalchemy/sql/util.py b/lib/sqlalchemy/sql/util.py index 1cf0cb1b05..de5797059c 100644 --- a/lib/sqlalchemy/sql/util.py +++ b/lib/sqlalchemy/sql/util.py @@ -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: diff --git a/lib/sqlalchemy/topological.py b/lib/sqlalchemy/topological.py index ccded5d47d..258c3bf741 100644 --- a/lib/sqlalchemy/topological.py +++ b/lib/sqlalchemy/topological.py @@ -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]