
    h                     j    d 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y)z]
Useful auxiliary data structures for query construction. Not useful outside
the SQL domain.
    )INNERLOUTERc                       e Zd ZdZd Zy)	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                      || _         || _        y N)levelnames_with_path)self	names_pospath_with_namess      f/var/www/html/ranktracker/api/venv/lib/python3.12/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y)EmptyN)r   r   r   r   r   r   r   r      s    r   r   c                   >    e Zd ZdZ	 d
dZd Zd Zd Zd Zd Z	d	 Z
y)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                     || _         || _        || _        || _        |j	                         | _        || _        || _        || _        y 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__)   sJ     %(&" $779$ !2r   c                    g }g }|j                   }|j                  j                  }| j                  D ]M  \  }}|j	                   || j
                        d ||      d || j                        d ||             O | j                  j                  |j                  j                  | j                  | j
                        }	|	r9|j                  |	      \  }
}|j	                  d|
z         |j                  |       | j                  rE|j                  | j                        \  }
}|
r%|j	                  d|
z         |j                  |       |s9t        | j                  d| j                        }t        d|j                   z        dj#                  |      }| 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querywhere_classcompileextendr#   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_sql;   s    --nn'' !% 	GW""4$$%G4##$G	$ 	 __::NN&&(8(8$:K:KM
&.&6&6z&B#I|""6I#56MM,'!!&.&6&6t7M7M&N#I|&&v	'9:l+$T__gtON9;I;S;ST   _5**doo=BEDL\L\D\	#'>>2doo3F	S`aF{r   c           	         |j                  | j                  | j                        }|j                  | j                  | j                        }| j                  T| j                  j	                         }| j                  j
                  D cg c]  }|j                  ||       c}|_        nd }| j                  | j                  ||| j                  | j                  | j                  |      S c c}w )N)r#   )getr   r   r#   clonepathr6   r   r   r!   r"   )r   
change_mapnew_parent_aliasnew_table_aliasr#   ps         r   relabeled_clonezJoin.relabeled_cloneh   s    %>>$*;*;T=N=NO$..)9)94;K;KL!!- $ 6 6 < < >DHDZDZD_D_%`qjnnQ&:%`" $~~OO-OOT]]>O  
 	
 &as   C/c                    t        || j                        xro | j                  |j                  k(  xrT | j                  |j                  k(  xr9 | j                  |j                  k(  xr | xs | j
                  |j
                  k(  S r   )
isinstancer6   r   r   r!   r#   r   otherwith_filtered_relations      r   equalszJoin.equalsu   s    udnn- ^OOu///^!3!33^ OOu///^ ('\4+A+AUE\E\+\	
r   c                 (    | j                  |d      S )NT)rU   )rV   )r   rT   s     r   __eq__zJoin.__eq__~   s    {{5{>>r   c                 >    | j                  i       }t        |_        |S r   )rP   r   r   r   news     r   demotezJoin.demote   s    ""2&
r   c                 >    | j                  i       }t        |_        |S r   )rP   r   r   rZ   s     r   promotezJoin.promote   s    ""2&
r   r   )r   r   r   r   r   rG   rP   rV   rX   r\   r^   r   r   r   r   r      s0    " :>3$+Z

?
r   r   c                   4    e Zd ZdZdZdZdZd Zd Zd Z	d Z
y)	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                      || _         || _        y r   )r   r   )r   r   aliass      r   r   zBaseTable.__init__   s    $ r   c                     | j                   | j                  k(  rdnd| j                   z  }|j                  | j                        }||z   g fS )Nr'   r(   )r   r   r+   )r   r8   r9   rE   base_sqls        r   rG   zBaseTable.as_sql   sI    **doo=BEDL\L\D\	33DOOD)#R''r   c                     | j                  | j                  |j                  | j                  | j                              S r   )r6   r   rI   r   )r   rL   s     r   rP   zBaseTable.relabeled_clone   s/    ~~dooz~~d>N>NPTP`P`/abbr   c                     t        | |j                        xr4 | j                  |j                  k(  xr | j                  |j                  k(  S r   )rR   r6   r   r   rS   s      r   rV   zBaseTable.equals   sE    tU__- 2OOu///2 1 11	
r   )r   r   r   r   r   r   r#   r   rG   rP   rV   r   r   r   r`   r`      s.     IL!(
c
r   r`   N)	r   django.db.models.sql.constantsr   r   	Exceptionr   r   r   r`   r   r   r   <module>ri      s<    9	/	 	/	 	q qh
 
r   