diff options
| author | Sergey Fedoseev <fedoseev.sergey@gmail.com> | 2017-08-24 03:10:00 +0500 |
|---|---|---|
| committer | Tim Graham <timograham@gmail.com> | 2017-08-23 18:10:00 -0400 |
| commit | a8bb49355698a5f7c7d25e06cad2571faa7af9a7 (patch) | |
| tree | 6a9dd402e0a6fef0773ec130d6c3f7a08e981749 | |
| parent | 09b3e46635da8048ac94ddbf058e37ec9ef31400 (diff) | |
Simplified migrations.graph.Node.iterative_dfs(), ancestors(), and descendants().
| -rw-r--r-- | django/db/migrations/graph.py | 38 |
1 files changed, 14 insertions, 24 deletions
diff --git a/django/db/migrations/graph.py b/django/db/migrations/graph.py index a7bfe17aa8..687a9b3905 100644 --- a/django/db/migrations/graph.py +++ b/django/db/migrations/graph.py @@ -1,5 +1,4 @@ import warnings -from collections import deque from functools import total_ordering from django.db.migrations.state import ProjectState @@ -56,9 +55,10 @@ class Node: # Use self.key instead of self to speed up the frequent hashing # when constructing an OrderedSet. if '_ancestors' not in self.__dict__: - ancestors = deque([self.key]) - for parent in sorted(self.parents): - ancestors.extendleft(reversed(parent.ancestors())) + ancestors = [] + for parent in sorted(self.parents, reverse=True): + ancestors += parent.ancestors() + ancestors.append(self.key) self.__dict__['_ancestors'] = list(OrderedSet(ancestors)) return self.__dict__['_ancestors'] @@ -68,9 +68,10 @@ class Node: # Use self.key instead of self to speed up the frequent hashing # when constructing an OrderedSet. if '_descendants' not in self.__dict__: - descendants = deque([self.key]) - for child in sorted(self.children): - descendants.extendleft(reversed(child.descendants())) + descendants = [] + for child in sorted(self.children, reverse=True): + descendants += child.descendants() + descendants.append(self.key) self.__dict__['_descendants'] = list(OrderedSet(descendants)) return self.__dict__['_descendants'] @@ -288,24 +289,13 @@ class MigrationGraph: def iterative_dfs(self, start, forwards=True): """Iterative depth-first search for finding dependencies.""" - visited = deque() - visited.append(start) - if forwards: - stack = deque(sorted(start.parents)) - else: - stack = deque(sorted(start.children)) + visited = [] + stack = [start] while stack: - node = stack.popleft() - visited.appendleft(node) - if forwards: - children = sorted(node.parents, reverse=True) - else: - children = sorted(node.children, reverse=True) - # reverse sorting is needed because prepending using deque.extendleft - # also effectively reverses values - stack.extendleft(children) - - return list(OrderedSet(visited)) + node = stack.pop() + visited.append(node) + stack += sorted(node.parents if forwards else node.children) + return list(OrderedSet(reversed(visited))) def root_nodes(self, app=None): """ |
