# get list of base mappers
mappers = [t.mapper for t in self.tasks.values() if t.base_task is t]
- head = topological.QueueDependencySorter(self.dependencies, mappers).sort(allow_all_cycles=True)
+ head = topological.QueueDependencySorter(self.dependencies, mappers).sort(allow_cycles=True)
if self._should_log_debug:
self.logger.debug("Dependent tuples:\n" + "\n".join(["(%s->%s)" % (d[0].class_.__name__, d[1].class_.__name__) for d in self.dependencies]))
self.logger.debug("Dependency sort:\n"+ str(head))
vis = TVisitor()
for table in tables:
vis.traverse(table)
- sequence = topological.QueueDependencySorter( tuples, tables).sort(create_tree=False)
+ sequence = topological.QueueDependencySorter( tuples, tables).sort(ignore_self_cycles=True, create_tree=False)
if reverse:
return util.reversed(sequence)
else:
self.tuples = tuples
self.allitems = allitems
- def sort(self, allow_self_cycles=True, allow_all_cycles=False, create_tree=True):
+ def sort(self, allow_cycles=False, ignore_self_cycles=False, create_tree=True):
(tuples, allitems) = (self.tuples, self.allitems)
#print "\n---------------------------------\n"
#print repr([t for t in tuples])
for t in tuples:
if t[0] is t[1]:
- if allow_self_cycles:
+ if allow_cycles:
n = nodes[id(t[0])]
n.cycles = util.Set([n])
- continue
- else:
+ elif not ignore_self_cycles:
raise CircularDependencyError("Self-referential dependency detected " + repr(t))
+ continue
childnode = nodes[id(t[1])]
parentnode = nodes[id(t[0])]
edges.add((parentnode, childnode))
if not queue:
# edges remain but no edgeless nodes to remove; this indicates
# a cycle
- if allow_all_cycles:
+ if allow_cycles:
for cycle in self._find_cycles(edges):
lead = cycle[0][0]
lead.cycles = util.Set()
queue.append(childnode)
if create_tree:
return self._create_batched_tree(output)
+ elif allow_cycles:
+ return output
else:
return [n.item for n in output]