o
    ˜¨Êh  ã                   @   sR   d Z ddlmZmZ G dd„ deƒZG dd„ dƒZG dd„ dƒZG d	d
„ d
ƒZdS )z]
Useful auxiliary data structures for query construction. Not useful outside
the SQL domain.
é    )ÚINNERÚLOUTERc                   @   s   e Zd ZdZd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                 C   ó   || _ || _d S ©N)ÚlevelÚnames_with_path)ÚselfÚ	names_posÚpath_with_names© r   úU/var/www/html/env/lib/python3.10/site-packages/django/db/models/sql/datastructures.pyÚ__init__   s   
zMultiJoin.__init__N)Ú__name__Ú
__module__Ú__qualname__Ú__doc__r   r   r   r   r   r      s    r   c                   @   s   e Zd ZdS )ÚEmptyN)r   r   r   r   r   r   r   r      s    r   c                   @   s`   e Zd ZdZ	ddd„Zdd„ Zdd„ Zed	d
„ ƒZdd„ Z	dd„ Z
dd„ Zdd„ Zd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                 C   s8   || _ || _|| _|| _| ¡ | _|| _|| _|| _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   r   r   r   r   ,   s   

zJoin.__init__c              	   C   s$  g }g }|j }|jj}| jD ]\}}| d|| jƒ||ƒ|| jƒ||ƒf ¡ q| j | j| j¡}	|	rF| 	|	¡\}
}| d|
 ¡ | 
|¡ | jr_| 	| j¡\}
}|
r_| d|
 ¡ | 
|¡ |spt| jd| jƒ}td|j ƒ‚d |¡}| j| jkr}dnd| j }d| j|| jƒ||f }||fS )	z™
        Generate the full
           LEFT OUTER JOIN sometable ON sometable.somecol = othertable.othercol, params
        clause for this join.
        z%s.%s = %s.%sz(%s)ÚfieldzaJoin generated an empty ON clause. %s did not yield either joining columns or extra restrictions.z AND Ú ú %sz%s %s%s ON (%s))Úquote_name_unless_aliasÚopsÚ
quote_namer   Úappendr   r   r   Úget_extra_restrictionÚ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Úsqlr   r   r   Úas_sqlF   sV   üÿÿÿ

ÿÿ
ÿüzJoin.as_sqlc              	      sr   ˆ   | j| j¡}ˆ   | j| j¡}| jd ur'| j ¡ }‡ fdd„| jjD ƒ|_nd }| j| j||| j| j	| j
|d�S )Nc                    s   g | ]}ˆ   ||¡‘qS r   )Úget)Ú.0Úp©Ú
change_mapr   r   Ú
<listcomp>ƒ   s    ÿz(Join.relabeled_clone.<locals>.<listcomp>)r   )r<   r   r   r   ÚcloneÚpathr*   r   r   r   r   )r	   r@   Únew_parent_aliasÚnew_table_aliasr   r   r?   r   Úrelabeled_clone~   s"   



ÿùzJoin.relabeled_clonec                 C   s   | j | j| j| j| jfS r   )r*   r   r   r   r   ©r	   r   r   r   Úidentity’   s   ûzJoin.identityc                 C   ó   t |tƒstS | j|jkS r   )Ú
isinstancer   ÚNotImplementedrH   ©r	   Úotherr   r   r   Ú__eq__œ   ó   
zJoin.__eq__c                 C   ó
   t | jƒS r   ©ÚhashrH   rG   r   r   r   Ú__hash__¡   ó   
zJoin.__hash__c                 C   s   | j d d… |j d d… kS )Néÿÿÿÿ©rH   rL   r   r   r   Úequals¤   s   zJoin.equalsc                 C   ó   |   i ¡}t|_|S r   )rF   r   r   ©r	   Únewr   r   r   Údemote¨   ó   
zJoin.demotec                 C   rX   r   )rF   r   r   rY   r   r   r   Úpromote­   r\   zJoin.promoter   )r   r   r   r   r   r;   rF   ÚpropertyrH   rN   rS   rW   r[   r]   r   r   r   r   r      s    
ø8
	r   c                   @   sX   e Zd ZdZdZdZdZdd„ Zdd„ Zdd„ Z	e
d	d
„ ƒZdd„ Zdd„ Zd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                 C   r   r   )r   r   )r	   r   Úaliasr   r   r   r   ¿   s   
zBaseTable.__init__c                 C   s2   | j | jkrdnd| j  }| | j¡}|| g fS )Nr   r    )r   r   r!   )r	   r,   r-   r9   Úbase_sqlr   r   r   r;   Ã   s   ÿzBaseTable.as_sqlc                 C   s   |   | j| | j| j¡¡S r   )r*   r   r<   r   )r	   r@   r   r   r   rF   Ê   s   ÿzBaseTable.relabeled_clonec                 C   s   | j | j| jfS r   )r*   r   r   rG   r   r   r   rH   Ï   s   zBaseTable.identityc                 C   rI   r   )rJ   r_   rK   rH   rL   r   r   r   rN   Ó   rO   zBaseTable.__eq__c                 C   rP   r   rQ   rG   r   r   r   rS   Ø   rT   zBaseTable.__hash__c                 C   s   | j |j kS r   rV   rL   r   r   r   rW   Û   s   zBaseTable.equals)r   r   r   r   r   r   r   r   r;   rF   r^   rH   rN   rS   rW   r   r   r   r   r_   ³   s    
r_   N)	r   Údjango.db.models.sql.constantsr   r   Ú	Exceptionr   r   r   r_   r   r   r   r   Ú<module>   s     