o
    {,h*                     @   s*   d Z ddlZddlmZ G dd dZdS )zT
A class for storing a tree graph. Primarily used for filter constructs in the
ORM.
    N)make_hashablec                   @   s   e Zd ZdZdZdddZedddZd	d
 Zdd Z	dd Z
e
Zdd Zdd Zdd Zdd Zdd Zdd Zdd Zdd ZdS ) Nodez
    A single internal node in the tree graph. A Node should be viewed as a
    connection (the root) with the children being either leaf nodes or other
    Node instances.
    DEFAULTNFc                 C   s,   |r|dd ng | _ |p| j| _|| _dS )z@Construct a new Node. If no connector is given, use the default.N)childrendefault	connectornegated)selfr   r   r    r
   G/var/www/html/rh/venv/lib/python3.10/site-packages/django/utils/tree.py__init__   s   
zNode.__init__c                 C   s   t ||p| j|}| |_|S )a  
        Create a new instance using Node() instead of __init__() as some
        subclasses, e.g. django.db.models.query_utils.Q, may implement a custom
        __init__() with a signature that conflicts with the one defined in
        Node.__init__().
        )r   r   	__class__)clsr   r   r   objr
   r
   r   create   s   zNode.createc                 C   s.   | j rdnd}|| jddd | jD f S )Nz(NOT (%s: %s))z(%s: %s)z, c                 s   s    | ]}t |V  qd S N)str).0cr
   r
   r   	<genexpr>*   s    zNode.__str__.<locals>.<genexpr>)r   r   joinr   )r	   templater
   r
   r   __str__(   s    zNode.__str__c                 C   s   d| j j| f S )Nz<%s: %s>)r   __name__r	   r
   r
   r   __repr__,   s   zNode.__repr__c                 C   s   | j | j| jd}| j|_|S N)r   r   )r   r   r   r   )r	   r   r
   r
   r   __copy__/   s   zNode.__copy__c                 C   s&   | j | j| jd}t| j||_|S r   )r   r   r   copydeepcopyr   )r	   memodictr   r
   r
   r   __deepcopy__6   s   zNode.__deepcopy__c                 C   
   t | jS )z,Return the number of children this node has.)lenr   r   r
   r
   r   __len__;      
zNode.__len__c                 C   r"   )z-Return whether or not this node has children.)boolr   r   r
   r
   r   __bool__?   r%   zNode.__bool__c                 C   s
   || j v S )z:Return True if 'other' is a direct child of this instance.)r   r	   otherr
   r
   r   __contains__C   r%   zNode.__contains__c                 C   s0   | j |j ko| j|jko| j|jko| j|jkS r   )r   r   r   r   r(   r
   r
   r   __eq__G   s   


zNode.__eq__c                 C   s    t | j| j| jgt| jR S r   )hashr   r   r   r   r   r   r
   r
   r   __hash__O   s   zNode.__hash__c                 C   sn   | j |kr|  }|| _ ||g| _|S t|tr/|js/|j |ks&t|dkr/| j|j | S | j| |S )a  
        Combine this tree and the data represented by data using the
        connector conn_type. The combine is done by squashing the node other
        away if possible.

        This tree (self) will never be pushed to a child node of the
        combined tree, nor will the connector or negated properties change.

        Return a node which can be used in place of data regardless if the
        node other got squashed or not.
           )	r   r   r   
isinstancer   r   r#   extendappend)r	   data	conn_typer   r
   r
   r   addY   s   

zNode.addc                 C   s   | j  | _ dS )z'Negate the sense of the root connector.N)r   r   r
   r
   r   negate|   s   zNode.negate)NNF)r   
__module____qualname____doc__r   r   classmethodr   r   r   r   r   r!   r$   r'   r*   r+   r-   r4   r5   r
   r
   r
   r   r      s$    

#r   )r8   r   django.utils.hashabler   r   r
   r
   r
   r   <module>   s    