U
    ea                     @   s  d dl Z d dlZd dlmZmZ d dlmZmZmZm	Z	m
Z
 d dlmZmZmZmZmZmZ d dlmZ d dlmZ d dlmZ d dlmZ G d	d
 d
eZG dd deeZG dd deZG dd dZG dd deZG dd deZej G dd deeZ!ej G dd deZ"ej G dd deeZ#ej G dd deeZ$ej G dd deeZ%ej G dd  d eeZ&G d!d" d"Z'ej G d#d$ d$e'e$Z(ej G d%d& d&e'e%Z)ej G d'd( d(eeZ*G d)d* d*eZ+ej G d+d, d,e+Z,ej G d-d. d.e,Z-ej G d/d0 d0e+Z.ej G d1d2 d2e.Z/ej G d3d4 d4e+Z0ej G d5d6 d6e0Z1ej G d7d8 d8eeZ2ej G d9d: d:eZ3ej G d;d< d<eZ4ej G d=d> d>e4Z5G d?d@ d@eZ6G dAdB dBe6e!Z7G dCdD dDe6e#Z8G dEdF dFe6e$Z9G dGdH dHe6e%Z:G dIdJ dJe6e&Z;G dKdL dLZ<ej G dMdN dNe<e"Z=ej G dOdP dPe<e,Z>ej G dQdR dRe<e-Z?ej G dSdT dTe<e.Z@ej G dUdV dVe<e/ZAej G dWdX dXe<e0ZBej G dYdZ dZe<e1ZCdS )[    N)EmptyResultSetFullResultSet)Case
ExpressionFuncValueWhen)BooleanField	CharFieldDateTimeFieldFieldIntegerField	UUIDField)RegisterLookupMixin)
OrderedSet)cached_property)make_hashablec                   @   s   e Zd ZdZdZdZdd Zdd Zdd	 Zd,d
dZ	dd Z
dd Zdd Zdd Zdd Zd-ddZdd Zdd Zdd Zdd Zed d! Zed"d# Zd$d% Zd&d' Zd.d(d)Zd*d+ ZdS )/LookupNTFc                 C   sj   || | _ | _|  | _|  | _ t| j dr:| j  }ng }|r`ddlm} t||r`t	d|| _
d S )Nget_bilateral_transformsr   QueryzBBilateral transformations on nested querysets are not implemented.)lhsrhsget_prep_lookupget_prep_lhshasattrr   django.db.models.sql.queryr   
isinstanceNotImplementedErrorbilateral_transforms)selfr   r   r   r    r!   </tmp/pip-unpacked-wheel-lctamlir/django/db/models/lookups.py__init__   s    


zLookup.__init__c                 C   s   | j D ]}||}q|S N)r   )r    valueZ	transformr!   r!   r"   apply_bilateral_transforms,   s    

z!Lookup.apply_bilateral_transformsc                 C   s   | j j d| jd| jdS )N(, ))	__class____name__r   r   r    r!   r!   r"   __repr__1   s    zLookup.__repr__c                 C   s   |d kr| j }| jrrg g  }}|D ]L}t|| jjd}| |}||j}||\}}	|	| |
|	 q"n$| ||\}
}dgt| | }}||fS )Noutput_field%s)r   r   r   r   r/   r&   resolve_expressionquerycompileappendextendget_db_prep_lookuplen)r    compiler
connectionr   sqlssqls_paramspr%   sqlZ
sql_params_paramsr!   r!   r"   batch_process_rhs4   s    


zLookup.batch_process_rhsc                 C   s   |   r| jgS | j| jgS r$   )rhs_is_direct_valuer   r   r,   r!   r!   r"   get_source_expressionsE   s    zLookup.get_source_expressionsc                 C   s(   t |dkr|d | _n|\| _| _d S )N   r   )r7   r   r   )r    Z	new_exprsr!   r!   r"   set_source_expressionsJ   s    zLookup.set_source_expressionsc                 C   s\   | j rt| jdr| jS t| jdrDt| jjdrV| jj| jS n|  rVt| jS | jS )Nr1   r/   get_prep_value)prepare_rhsr   r   r   r/   rE   rA   r   r,   r!   r!   r"   r   P   s    
zLookup.get_prep_lookupc                 C   s   t | jdr| jS t| jS Nr1   )r   r   r   r,   r!   r!   r"   r   Z   s    zLookup.get_prep_lhsc                 C   s
   d|gfS )Nr0   r!   )r    r%   r9   r!   r!   r"   r6   _   s    zLookup.get_db_prep_lookupc                 C   sL   |p| j }t|dr ||j}||\}}t|trDd| d}||fS )Nr1   r'   r)   )r   r   r1   r2   r3   r   r   )r    r8   r9   r   r=   r?   r!   r!   r"   process_lhsb   s    


