3
v^,M                 @   s  d dl Z d dlZd dlmZ d dl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 d dlmZ d dlmZ d dlmZ G d	d
 d
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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-d. d.e&Z)ejG d/d0 d0e)Z*ejG d1d2 d2e&Z+ejG d3d4 d4e+Z,ejG d5d6 d6eeZ-ejG d7d8 d8eZ.ejG d9d: d:eZ/ejG d;d< d<e/Z0G d=d> d>eZ1G d?d@ d@e1eZ2G dAdB dBe1eZ3G dCdD dDe1eZ4G dEdF dFe1e Z5G dGdH dHe1e!Z6dS )I    N)copy)EmptyResultSet)CaseExistsFuncValueWhen)BooleanFieldDateTimeFieldFieldIntegerField)RegisterLookupMixin)
OrderedSet)cached_propertyc               @   s   e Zd ZdZdZ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dZdd Zdd Zdd Zd(ddZdd Zdd Zed d! Zed"d# Zed$d% ZdS ))LookupNTFc             C   s`   || | _ | _| j | _t| j dr0| j j }ng }|rVddlm} t||rVtd|| _	d S )Nget_bilateral_transformsr   )QueryzBBilateral transformations on nested querysets are not implemented.)
lhsrhsget_prep_lookuphasattrr   django.db.models.sql.queryr   
isinstanceNotImplementedErrorbilateral_transforms)selfr   r   r   r    r   </usr/lib/python3.6/site-packages/django/db/models/lookups.py__init__   s    

zLookup.__init__c             C   s   x| j D ]}||}qW |S )N)r   )r   valueZ	transformr   r   r   apply_bilateral_transforms#   s    z!Lookup.apply_bilateral_transformsc             C   s   |d kr| j }| jrvg g  }}xz|D ]L}t|| jjd}| j|}|j|j}|j|\}}	|j	| |j
|	 q$W n$| j||\}
}dgt| | }}||fS )N)output_fieldz%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   sql
sql_params_paramsr   r   r   batch_process_rhs(   s    



zLookup.batch_process_rhsc             C   s   | j  r| jgS | j| jgS )N)rhs_is_direct_valuer   r   )r   r   r   r   get_source_expressions9   s    zLookup.get_source_expressionsc             C   s(   t |dkr|d | _n|\| _| _d S )N   r   )r(   r   r   )r   Z	new_exprsr   r   r   set_source_expressions>   s    zLookup.set_source_expressionsc             C   s<   t | jdr| jS | jr6t | jjdr6| jjj| jS | jS )Nr"   get_prep_value)r   r   prepare_rhsr   r!   r7   )r   r   r   r   r   D   s
    zLookup.get_prep_lookupc             C   s
   d|gfS )Nz%sr   )r   r   r*   r   r   r   r'   K   s    zLookup.get_db_prep_lookupc             C   s*   |p| j }t|dr |j|j}|j|S )Nr"   )r   r   r"   r#   r$   )r   r)   r*   r   r   r   r   process_lhsN   s    

zLookup.process_lhsc             C   s^   | j }| jr:| j r$t|| jjd}| j|}|j|j}t	|drN|j
|S | j||S d S )N)r!   as_sql)r   r   r3   r   r   r!   r    r"   r#   r   r$   r'   )r   r)   r*   r   r   r   r   process_rhsT   s    


zLookup.process_rhsc             C   s   t | jd S )Nr:   )r   r   )r   r   r   r   r3   b   s    zLookup.rhs_is_direct_valuec             C   s4   t | }|jj||_t|jdr0|jj||_|S )Nrelabeled_clone)r   r   r<   r   r   )r   relabelsnewr   r   r   r<   e   s
    zLookup.relabeled_clonec             C   s*   | j j }t| jdr&|j| jj  |S )Nget_group_by_cols)r   r?   r   r   r&   )r   aliascolsr   r   r   r?   l   s    
