diff options
| author | Mike Bayer <mike_mp@zzzcomputing.com> | 2010-03-30 18:15:02 -0400 |
|---|---|---|
| committer | Mike Bayer <mike_mp@zzzcomputing.com> | 2010-03-30 18:15:02 -0400 |
| commit | 00738b252c280111dafc8a034eade1507c1dddd8 (patch) | |
| tree | 84250759b0e653e7b72278b649ccc00ce3d074a7 /lib/sqlalchemy/topological.py | |
| parent | 62d6bf4cc33171ac21cd9b4d52701d6af39cfb42 (diff) | |
| parent | 4cbe117eb2feb7cff28c66d849d3a0613448fdce (diff) | |
| download | sqlalchemy-00738b252c280111dafc8a034eade1507c1dddd8.tar.gz | |
merge trunk. Re-instating topological._find_cycles for the moment
Diffstat (limited to 'lib/sqlalchemy/topological.py')
| -rw-r--r-- | lib/sqlalchemy/topological.py | 33 |
1 files changed, 33 insertions, 0 deletions
diff --git a/lib/sqlalchemy/topological.py b/lib/sqlalchemy/topological.py index 3f2ff6399..324995889 100644 --- a/lib/sqlalchemy/topological.py +++ b/lib/sqlalchemy/topological.py @@ -141,3 +141,36 @@ def sort(tuples, allitems): queue.append(childnode) return output + +def _find_cycles(edges): + cycles = {} + + def traverse(node, cycle, goal): + for (n, key) in edges.edges_by_parent(node): + if key in cycle: + continue + cycle.add(key) + if key is goal: + cycset = set(cycle) + for x in cycle: + if x in cycles: + existing_set = cycles[x] + 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, set(), parent) + + 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] + yield edgecollection |
