3
(h                 @   sh   d Z ddlmZmZ G dd deZG dd deZG dd deZG d	d
 d
eZ	G dd de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S )EmptyResultSetN)__name__
__module____qualname__ r   r   G/tmp/pip-install-q3hcpn_q/Django/django/db/models/sql/datastructures.pyr      s   r   c               @   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   s   || _ || _d S )N)levelZnames_with_path)selfZ	names_posZpath_with_namesr   r   r	   __init__   s    zMultiJoin.__init__N)r   r   r   __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 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()
    c             C   s2   || _ || _|| _|| _|j | _|| _|| _d S )N)
table_nameparent_aliastable_alias	join_typeZget_joining_columns	join_cols
join_fieldnullable)r   r   r   r   r   r   r   r   r   r	   r   -   s    
zJoin.__init__c             C   s  g }g }|j }|jj}xDt| jD ]6\}\}}	|jd|| j|||| j||	f  q"W | jj	|j
j| j| j}
|
r|j|
\}}|jd|  |j| |st| jd| j}td|j dj|}| j| jkrdnd| j }d| j|| j||f }||fS )	z
        Generates 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  z %sz%s %s%s ON (%s))quote_name_unless_aliasopsZ
quote_name	enumerater   appendr   r   r   Zget_extra_restrictionqueryZwhere_classcompileextendgetattr
ValueError	__class__joinr   r   )r   compiler
connectionZjoin_conditionsparamsqnZqn2indexZlhs_colZrhs_colZ
extra_condZ	extra_sqlZextra_paramsZdeclared_fieldZon_clause_sql	alias_strZsqlr   r   r	   as_sql>   s2    


zJoin.as_sqlc             C   s<   |j | j| j}|j | j| j}| j| j||| j| j| jS )N)getr   r   r#   r   r   r   r   )r   
change_mapZnew_parent_aliasZnew_table_aliasr   r   r	   relabeled_cloneg   s
    zJoin.relabeled_clonec             C   s4   t || jr0| j|jko.| j|jko.| j|jkS dS )NF)
isinstancer#   r   r   r   )r   otherr   r   r	   __eq__n   s
    zJoin.__eq__c             C   s   | j i }t|_|S )N)r.   r   r   )r   newr   r   r	   demotew   s    
zJoin.demotec             C   s   | j i }t|_|S )N)r.   r   r   )r   r2   r   r   r	   promote|   s    
zJoin.promoteN)
r   r   r   r   r   r+   r.   r1   r3   r4   r   r   r   r	   r      s   )	r   c               @   s0   e Zd ZdZdZ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   s   || _ || _d S )N)r   r   )r   r   aliasr   r   r	   r      s    zBaseTable.__init__c             C   s2   | j | jkrdnd| j  }|j| j}|| g fS )Nr   z %s)r   r   r   )r   r%   r&   r*   Zbase_sqlr   r   r	   r+      s    zBaseTable.as_sqlc             C   s   | j | j|j| j| jS )N)r#   r   r,   r   )r   r-   r   r   r	   r.      s    zBaseTable.relabeled_clone)	r   r   r   r   r   r   r   r+   r.   r   r   r   r	   r5      s   r5   N)r   Zdjango.db.models.sql.constantsr   r   	Exceptionr   r
   objectr   r   r5   r   r   r   r	   <module>   s   f