zLookup.get_group_by_colsc             C   s   t d S )N)r   )r   r)   r*   r   r   r   r:   r   s    zLookup.as_sqlc             C   sn   d}g }xD| j | jfD ]4}t|tr@tt|dddt d}d}|j| qW |r^t| | n| }|j	||S )NFT)then)defaultr!   )
r   r   r   r   r   r   r	   r%   typer:   )r   r)   r*   wrappedexprsexprlookupr   r   r   	as_oracleu   s    
zLookup.as_oraclec             C   s   | j jpt| jddS )Ncontains_aggregateF)r   rJ   getattrr   )r   r   r   r   rJ      s    zLookup.contains_aggregatec             C   s   | j jpt| jddS )Ncontains_over_clauseF)r   rL   rK   r   )r   r   r   r   rL      s    zLookup.contains_over_clausec             C   s   | j jpt| jddS )N
is_summaryF)r   rM   rK   r   )r   r   r   r   rM      s    zLookup.is_summary)N)N)N)__name__
__module____qualname__lookup_namer8   Zcan_use_none_as_rhsr   r    r2   r4   r6   r   r'   r9   r;   r3   r<   r?   r:   rI   r   rJ   rL   propertyrM   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.
    Fr5   c             C   s   | j  d S )Nr   )r4   )r   r   r   r   r      s    zTransform.lhsc             C   s2   t | jdr| jj }ng }| jr.|j| j |S )Nr   )r   r   r   	bilateralr%   	__class__)r   r   r   r   r   r      s    z"Transform.get_bilateral_transformsN)	rN   rO   rP   __doc__rT   arityrR   r   r   r   r   r   r   rS      s
   rS   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jj|d}|jj||| }|jj| j	|| }|t
|fS )N)r*   )superr9   r   r!   get_internal_typedb_typeopsZfield_cast_sqlZlookup_castrQ   list)r   r)   r*   r   lhs_sqlr1   Zfield_internal_typer[   )rU   r   r   r9      s    zBuiltinLookup.process_lhsc             C   sF   | j ||\}}| j||\}}|j| | j||}d||f |fS )Nz%s %s)r9   r;   r&   
get_rhs_op)r   r)   r*   r^   r1   rhs_sql
rhs_paramsr   r   r   r:      s
    
zBuiltinLookup.as_sqlc             C   s   |j | j | S )N)	operatorsrQ   )r   r*   r   r   r   r   r_      s    zBuiltinLookup.get_rhs_op)N)rN   rO   rP   r9   r:   r_   __classcell__r   r   )rU   r   rX      s   	rX   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_valuez%sc                s   g | ]}| d dqS )T)preparedr   ).0v)r*   re   r   r   
<listcomp>   s    z?FieldGetDbPrepValueMixin.get_db_prep_lookup.<locals>.<listcomp>T)rf   )rK   r   r!   re   $get_db_prep_lookup_value_is_iterable)r   r   r*   fieldr   )r*   re   r   r'      s
    z+FieldGetDbPrepValueMixin.get_db_prep_lookupN)rN   rO   rP   rV   rj   r'   r   r   r   r   rd      s   rd   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   sb   t | jdr| jS g }xF| jD ]<}t |dr.n"| jrPt | jjdrP| jjj|}|j| qW |S )Nr"   r7   )r   r   r8   r   r!   r7   r%   )r   Zprepared_valuesZ	rhs_valuer   r   r   r      s    
z0FieldGetDbPrepValueIterableMixin.get_prep_lookupc                s&   | j  r| j||S t j||S d S )N)r3   r2   rY   r;   )r   r)   r*   )rU   r   r   r;      s    z,FieldGetDbPrepValueIterableMixin.process_rhsc             C   s>   |g}t |dr|j|j}t |dr6|j||\}}||fS )Nr"   r:   )r   r"   r#   r:   )r   r)   r*   r.   paramr1   r   r   r   resolve_expression_parameter   s    

z=FieldGetDbPrepValueIterableMixin.resolve_expression_parameterNc                sJ   t  j |}t fddt| D  \}}tjj|}|t|fS )Nc             3   s"   | ]\}}j  ||V  qd S )N)rn   )rg   r.   rm   )r)   r*   r   r   r   	<genexpr>   s   zEFieldGetDbPrepValueIterableMixin.batch_process_rhs.<locals>.<genexpr>)rY   r2   zip	itertoolschainfrom_iterabletuple)r   r)   r*   r   Zpre_processedr.   r1   )rU   )r)   r*   r   r   r2      s    z2FieldGetDbPrepValueIterableMixin.batch_process_rhs)N)
rN   rO   rP   rV   rj   r   r;   rn   r2   rc   r   r   )rU   r   rl      s   rl   c                   s    e Zd ZdZ fddZ  ZS )Exactexactc                sZ   ddl m} t| j|rL| jj rD| jjsL| jj  | jjdg ntdt	 j
||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
ValueErrorrY   r;   )r   r)   r*   r   )rU   r   r   r;     s    

