summaryrefslogtreecommitdiff
path: root/django
diff options
context:
space:
mode:
Diffstat (limited to 'django')
-rw-r--r--django/utils/tree.py41
1 files changed, 19 insertions, 22 deletions
diff --git a/django/utils/tree.py b/django/utils/tree.py
index d13883a00e..a56442c32d 100644
--- a/django/utils/tree.py
+++ b/django/utils/tree.py
@@ -88,31 +88,28 @@ class Node:
Return a node which can be used in place of data regardless if the
node other got squashed or not.
"""
- if self.connector == conn_type and data in self.children:
- return data
- if self.connector == conn_type:
- # We can reuse self.children to append or squash the node other.
- if (isinstance(data, Node) and not data.negated and
- (data.connector == conn_type or len(data) == 1)):
- # We can squash the other node's children directly into this
- # node. We are just doing (AB)(CD) == (ABCD) here, with the
- # addition that if the length of the other node is 1 the
- # connector doesn't matter. However, for the len(self) == 1
- # case we don't want to do the squashing, as it would alter
- # self.connector.
- self.children.extend(data.children)
- return self
- else:
- # We could use perhaps additional logic here to see if some
- # children could be used for pushdown here.
- self.children.append(data)
- return data
- else:
- obj = self._new_instance(self.children, self.connector,
- self.negated)
+ if self.connector != conn_type:
+ obj = self._new_instance(self.children, self.connector, self.negated)
self.connector = conn_type
self.children = [obj, data]
return data
+ elif (
+ isinstance(data, Node) and
+ not data.negated and
+ (data.connector == conn_type or len(data) == 1)
+ ):
+ # We can squash the other node's children directly into this node.
+ # We are just doing (AB)(CD) == (ABCD) here, with the addition that
+ # if the length of the other node is 1 the connector doesn't
+ # matter. However, for the len(self) == 1 case we don't want to do
+ # the squashing, as it would alter self.connector.
+ self.children.extend(data.children)
+ return self
+ else:
+ # We could use perhaps additional logic here to see if some
+ # children could be used for pushdown here.
+ self.children.append(data)
+ return data
def negate(self):
"""Negate the sense of the root connector."""