
     h                         d Z ddlmZ ddlmZmZ  G d de          Z G d d          Z G d d	          Z	 G d
 d          Z
dS )z]
Useful auxiliary data structures for query construction. Not useful outside
the SQL domain.
    )FullResultSet)INNERLOUTERc                       e Zd ZdZd ZdS )	MultiJoinz
    Used by join construction code to indicate the point at which a
    multi-valued join was attempted (if the caller wants to treat that
    exceptionally).
    c                 "    || _         || _        d S N)levelnames_with_path)self	names_pospath_with_namess      b/var/www/surfInsights/venv3-11/lib/python3.11/site-packages/django/db/models/sql/datastructures.py__init__zMultiJoin.__init__   s    
.    N)__name__
__module____qualname____doc__r    r   r   r   r   	   s-         / / / / /r   r   c                       e Zd ZdS )EmptyN)r   r   r   r   r   r   r   r      s        Dr   r   c                   \    e Zd ZdZ	 ddZd Zd Zed             Zd Z	d Z
d	 Zd
 Zd ZdS )Joina  
    Used by sql.Query and sql.SQLCompiler to generate JOIN clauses into the
    FROM entry. For example, the SQL generated could be
        LEFT OUTER JOIN "sometable" T1
        ON ("othertable"."sometable_id" = "sometable"."id")

    This class is primarily used in Query.alias_map. All entries in alias_map
    must be Join compatible by providing the following attributes and methods:
        - table_name (string)
        - table_alias (possible alias for the table, can be None)
        - join_type (can be None for those entries that aren't joined from
          anything)
        - parent_alias (which table is this join's parent, can be None similarly
          to join_type)
        - as_sql()
        - relabeled_clone()
    Nc                     || _         || _        || _        || _        |                                | _        || _        || _        || _        d S r	   )	
table_nameparent_aliastable_alias	join_typeget_joining_columns	join_cols
join_fieldnullablefiltered_relation)r   r   r   r   r   r"   r#   r$   s           r   r   zJoin.__init__-   sS     %(&" $7799$ !2r   c                    g }g }|j         }|j        j        }| j        D ]S\  }}|                     || j                  d ||          d || j                  d ||                     T| j                            | j        | j                  }	|	rE|	                    |	          \  }
}|                    d|
z             |
                    |           | j        r\	 |	                    | j                  \  }
}|                    d|
z             |
                    |           n# t          $ r Y nw xY w|s2t          | j        d| j                  }t          d|j        z            d                    |          }| j        | j        k    rdn	d| j        z  }| j        d	 || j                  |d
|d}||fS )z
        Generate the full
           LEFT OUTER JOIN sometable ON sometable.somecol = othertable.othercol, params
        clause for this join.
        .z = z(%s)fieldzaJoin generated an empty ON clause. %s did not yield either joining columns or extra restrictions.z AND   %s z ON ())quote_name_unless_aliasops
quote_namer!   appendr   r   r"   get_extra_restrictioncompileextendr$   r   getattr
ValueError	__class__joinr   r   )r   compiler
connectionjoin_conditionsparamsqnqn2lhs_colrhs_col
extra_cond	extra_sqlextra_paramsdeclared_fieldon_clause_sql	alias_strsqls                   r   as_sqlzJoin.as_sqlG   sH    -n' !% 		 		GW"" Bt())))CLLLLBt'((((CLLL    _::d/
 

  	(&.&6&6z&B&B#I|""6I#5666MM,'''! 	,,*2*:*:4;Q*R*R'	<  &&v	'9:::l++++	 !   
  	$T_gtOON9;I;ST    _55"do55BBEDDT<T 	 NNNBtIIMM	
 F{s   'D2 2
D?>D?c           	      d                        | j        | j                  }                     | j        | j                  }| j        7| j                                        }fd| j        j        D             |_        nd }|                     | j        ||| j        | j	        | j
        |          S )Nc                 <    g | ]}                     ||          S r   )get).0p
