diff options
author | Mike Bayer <mike_mp@zzzcomputing.com> | 2009-08-06 21:11:27 +0000 |
---|---|---|
committer | Mike Bayer <mike_mp@zzzcomputing.com> | 2009-08-06 21:11:27 +0000 |
commit | 8fc5005dfe3eb66a46470ad8a8c7b95fc4d6bdca (patch) | |
tree | ae9e27d12c9fbf8297bb90469509e1cb6a206242 /lib/sqlalchemy/topological.py | |
parent | 7638aa7f242c6ea3d743aa9100e32be2052546a6 (diff) | |
download | sqlalchemy-8fc5005dfe3eb66a46470ad8a8c7b95fc4d6bdca.tar.gz |
merge 0.6 series to trunk.
Diffstat (limited to 'lib/sqlalchemy/topological.py')
-rw-r--r-- | lib/sqlalchemy/topological.py | 19 |
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] |