zLookup.process_lhsc                 C   s   | j }| jr:|  r$t|| jjd}| |}||j}t	|drr|
|\}}|rj|d dkrjd| }||fS | ||S d S )Nr.   as_sqlr   r'   z(%s))r   r   rA   r   r   r/   r&   r1   r2   r   r3   r6   )r    r8   r9   r%   r=   r?   r!   r!   r"   process_rhsl   s    

zLookup.process_rhsc                 C   s   t | jd S NrI   )r   r   r,   r!   r!   r"   rA      s    zLookup.rhs_is_direct_valuec                 C   s$   g }|   D ]}||  q|S r$   )rB   r5   get_group_by_cols)r    colssourcer!   r!   r"   rL      s    zLookup.get_group_by_colsc                 C   sh   d}g }| j | jfD ]2}|j|r<tt|dddd}d}|| q|rXt| | n| }|||S )NFT)Zthen)default)	r   r   ops0conditional_expression_supported_in_where_clauser   r   r4   typerI   )r    r8   r9   wrappedexprsexprlookupr!   r!   r"   	as_oracle   s    zLookup.as_oraclec                 C   s   t  S r$   )r	   r,   r!   r!   r"   r/      s    zLookup.output_fieldc                 C   s   | j | j| jfS r$   )r*   r   r   r,   r!   r!   r"   identity   s    zLookup.identityc                 C   s   t |tstS | j|jkS r$   )r   r   NotImplementedrX   )r    otherr!   r!   r"   __eq__   s    
zLookup.__eq__c                 C   s   t t| jS r$   )hashr   rX   r,   r!   r!   r"   __hash__   s    zLookup.__hash__c                 C   sJ   |   }||_| j||||||_t| jdrF| j||||||_|S rG   )copyZ
is_summaryr   r1   r   r   )r    r2   Zallow_joinsZreuseZ	summarizeZfor_savecr!   r!   r"   r1      s$            zLookup.resolve_expressionc                 C   s   |j jjsd| d}||fS )Nz
CASE WHEN z THEN 1 ELSE 0 END)r9   featuresZ&supports_boolean_expr_in_select_clause)r    r8   r=   r?   r!   r!   r"   select_format   s    
zLookup.select_format)N)N)NTNFF)r+   
__module____qualname__lookup_namerF   Zcan_use_none_as_rhsr#   r&   r-   r@   rB   rD   r   r   r6   rH   rJ   rA   rL   rW   r   r/   propertyrX   r[   r]   r1   ra   r!   r!   r!   r"   r      s<   





         
r   c                   @   s,   e Zd ZdZdZdZedd Zdd ZdS )		Transformz
    RegisterLookupMixin() is first so that get_lookup() and get_transform()
    first examine self and then check output_field.
    FrC   c                 C   s   |   d S Nr   )rB   r,   r!   r!   r"   r      s    zTransform.lhsc                 C   s2   t | jdr| j }ng }| jr.|| j |S )Nr   )r   r   r   	bilateralr4   r*   )r    r   r!   r!   r"   r      s    z"Transform.get_bilateral_transformsN)	r+   rb   rc   __doc__rh   arityre   r   r   r!   r!   r!   r"   rf      s   
rf   c                       s.   e Zd Zd fdd	Zdd Zdd Z  ZS )	BuiltinLookupNc                    sb   t  |||\}}| jj }| jjj|d}|j||| }|j| j	|| }|t
|fS )N)r9   )superrH   r   r/   Zget_internal_typedb_typerP   Zfield_cast_sqlZlookup_castrd   list)r    r8   r9   r   lhs_sqlr?   Zfield_internal_typerm   r*   r!   r"   rH      s    zBuiltinLookup.process_lhsc                 C   sF   |  ||\}}| ||\}}|| | ||}d||f |fS Nz%s %s)rH   rJ   r5   
get_rhs_op)r    r8   r9   ro   r?   rhs_sql
rhs_paramsr!   r!   r"   rI      s
    