change_maps     r   
<listcomp>z(Join.relabeled_clone.<locals>.<listcomp>   s4     & & &)*
q!$$& & &r   )r$   )rI   r   r   r$   clonepathr5   r   r   r"   r#   )r   rL   new_parent_aliasnew_table_aliasr$   s    `   r   relabeled_clonezJoin.relabeled_clone   s    %>>$*;T=NOO$..)94;KLL!- $ 6 < < > >& & & &.2.D.I& & &"" !%~~ONOM/  
 
 	
r   c                 B    | j         | j        | j        | j        | j        fS r	   )r5   r   r   r"   r$   r   s    r   identityzJoin.identity   s)     NOO"
 	
r   c                 Z    t          |t                    st          S | j        |j        k    S r	   )
isinstancer   NotImplementedrU   r   others     r   __eq__zJoin.__eq__   s)    %&& 	"!!}..r   c                 *    t          | j                  S r	   hashrU   rT   s    r   __hash__zJoin.__hash__       DM"""r   c                 B    | j         d d         |j         d d         k    S )NrU   rY   s     r   equalszJoin.equals   s#    }SbS!U^CRC%888r   c                 H    |                      i           }t          |_        |S r	   )rR   r   r   r   news     r   demotezJoin.demote   s!    ""2&&
r   c                 H    |                      i           }t          |_        |S r	   )rR   r   r   rf   s     r   promotezJoin.promote   s!    ""2&&
r   r	   )r   r   r   r   r   rF   rR   propertyrU   r[   r_   rd   rh   rj   r   r   r   r   r      s         4 3 3 3 349 9 9v
 
 
( 
 
 X
/ / /
# # #9 9 9  
    r   r   c                   X    e Zd ZdZdZdZdZd Zd Zd Z	e
d             Zd Zd Zd	 ZdS )
	BaseTablez
    The BaseTable class is used for base table references in FROM clause. For
    example, the SQL "foo" in
        SELECT * FROM "foo" WHERE somecond
    could be generated by this class.
    Nc                 "    || _         || _        d S r	   )r   r   )r   r   aliass      r   r   zBaseTable.__init__   s    $ r   c                 |    | j         | j        k    rdn	d| j         z  }|                    | j                  }||z   g fS )Nr(   r)   )r   r   r,   )r   r7   r8   rD   base_sqls        r   rF   zBaseTable.as_sql   sL    "do55BBEDDT<T 	 33DODD)#R''r   c                 t    |                      | j        |                    | j        | j                            S r	   )r5   r   rI   r   )r   rL   s     r   rR   zBaseTable.relabeled_clone   s3    ~~OZ^^D,<d>NOO
 
 	
r   c                 *    | j         | j        | j        fS r	   )r5   r   r   rT   s    r   rU   zBaseTable.identity   s    ~t0@@@r   c                 Z    t          |t                    st          S | j        |j        k    S r	   )rW   rm   rX   rU   rY   s     r   r[   zBaseTable.__eq__   s)    %++ 	"!!}..r   c                 *    t          | j                  S r	   r]   rT   s    r   r_   zBaseTable.__hash__   r`   r   c                 "    | j         |j         k    S r	   rc   rY   s     r   rd   zBaseTable.equals   s    }..r   )r   r   r   r   r   r   r$   r   rF   rR   rk   rU   r[   r_   rd   r   r   r   rm   rm      s          IL! ! !( ( (
 
 

 A A XA/ / /
# # #/ / / / /r   rm   N)r   django.core.exceptionsr   django.db.models.sql.constantsr   r   	Exceptionr   r   r   rm   r   r   r   <module>rz      s     1 0 0 0 0 0 8 8 8 8 8 8 8 8
/ 
/ 
/ 
/ 
/	 
/ 
/ 
/	 	 	 	 	 	 	 	Z Z Z Z Z Z Z Zz)/ )/ )/ )/ )/ )/ )/ )/ )/ )/r   