summaryrefslogtreecommitdiff
path: root/lib/sqlalchemy/topological.py
diff options
context:
space:
mode:
authorMike Bayer <mike_mp@zzzcomputing.com>2009-08-06 21:11:27 +0000
committerMike Bayer <mike_mp@zzzcomputing.com>2009-08-06 21:11:27 +0000
commit8fc5005dfe3eb66a46470ad8a8c7b95fc4d6bdca (patch)
treeae9e27d12c9fbf8297bb90469509e1cb6a206242 /lib/sqlalchemy/topological.py
parent7638aa7f242c6ea3d743aa9100e32be2052546a6 (diff)
downloadsqlalchemy-8fc5005dfe3eb66a46470ad8a8c7b95fc4d6bdca.tar.gz
merge 0.6 series to trunk.
Diffstat (limited to 'lib/sqlalchemy/topological.py')
-rw-r--r--lib/sqlalchemy/topological.py19
1 files changed, 10 insertions, 9 deletions
diff --git a/lib/sqlalchemy/topological.py b/lib/sqlalchemy/topological.py
index f9b9ad7b3..fbdb17963 100644
--- a/lib/sqlalchemy/topological.py
+++ b/lib/sqlalchemy/topological.py
@@ -161,20 +161,21 @@ def _sort(tuples, allitems, allow_cycles=False, ignore_self_cycles=False):
edges = _EdgeCollection()
for item in list(allitems) + [t[0] for t in tuples] + [t[1] for t in tuples]:
- if id(item) not in nodes:
- node = _Node(item)
- nodes[item] = node
+ item_id = id(item)
+ if item_id not in nodes:
+ nodes[item_id] = _Node(item)
for t in tuples:
+ id0, id1 = id(t[0]), id(t[1])
if t[0] is t[1]:
if allow_cycles:
- n = nodes[t[0]]
+ n = nodes[id0]
n.cycles = set([n])
elif not ignore_self_cycles:
raise CircularDependencyError("Self-referential dependency detected " + repr(t))
continue
- childnode = nodes[t[1]]
- parentnode = nodes[t[0]]
+ childnode = nodes[id1]
+ parentnode = nodes[id0]
edges.add((parentnode, childnode))
queue = []
@@ -210,7 +211,7 @@ def _sort(tuples, allitems, allow_cycles=False, ignore_self_cycles=False):
node = queue.pop()
if not hasattr(node, '_cyclical'):
output.append(node)
- del nodes[node.item]
+ del nodes[id(node.item)]
for childnode in edges.pop_node(node):
queue.append(childnode)
return output
@@ -293,8 +294,8 @@ def _find_cycles(edges):
for parent in edges.get_parents():
traverse(parent)
- # sets are not hashable, so uniquify with id
- unique_cycles = dict((id(s), s) for s in cycles.values()).values()
+ unique_cycles = set(tuple(s) for s in cycles.values())
+
for cycle in unique_cycles:
edgecollection = [edge for edge in edges
if edge[0] in cycle and edge[1] in cycle]