zBuiltinLookup.as_sqlc                 C   s   |j | j | S r$   	operatorsrd   r    r9   r   r!   r!   r"   rr      s    zBuiltinLookup.get_rhs_op)N)r+   rb   rc   rH   rI   rr   __classcell__r!   r!   rp   r"   rk      s   
rk   c                   @   s   e Zd ZdZdZdd ZdS )FieldGetDbPrepValueMixinzZ
    Some lookups require Field.get_db_prep_value() to be called on their
    inputs.
    Fc                    sT   t | jjdd }t |dd p$| jjjd| jrB fdd|D n| ddgfS )NZtarget_fieldget_db_prep_valuer0   c                    s   g | ]}| d dqS )Tpreparedr!   ).0vr9   rz   r!   r"   
<listcomp>   s     z?FieldGetDbPrepValueMixin.get_db_prep_lookup.<locals>.<listcomp>Tr{   )getattrr   r/   rz   $get_db_prep_lookup_value_is_iterable)r    r%   r9   fieldr!   r   r"   r6      s    z+FieldGetDbPrepValueMixin.get_db_prep_lookupN)r+   rb   rc   ri   r   r6   r!   r!   r!   r"   ry      s   ry   c                       sB   e Zd ZdZdZdd Z fddZdd Zd fd
d	Z  Z	S ) FieldGetDbPrepValueIterableMixinzg
    Some lookups require Field.get_db_prep_value() to be called on each value
    in an iterable.
    Tc                 C   s^   t | jdr| jS g }| jD ]<}t |dr,n"| jrNt | jjdrN| jj|}|| q|S )Nr1   rE   )r   r   rF   r   r/   rE   r4   )r    Zprepared_values	rhs_valuer!   r!   r"   r   
  s    

z0FieldGetDbPrepValueIterableMixin.get_prep_lookupc                    s&   |   r| ||S t ||S d S r$   )rA   r@   rl   rJ   )r    r8   r9   rp   r!   r"   rJ     s    z,FieldGetDbPrepValueIterableMixin.process_rhsc                 C   s<   |g}t |dr||j}t |dr4||\}}||fS )Nr1   rI   )r   r1   r2   r3   )r    r8   r9   r=   paramr?   r!   r!   r"   resolve_expression_parameter   s    

z=FieldGetDbPrepValueIterableMixin.resolve_expression_parameterNc                    sJ   t   |}t fddt| D  \}}tj|}|t|fS )Nc                 3   s"   | ]\}}  ||V  qd S r$   )r   )r}   r=   r   r8   r9   r    r!   r"   	<genexpr>/  s   zEFieldGetDbPrepValueIterableMixin.batch_process_rhs.<locals>.<genexpr>)rl   r@   zip	itertoolschainfrom_iterabletuple)r    r8   r9   r   Zpre_processedr=   r?   rp   r   r"   r@   (  s    z2FieldGetDbPrepValueIterableMixin.batch_process_rhs)N)
r+   rb   rc   ri   r   r   rJ   r   r@   rx   r!   r!   rp   r"   r     s   r   c                   @   s   e Zd ZdZdZdd ZdS )PostgresOperatorLookupz*Lookup defined by operators on PostgreSQL.Nc                 C   sD   |  ||\}}| ||\}}t|t| }d|| j|f |fS )Nz%s %s %s)rH   rJ   r   postgres_operator)r    r8   r9   r   
lhs_paramsr   rt   r?   r!   r!   r"   as_postgresql=  s    z$PostgresOperatorLookup.as_postgresql)r+   rb   rc   ri   r   r   r!   r!   r!   r"   r   8  s   r   c                       s,   e Zd ZdZ fddZ fddZ  ZS )Exactexactc                    sV   ddl m} t| j|rL| j rD| jjsL| j  | jdg ntdt	 
 S )Nr   r   pkzSThe QuerySet value for an exact lookup must be limited to one result using slicing.)r   r   r   r   Zhas_limit_onehas_select_fieldsclear_select_clause