zExact.process_rhs)rN   rO   rP   rQ   r;   rc   r   r   )rU   r   ru     s   ru   c                   s$   e Zd ZdZdZ fddZ  ZS )IExactZiexactFc                s2   t  j||\}}|r*|jj|d |d< ||fS )Nr   )rY   r;   r\   Zprep_for_iexact_query)r   qnr*   r   r1   )rU   r   r   r;     s    zIExact.process_rhs)rN   rO   rP   rQ   r8   r;   rc   r   r   )rU   r   r|     s   r|   c               @   s   e Zd ZdZdS )GreaterThangtN)rN   rO   rP   rQ   r   r   r   r   r~      s   r~   c               @   s   e Zd ZdZdS )GreaterThanOrEqualZgteN)rN   rO   rP   rQ   r   r   r   r   r   %  s   r   c               @   s   e Zd ZdZdS )LessThanltN)rN   rO   rP   rQ   r   r   r   r   r   *  s   r   c               @   s   e Zd ZdZdS )LessThanOrEqualZlteN)rN   rO   rP   rQ   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| j| _t j S )N)r   r   floatmathceilrY   r   )r   )rU   r   r   r   9  s    z)IntegerFieldFloatRounding.get_prep_lookup)rN   rO   rP   rV   r   rc   r   r   )rU   r   r   4  s   r   c               @   s   e Zd ZdS )IntegerGreaterThanOrEqualN)rN   rO   rP   r   r   r   r   r   ?  s   r   c               @   s   e Zd ZdS )IntegerLessThanN)rN   rO   rP   r   r   r   r   r   D  s   r   c                   s<   e Zd ZdZ fddZdd Z fddZdd	 Z  ZS )
Ininc                s   t | jdd }|d k	r(||jkr(td| j ryt| j}W n tk
rX   | j}Y nX |sbt| j|||\}}ddj	| d }||fS t | jdds| jj
  | jjdg t j||S d S )	N_dbzvSubqueries aren't allowed across different databases. Force the inner query to be evaluated using `list(inner_query)`.(z, )rx   Trw   )rK   r   r@   r{   r3   r   	TypeErrorr   r2   joinry   rz   rY   r;   )r   r)   r*   Zdb_rhsr   r+   r,   placeholder)rU   r   r   r;   M  s$    
zIn.process_rhsc             C   s   d| S )NzIN %sr   )r   r*   r   r   r   r   r_   i  s    zIn.get_rhs_opc                s>   |j j }| j r0|r0t| j|kr0| j||S t j||S )N)r\   max_in_list_sizer3   r(   r   split_parameter_list_as_sqlrY   r:   )r   r)   r*   r   )rU   r   r   r:   l  s    
z	In.as_sqlc             C   s   |j j }| j||\}}| j||\}}dg}g }	xtdt||D ]v}
|
dkr\|jd |jd|  |	j| ||
|
|  }||
|
|  }dj|}|j| |jd |	j| qFW |jd dj||	fS )Nr   r   z OR z%s IN (z, r    )	r\   r   r9   r2   ranger(   r%   r&   r   )r   r)   r*   r   r   
lhs_paramsr   ra   Zin_clause_elementsr1   offsetr+   r,   Zparam_groupr   r   r   r   r  s$    






zIn.split_parameter_list_as_sql)	rN   rO   rP   rQ   r;   r_   r:   r   rc   r   r   )rU   r   r   I  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|j}|j|S t j||S d S )Nr:   )	r   r   r   Zpattern_opsrQ   formatZpattern_escrY   r_   )r   r*   r   pattern)rU   r   r   r_     s    

