summaryrefslogtreecommitdiff
path: root/lib
diff options
context:
space:
mode:
authorMike Bayer <mike_mp@zzzcomputing.com>2010-03-21 12:58:14 -0400
committerMike Bayer <mike_mp@zzzcomputing.com>2010-03-21 12:58:14 -0400
commite42aa19cf3293f959274d0972f9abd547783db78 (patch)
tree37d0dfe81adda69ac178e8d28e7882093a7c0801 /lib
parent1a3f424c864d1bbf782db20d0840895c8ae0f35d (diff)
downloadsqlalchemy-e42aa19cf3293f959274d0972f9abd547783db78.tar.gz
some apparent refactorings
Diffstat (limited to 'lib')
-rw-r--r--lib/sqlalchemy/orm/unitofwork.py1
-rw-r--r--lib/sqlalchemy/topological.py23
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())