add_fields
ValueErrorrl   r   r    r   rp   r!   r"   r   H  s    

zExact.get_prep_lookupc                    s`   t | jtrRt| jddrR|j| jrR| ||\}}| jrBdnd}|| |fS t 	||S )NZconditionalFr0   zNOT %s)
r   r   boolr   r   rP   rQ   rH   rl   rI   )r    r8   r9   ro   r?   templaterp   r!   r"   rI   W  s    
zExact.as_sql)r+   rb   rc   rd   r   rI   rx   r!   r!   rp   r"   r   D  s   r   c                       s$   e Zd ZdZdZ fddZ  ZS )IExactZiexactFc                    s2   t  ||\}}|r*|j|d |d< ||fS rg   )rl   rJ   rP   Zprep_for_iexact_queryr    qnr9   r   r?   rp   r!   r"   rJ   m  s    zIExact.process_rhs)r+   rb   rc   rd   rF   rJ   rx   r!   r!   rp   r"   r   h  s   r   c                   @   s   e Zd ZdZdS )GreaterThangtNr+   rb   rc   rd   r!   r!   r!   r"   r   t  s   r   c                   @   s   e Zd ZdZdS )GreaterThanOrEqualZgteNr   r!   r!   r!   r"   r   y  s   r   c                   @   s   e Zd ZdZdS )LessThanltNr   r!   r!   r!   r"   r   ~  s   r   c                   @   s   e Zd ZdZdS )LessThanOrEqualZlteNr   r!   r!   r!   r"   r     s   r   c                       s    e Zd ZdZ fddZ  ZS )IntegerFieldFloatRoundingz
    Allow floats to work as query values for IntegerField. Without this, the
    decimal portion of the float would always be discarded.
    c                    s$   t | jtrt| j| _t  S r$   )r   r   floatmathceilrl   r   r,   rp   r!   r"   r     s    z)IntegerFieldFloatRounding.get_prep_lookup)r+   rb   rc   ri   r   rx   r!   r!   rp   r"   r     s   r   c                   @   s   e Zd ZdS )IntegerGreaterThanOrEqualNr+   rb   rc   r!   r!   r!   r"   r     s   r   c                   @   s   e Zd ZdS )IntegerLessThanNr   r!   r!   r!   r"   r     s   r   c                       sH   e Zd ZdZ fddZ fddZdd Z fdd	Zd
d Z  Z	S )Ininc                    sP   ddl m} t| j|rF| jjdd | jjsF| j  | jdg t 	 S )Nr   r   T)Zclear_defaultr   )
r   r   r   r   Zclear_orderingr   r   r   rl   r   r   rp   r!   r"   r     s    
zIn.get_prep_lookupc                    s   t | jdd }|d k	r(||jkr(td|  rzt| j}|d  W n$ tk
rl   dd | jD }Y nX |svt| 	|||\}}dd
| d }||fS t ||S )N_dbzvSubqueries aren't allowed across different databases. Force the inner query to be evaluated using `list(inner_query)`.c                 S   s   g | ]}|d k	r|qS r$   r!   )r}   rr!   r!   r"   r     s      z"In.process_rhs.<locals>.<listcomp>r'   r(   r)   )r   r   aliasr   rA   r   discard	TypeErrorr   r@   joinrl   rJ   )r    r8   r9   Zdb_rhsr   r:   r;   placeholderrp   r!   r"   rJ     s"    
zIn.process_rhsc                 C   s   d| S )NzIN %sr!   rw   r!   r!   r"   rr     s    zIn.get_rhs_opc                    s>   |j  }|  r0|r0t| j|kr0| ||S t ||S r$   )rP   max_in_list_sizerA   r7   r   split_parameter_list_as_sqlrl   rI   )r    r8   r9   r   rp   r!   r"   rI     s    
z	In.as_sqlc                 C   s   |j  }| ||\}}| ||\}}dg}g }	tdt||D ]v}
|
dkrZ|d |d|  |	| ||
|
|  }||
|
|  }d|}|| |d |	| qD|d d||	fS )Nr'   r   z OR z%s IN (r(   r)    )	rP   r   rH   r@   ranger7   r4   r5   r   )r    r8   r9   r   r   r   r   rt   Zin_clause_elementsr?   offsetr:   r;   Zparam_groupr!   r!   r"   r     s$    






zIn.split_parameter_list_as_sql)
r+   rb   rc   rd   r   rJ   rr   rI   r   rx   r!   r!   rp   r"   r     s   

r   c                       s0   e Zd ZdZdZ fddZ fddZ  ZS )PatternLookupz%%%s%%Fc                    sB   t | jds| jr0|j| j |j}||S t ||S d S rK   )	r   r   r   Zpattern_opsrd   formatZpattern_escrl   rr   )r    r9   r   patternrp   r!   r"   rr     s    

zPatternLookup.get_rhs_opc                    sF   t  ||\}}|  r>|r>| js>| j|j|d  |d< ||fS rg   )rl   rJ   rA   r   param_patternrP   Zprep_for_like_queryr   rp   r!   r"   rJ      s    

zPatternLookup.process_rhs)r+   rb   rc   r   rF   rr   rJ   rx   r!   r!   rp   r"   r     s   r   c                   @   s   e Zd ZdZdS )ContainscontainsNr   r!   r!   r!   r"   r   	  s   r   c                   @   s   e Zd ZdZdS )	IContainsZ	icontainsNr   r!   r!   r!   r"   r     s   r   c                   @   s   e Zd ZdZdZdS )
StartsWith
startswithz%s%%Nr+   rb   rc   rd   r   r!   r!   r!   r"   r     s   r   c                   @   s   e Zd ZdZdS )IStartsWithZistartswithNr   r!   r!   r!   r"   r     s   r   c                   @   s   e Zd ZdZdZdS )EndsWithendswithz%%%sNr   r!   r!   r!   r"   r     s   r   c                   @   s   e Zd ZdZdS )	IEndsWithZ	iendswithNr   r!   r!   r!   r"   r   $  s   r   c                   @   s   e Zd ZdZdd ZdS )Ranger   c                 C   s   d|d |d f S )NBETWEEN %s AND %sr   rC   r!   rw   r!   r!   r"   rr   -  s    zRange.get_rhs_opN)r+   rb   rc   rd   rr   r!   r!   r!   r"   r   )  s   r   c                   @   s   e Zd ZdZdZdd ZdS )IsNullZisnullFc                 C   s   t | jtstdt | jtrb| jjd ks@| jjdkrP|jjrP| jrJt	nt
}n| jrZt
nt	}|| ||\}}| jrd| |fS d| |fS d S )Nz>The QuerySet value for an isnull lookup must be True or False.r   z
%s IS NULLz%s IS NOT NULL)r   r   r   r   r   r   r%   r`   Z!interprets_empty_strings_as_nullsr   r   rH   )r    r8   r9   Zresult_exceptionr=   r?   r!   r!   r"   rI   6  s"    
zIsNull.as_sqlN)r+   rb   rc   rd   rF   rI   r!   r!   r!   r"   r   1  s   r   c                       s$   e Zd ZdZdZ fddZ  ZS )RegexregexFc                    s`   | j |jkrt ||S | ||\}}| ||\}}|j| j }|||f || fS d S r$   )rd   rv   rl   rI   rH   rJ   rP   Zregex_lookup)r    r8   r9   r   r   r   rt   Zsql_templaterp   r!   r"   rI   P  s    zRegex.as_sql)r+   rb   rc   rd   rF   rI   rx   r!   r!   rp   r"   r   K  s   r   c                   @   s   e Zd ZdZdS )IRegexZiregexNr   r!   r!   r!   r"   r   Z  s   r   c                       s4   e Zd Zdd Z fddZdd Zdd Z  ZS )	
YearLookupc                 C   sR   ddl m} t| j|}| jjj}t|tr>|jj||d}n|jj||d}|S )Nr   )ExtractIsoYear)iso_year)	django.db.models.functionsr   r   r   r/   r   rP   Z%year_lookup_bounds_for_datetime_fieldZ!year_lookup_bounds_for_date_field)r    r9   yearr   r   r/   Zboundsr!   r!   r"   year_lookup_bounds`  s    