zPatternLookup.get_rhs_opc                sH   t  j||\}}| j r@|r@| j r@| j|jj|d  |d< ||fS )Nr   )rY   r;   r3   r   param_patternr\   Zprep_for_like_query)r   r}   r*   r   r1   )rU   r   r   r;     s    zPatternLookup.process_rhs)rN   rO   rP   r   r8   r_   r;   rc   r   r   )rU   r   r     s   r   c               @   s   e Zd ZdZdS )ContainscontainsN)rN   rO   rP   rQ   r   r   r   r   r     s   r   c               @   s   e Zd ZdZdS )	IContainsZ	icontainsN)rN   rO   rP   rQ   r   r   r   r   r     s   r   c               @   s   e Zd ZdZdZdS )
StartsWith
startswithz%s%%N)rN   rO   rP   rQ   r   r   r   r   r   r     s   r   c               @   s   e Zd ZdZdS )IStartsWithZistartswithN)rN   rO   rP   rQ   r   r   r   r   r     s   r   c               @   s   e Zd ZdZdZdS )EndsWithendswithz%%%sN)rN   rO   rP   rQ   r   r   r   r   r   r     s   r   c               @   s   e Zd ZdZdS )	IEndsWithZ	iendswithN)rN   rO   rP   rQ   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 )NzBETWEEN %s AND %sr   r5   r   )r   r*   r   r   r   r   r_     s    zRange.get_rhs_opN)rN   rO   rP   rQ   r_   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   s2   |j | j\}}| jr"d| |fS d| |fS d S )Nz
%s IS NULLz%s IS NOT NULL)r$   r   r   )r   r)   r*   r.   r1   r   r   r   r:     s    zIsNull.as_sqlN)rN   rO   rP   rQ   r8   r:   r   r   r   r   r     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 j||S | j||\}}| j||\}}|jj| j }|||f || fS d S )N)rQ   rb   rY   r:   r9   r;   r\   Zregex_lookup)r   r)   r*   r   r   r   ra   Zsql_template)rU   r   r   r:     s    zRegex.as_sql)rN   rO   rP   rQ   r8   r:   rc   r   r   )rU   r   r     s   r   c               @   s   e Zd ZdZdS )IRegexZiregexN)rN   rO   rP   rQ   r   r   r   r   r     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   s2   | j j j}t|tr"|jj|}n|jj|}|S )N)r   r!   r   r
   r\   Z%year_lookup_bounds_for_datetime_fieldZ!year_lookup_bounds_for_date_field)r   r*   yearr!   Zboundsr   r   r   year_lookup_bounds  s
    

zYearLookup.year_lookup_boundsc       	         s|   | j  rn| j||| jj\}}| j||\}}| j||}| j|| j\}}|j| j|| d||f |fS t	 j
||S )Nz%s %s)r3   r9   r   r;   get_direct_rhs_sqlr   r   r&   get_bound_paramsrY   r:   )	r   r)   r*   r^   r1   r`   r0   startfinish)rU   r   r   r:     s    zYearLookup.as_sqlc             C   s   |j | j | S )N)rb   rQ   )r   r*   r   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)rN   rO   rP   r   r:   r   r   rc   r   r   )rU   r   r     s   r   c               @   s   e Zd Zdd Zdd ZdS )	YearExactc             C   s   dS )NzBETWEEN %s AND %sr   )r   r*   r   r   r   r   r     s    zYearExact.get_direct_rhs_sqlc             C   s   ||fS )Nr   )r   r   r   r   r   r   r     s    zYearExact.get_bound_paramsN)rN   rO   rP   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 )Nr   )r   r   r   r   r   r   r     s    zYearGt.get_bound_paramsN)rN   rO   rP   r   r   r   r   r   r     s   r   c               @   s   e Zd Zdd ZdS )YearGtec             C   s   |fS )Nr   )r   r   r   r   r   r   r     s    zYearGte.get_bound_paramsN)rN   rO   rP   r   r   r   r   r   r     s   r   c               @   s   e Zd Zdd ZdS )YearLtc             C   s   |fS )Nr   )r   r   r   r   r   r   r      s    zYearLt.get_bound_paramsN)rN   rO   rP   r   r   r   r   r   r     s   r   c               @   s   e Zd Zdd ZdS )YearLtec             C   s   |fS )Nr   )r   r   r   r   r   r   r   %  s    zYearLte.get_bound_paramsN)rN   rO   rP   r   r   r   r   r   r   $  s   r   )7rq   r   r   django.core.exceptionsr   django.db.models.expressionsr   r   r   r   r   django.db.models.fieldsr	   r
   r   r   django.db.models.query_utilsr   django.utils.datastructuresr   django.utils.functionalr   r   rS   rX   rd   rl   register_lookupru   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>   sx    3







?
 