summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSergey Fedoseev <fedoseev.sergey@gmail.com>2017-08-24 03:10:00 +0500
committerTim Graham <timograham@gmail.com>2017-08-23 18:10:00 -0400
commita8bb49355698a5f7c7d25e06cad2571faa7af9a7 (patch)
tree6a9dd402e0a6fef0773ec130d6c3f7a08e981749
parent09b3e46635da8048ac94ddbf058e37ec9ef31400 (diff)
Simplified migrations.graph.Node.iterative_dfs(), ancestors(), and descendants().
-rw-r--r--django/db/migrations/graph.py38
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):
"""