zYearLookup.year_lookup_boundsc           	         s|   |   rn| ||| jj\}}| ||\}}| ||}| || j\}}|| || d||f |fS t	 
||S rq   )rA   rH   r   rJ   get_direct_rhs_sqlr   r   r5   get_bound_paramsrl   rI   )	r    r8   r9   ro   r?   rs   r>   startfinishrp   r!   r"   rI   q  s    zYearLookup.as_sqlc                 C   s   |j | j | S r$   ru   rw   r!   r!   r"   r     s    zYearLookup.get_direct_rhs_sqlc                 C   s   t dd S )NzAsubclasses of YearLookup must provide a get_bound_params() method)r   r    r   r   r!   r!   r"   r     s    zYearLookup.get_bound_params)r+   rb   rc   r   rI   r   r   rx   r!   r!   rp   r"   r   _  s   r   c                   @   s   e Zd Zdd Zdd ZdS )	YearExactc                 C   s   dS )Nr   r!   rw   r!   r!   r"   r     s    zYearExact.get_direct_rhs_sqlc                 C   s   ||fS r$   r!   r   r!   r!   r"   r     s    zYearExact.get_bound_paramsN)r+   rb   rc   r   r   r!   r!   r!   r"   r     s   r   c                   @   s   e Zd Zdd ZdS )YearGtc                 C   s   |fS r$   r!   r   r!   r!   r"   r     s    zYearGt.get_bound_paramsNr+   rb   rc   r   r!   r!   r!   r"   r     s   r   c                   @   s   e Zd Zdd ZdS )YearGtec                 C   s   |fS r$   r!   r   r!   r!   r"   r     s    zYearGte.get_bound_paramsNr   r!   r!   r!   r"   r     s   r   c                   @   s   e Zd Zdd ZdS )YearLtc                 C   s   |fS r$   r!   r   r!   r!   r"   r     s    zYearLt.get_bound_paramsNr   r!   r!   r!   r"   r     s   r   c                   @   s   e Zd Zdd ZdS )YearLtec                 C   s   |fS r$   r!   r   r!   r!   r"   r     s    zYearLte.get_bound_paramsNr   r!   r!   r!   r"   r     s   r   c                       s    e Zd ZdZ fddZ  ZS )UUIDTextMixinzs
    Strip hyphens from a value when filtering a UUIDField on backends without
    a native datatype for UUID.
    c                    s`   |j jsFddlm} |  r(t| j| _|| jtdtdt d| _t 	||\}}||fS )Nr   )Replace-r   r.   )
r`   Zhas_native_uuid_fieldr   r   rA   r   r   r
   rl   rJ   )r    r   r9   r   r   r?   rp   r!   r"   rJ     s       zUUIDTextMixin.process_rhs)r+   rb   rc   ri   rJ   rx   r!   r!   rp   r"   r     s   r   c                   @   s   e Zd ZdS )
UUIDIExactNr   r!   r!   r!   r"   r     s   r   c                   @   s   e Zd ZdS )UUIDContainsNr   r!   r!   r!   r"   r     s   r   c                   @   s   e Zd ZdS )UUIDIContainsNr   r!   r!   r!   r"   r     s   r   c                   @   s   e Zd ZdS )UUIDStartsWithNr   r!   r!   r!   r"   r     s   r   c                   @   s   e Zd ZdS )UUIDIStartsWithNr   r!   r!   r!   r"   r     s   r   c                   @   s   e Zd ZdS )UUIDEndsWithNr   r!   r!   r!   r"   r     s   r   c                   @   s   e Zd ZdS )UUIDIEndsWithNr   r!   r!   r!   r"   r     s   r   )Dr   r   Zdjango.core.exceptionsr   r   Zdjango.db.models.expressionsr   r   r   r   r   Zdjango.db.models.fieldsr	   r
   r   r   r   r   Zdjango.db.models.query_utilsr   Zdjango.utils.datastructuresr   Zdjango.utils.functionalr   Zdjango.utils.hashabler   r   rf   rk   ry   r   r   Zregister_lookupr   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r!   r!   r!   r"   <module>   s     *6#K)