diff options
| author | Mike Bayer <mike_mp@zzzcomputing.com> | 2010-03-21 12:58:14 -0400 |
|---|---|---|
| committer | Mike Bayer <mike_mp@zzzcomputing.com> | 2010-03-21 12:58:14 -0400 |
| commit | e42aa19cf3293f959274d0972f9abd547783db78 (patch) | |
| tree | 37d0dfe81adda69ac178e8d28e7882093a7c0801 /lib | |
| parent | 1a3f424c864d1bbf782db20d0840895c8ae0f35d (diff) | |
| download | sqlalchemy-e42aa19cf3293f959274d0972f9abd547783db78.tar.gz | |
some apparent refactorings
Diffstat (limited to 'lib')
| -rw-r--r-- | lib/sqlalchemy/orm/unitofwork.py | 1 | ||||
| -rw-r--r-- | lib/sqlalchemy/topological.py | 23 |
2 files changed, 10 insertions, 14 deletions
diff --git a/lib/sqlalchemy/orm/unitofwork.py b/lib/sqlalchemy/orm/unitofwork.py index c0a088b01..30b0b61e5 100644 --- a/lib/sqlalchemy/orm/unitofwork.py +++ b/lib/sqlalchemy/orm/unitofwork.py @@ -483,6 +483,7 @@ class UOWTask(object): per-mapper topological structure is found to have cycles. """ + dependencies = {} def set_processor_for_state(state, depprocessor, target_state, isdelete): if state not in dependencies: diff --git a/lib/sqlalchemy/topological.py b/lib/sqlalchemy/topological.py index 76c0c717f..d35213f6b 100644 --- a/lib/sqlalchemy/topological.py +++ b/lib/sqlalchemy/topological.py @@ -172,7 +172,7 @@ def _sort(tuples, allitems, allow_cycles=False, ignore_self_cycles=False): n = nodes[id0] n.cycles = set([n]) elif not ignore_self_cycles: - raise CircularDependencyError("Self-referential dependency detected " + repr(t)) + raise CircularDependencyError("Self-referential dependency detected: %r" % t) continue childnode = nodes[id1] parentnode = nodes[id0] @@ -207,7 +207,7 @@ def _sort(tuples, allitems, allow_cycles=False, ignore_self_cycles=False): continue else: # long cycles not allowed - raise CircularDependencyError("Circular dependency detected " + repr(edges) + repr(queue)) + raise CircularDependencyError("Circular dependency detected: %r %r " % (edges, queue)) node = queue.pop() if not hasattr(node, '_cyclical'): output.append(node) @@ -264,35 +264,30 @@ def _organize_as_tree(nodes): return (head.item, [n.item for n in head.cycles or []], head.children) def _find_cycles(edges): - involved_in_cycles = set() cycles = {} - def traverse(node, goal=None, cycle=None): - if goal is None: - goal = node - cycle = [] - elif node is goal: - return True + def traverse(node, cycle, goal): for (n, key) in edges.edges_by_parent(node): if key in cycle: continue - cycle.append(key) - if traverse(key, goal, cycle): + cycle.add(key) + if key is goal: cycset = set(cycle) for x in cycle: - involved_in_cycles.add(x) if x in cycles: existing_set = cycles[x] - [existing_set.add(y) for y in cycset] + 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) + traverse(parent, set(), parent) unique_cycles = set(tuple(s) for s in cycles.values()) |
