
v^,M                 @   sE  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 Gd	 d
   d
  Z Gd d   d e e  Z Gd d   d e  Z Gd d   d  Z Gd d   d e  Z e j Gd d   d e e   Z e j Gd d   d e   Z e j Gd d   d e e   Z e j Gd d   d e e   Z e j Gd d   d e e   Z  e j Gd d   d e e   Z! Gd d    d   Z" e j Gd! d"   d" e" e   Z# e j Gd# d$   d$ e" e    Z$ e j Gd% d&   d& e e   Z% Gd' d(   d( e  Z& e j Gd) d*   d* e&   Z' e j Gd+ d,   d, e'   Z( e j Gd- d.   d. e&   Z) e j Gd/ d0   d0 e)   Z* e j Gd1 d2   d2 e&   Z+ e j Gd3 d4   d4 e+   Z, e j Gd5 d6   d6 e e   Z- e j Gd7 d8   d8 e   Z. e j Gd9 d:   d: e   Z/ e j Gd; d<   d< e/   Z0 Gd= d>   d> e  Z1 Gd? d@   d@ e1 e  Z2 GdA dB   dB e1 e  Z3 GdC dD   dD e1 e  Z4 GdE dF   dF e1 e   Z5 GdG dH   dH e1 e!  Z6 d 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  rF |  j  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hasattrr   django.db.models.sql.queryr   
isinstanceNotImplementedErrorbilateral_transforms)selfr   r   r   r    r   :/tmp/pip-build-8lau8j11/django/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 r g  g  } } x | D]n } t | d |  j j } |  j |  } | j | j  } | j |  \ } }	 | j	 |  | j
 |	  q2 Wn2 |  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   sqlZ
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   s8   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   sT   t  |  j d  r |  j S|  j rM t  |  j j d  rM |  j j j |  j  S|  j S)Nr"   get_prep_value)r   r   prepare_rhsr   r!   r6   )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  r0 | 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 rW |  j   r6 t | d |  j j } |  j |  } | j | j  } t	 | d  rs | j
 |  S|  j | |  Sd  S)Nr!   as_sql)r   r   r2   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)Nr9   )r   r   )r   r   r   r   r2   b   s    zLookup.rhs_is_direct_valuec             C   sL   t  |   } | j j |  | _ t | j d  rH | j j |  | _ | S)Nrelabeled_clone)r   r   r;   r   r   )r   Zrelabelsnewr   r   r   r;   e   s
    zLookup.relabeled_clonec             C   s;   |  j  j   } t |  j d  r7 | 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   r9   r   s    zLookup.as_sqlc             C   s   d } g  } xc |  j  |  j f D]O } t | t  ra t t | d d d d d t   } d } | j |  q W| r t |   |   n |  } | j	 | |  S)NFZthenTdefaultr!   )
r   r   r   r   r   r   r	   r%   typer9   )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   rG   getattrr   )r   r   r   r   rG      s    zLookup.contains_aggregatec             C   s   |  j  j p t |  j d d  S)Ncontains_over_clauseF)r   rI   rH   r   )r   r   r   r   rI      s    zLookup.contains_over_clausec             C   s   |  j  j p t |  j d d  S)N
is_summaryF)r   rJ   rH   r   )r   r   r   r   rJ      s    zLookup.is_summary)__name__
__module____qualname__lookup_namer7   Zcan_use_none_as_rhsr   r    r1   r3   r5   r   r'   r8   r:   r2   r;   r=   r9   rF   r   rG   rI   propertyrJ   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.
    Fr4   c             C   s   |  j    d S)Nr   )r3   )r   r   r   r   r      s    zTransform.lhsc             C   sG   t  |  j d  r$ |  j j   } n g  } |  j rC | j |  j  | S)Nr   )r   r   r   	bilateralr%   	__class__)r   r   r   r   r   r      s    	z"Transform.get_bilateral_transformsN)	rK   rL   rM   __doc__rQ   arityrO   r   r   r   r   r   r   rP      s
   rP   c                   s=   e  Z d  Z d   f d d  Z d d   Z d d   Z   S)BuiltinLookupNc                s   t    j | | |  \ } } |  j j j   } |  j j j d |  } | j j | |  | } | j j |  j	 |  | } | t
 |  f S)Nr*   )superr8   r   r!   Zget_internal_typedb_typeopsZfield_cast_sqlZlookup_castrN   list)r   r)   r*   r   lhs_sqlr0   Zfield_internal_typerW   )rR   r   r   r8      s    	zBuiltinLookup.process_lhsc             C   sc   |  j  | |  \ } } |  j | |  \ } } | j |  |  j | |  } d | | f | f S)Nz%s %s)r8   r:   r&   
get_rhs_op)r   r)   r*   rZ   r0   rhs_sql
rhs_paramsr   r   r   r9      s
    zBuiltinLookup.as_sqlc             C   s   | j  |  j | S)N)	operatorsrN   )r   r*   r   r   r   r   r[      s    zBuiltinLookup.get_rhs_op)rK   rL   rM   r8   r9   r[   r   r   )rR   r   rU      s   	rU   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                sz   t  |  j j d d   } t  | d d   p6 |  j j j  d |  j ra    f d d   | D n  |   d d g f S)NZtarget_fieldget_db_prep_valuez%sc                s%   g  |  ] }  |   d  d  q S)preparedTr   ).0v)r*   r`   r   r   
<listcomp>   s   	 z?FieldGetDbPrepValueMixin.get_db_prep_lookup.<locals>.<listcomp>ra   T)rH   r   r!   r`   $get_db_prep_lookup_value_is_iterable)r   r   r*   fieldr   )r*   r`   r   r'      s
    !%z+FieldGetDbPrepValueMixin.get_db_prep_lookupN)rK   rL   rM   rS   re   r'   r   r   r   r   r_      s   r_   c                   s[   e  Z d  Z d Z d Z d d   Z   f d d   Z d d   Z d	   f d
 d  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 Sg  } xc |  j D]X } t  | d  rA n3 |  j rt t  |  j j d  rt |  j j j |  } | j |  q) W| S)Nr"   r6   )r   r   r7   r   r!   r6   r%   )r   Zprepared_values	rhs_valuer   r   r   r      s    z0FieldGetDbPrepValueIterableMixin.get_prep_lookupc                s3   |  j    r |  j | |  St   j | |  Sd  S)N)r2   r1   rV   r:   )r   r)   r*   )rR   r   r   r:      s    z,FieldGetDbPrepValueIterableMixin.process_rhsc             C   s[   | g } t  | d  r* | j | j  } t  | d  rQ | j | |  \ } } | | f S)Nr"   r9   )r   r"   r#   r9   )r   r)   r*   r.   paramr0   r   r   r   resolve_expression_parameter   s    	z=FieldGetDbPrepValueIterableMixin.resolve_expression_parameterNc                sk   t    j    |  } t     f d d   t |   D   \ } } t j j |  } | t |  f S)Nc             3   s-   |  ]# \ } }  j     | |  Vq d  S)N)rj   )rb   r.   ri   )r)   r*   r   r   r   	<genexpr>   s   zEFieldGetDbPrepValueIterableMixin.batch_process_rhs.<locals>.<genexpr>)rV   r1   zip	itertoolschainfrom_iterabletuple)r   r)   r*   r   Zpre_processedr.   r0   )rR   )r)   r*   r   r   r1      s    z2FieldGetDbPrepValueIterableMixin.batch_process_rhs)	rK   rL   rM   rS   re   r   r:   rj   r1   r   r   )rR   r   rg      s   rg   c                   s(   e  Z d  Z d Z   f d d   Z   S)Exactexactc                s   d d l  m } t |  j |  rl |  j j   r` |  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
ValueErrorrV   r:   )r   r)   r*   r   )rR   r   r   r:     s    	zExact.process_rhs)rK   rL   rM   rN   r:   r   r   )rR   r   rq     s   rq   c                   s.   e  Z d  Z d Z d Z   f d d   Z   S)IExactZiexactFc                sE   t    j | |  \ } } | r; | j j | d  | d <| | f S)Nr   )rV   r:   rX   Zprep_for_iexact_query)r   qnr*   r   r0   )rR   r   r   r:     s    zIExact.process_rhs)rK   rL   rM   rN   r7   r:   r   r   )rR   r   rx     s   rx   c               @   s   e  Z d  Z d Z d S)GreaterThangtN)rK   rL   rM   rN   r   r   r   r   rz      s   rz   c               @   s   e  Z d  Z d Z d S)GreaterThanOrEqualgteN)rK   rL   rM   rN   r   r   r   r   r|   %  s   r|   c               @   s   e  Z d  Z d Z d S)LessThanltN)rK   rL   rM   rN   r   r   r   r   r~   *  s   r~   c               @   s   e  Z d  Z d Z d S)LessThanOrEquallteN)rK   rL   rM   rN   r   r   r   r   r   /  s   r   c                   s(   e  Z d  Z d Z   f d d   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                s4   t  |  j t  r' t j |  j  |  _ t   j   S)N)r   r   floatmathceilrV   r   )r   )rR   r   r   r   9  s    z)IntegerFieldFloatRounding.get_prep_lookup)rK   rL   rM   rS   r   r   r   )rR   r   r   4  s   r   c               @   s   e  Z d  Z d S)IntegerGreaterThanOrEqualN)rK   rL   rM   r   r   r   r   r   ?  s   r   c               @   s   e  Z d  Z d S)IntegerLessThanN)rK   rL   rM   r   r   r   r   r   D  s   r   c                   sR   e  Z d  Z d Z   f d d   Z d d   Z   f d d   Z d d	   Z   S)
Ininc                s  t  |  j d d   } | d  k	 r< | | j k r< t d   |  j   r y t |  j  } Wn t k
 rx |  j } Yn X| s t  |  j | | |  \ } } d d j	 |  d } | | f St  |  j d d  s |  j j
   |  j j d g  t   j | |  Sd  S)	N_dbzvSubqueries aren't allowed across different databases. Force the inner query to be evaluated using `list(inner_query)`.(z, )rt   Trs   )rH   r   r>   rw   r2   r   	TypeErrorr   r1   joinru   rv   rV   r:   )r   r)   r*   Zdb_rhsr   r+   r,   placeholder)rR   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                sY   | j  j   } |  j   rF | rF t |  j  | k rF |  j | |  St   j | |  S)N)rX   max_in_list_sizer2   r(   r   split_parameter_list_as_sqlrV   r9   )r   r)   r*   r   )rR   r   r   r9   l  s    'z	In.as_sqlc             C   s&  | j  j   } |  j | |  \ } } |  j | |  \ } } d g } g  }	 x t d t |  |  D] }
 |
 d k r | j d  | j d |  |	 j |  | |
 |
 |  } | |
 |
 |  } d j |  } | j |  | j d  |	 j |  qg W| j d  d j |  |	 f S)Nr   r   z OR z%s IN (z, r    )	rX   r   r8   r1   ranger(   r%   r&   r   )r   r)   r*   r   r   
lhs_paramsr   r]   Zin_clause_elementsr0   offsetr+   r,   Zparam_groupr   r   r   r   r  s$    	zIn.split_parameter_list_as_sql)rK   rL   rM   rN   r:   r[   r9   r   r   r   )rR   r   r   I  s
   r   c                   s@   e  Z d  Z d Z d Z   f d d   Z   f d d   Z   S)PatternLookupz%%%s%%Fc                s[   t  |  j d  s |  j rD | j |  j j | j  } | j |  St   j | |  Sd  S)Nr9   )	r   r   r   Zpattern_opsrN   formatZpattern_escrV   r[   )r   r*   r   pattern)rR   r   r   r[     s    
zPatternLookup.get_rhs_opc                sb   t    j | |  \ } } |  j   rX | rX |  j rX |  j | j j | d  | d <| | f S)Nr   )rV   r:   r2   r   param_patternrX   Zprep_for_like_query)r   ry   r*   r   r0   )rR   r   r   r:     s    !zPatternLookup.process_rhs)rK   rL   rM   r   r7   r[   r:   r   r   )rR   r   r     s   r   c               @   s   e  Z d  Z d Z d S)ContainscontainsN)rK   rL   rM   rN   r   r   r   r   r     s   r   c               @   s   e  Z d  Z d Z d S)	IContainsZ	icontainsN)rK   rL   rM   rN   r   r   r   r   r     s   r   c               @   s   e  Z d  Z d Z d Z d S)
StartsWith
startswithz%s%%N)rK   rL   rM   rN   r   r   r   r   r   r     s   r   c               @   s   e  Z d  Z d Z d S)IStartsWithZistartswithN)rK   rL   rM   rN   r   r   r   r   r     s   r   c               @   s   e  Z d  Z d Z d Z d S)EndsWithendswithz%%%sN)rK   rL   rM   rN   r   r   r   r   r   r     s   r   c               @   s   e  Z d  Z d Z d S)	IEndsWithZ	iendswithN)rK   rL   rM   rN   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   r4   r   )r   r*   r   r   r   r   r[     s    zRange.get_rhs_opN)rK   rL   rM   rN   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   sA   | j  |  j  \ } } |  j r/ d | | f Sd | | f Sd  S)Nz
%s IS NULLz%s IS NOT NULL)r$   r   r   )r   r)   r*   r.   r0   r   r   r   r9     s    	zIsNull.as_sqlN)rK   rL   rM   rN   r7   r9   r   r   r   r   r     s   r   c                   s.   e  Z d  Z d Z d Z   f d d   Z   S)RegexregexFc                s   |  j  | j k r% t   j | |  S|  j | |  \ } } |  j | |  \ } } | j j |  j   } | | | f | | f Sd  S)N)rN   r^   rV   r9   r8   r:   rX   Zregex_lookup)r   r)   r*   r   r   r   r]   Zsql_template)rR   r   r   r9     s    zRegex.as_sql)rK   rL   rM   rN   r7   r9   r   r   )rR   r   r     s   r   c               @   s   e  Z d  Z d Z d S)IRegexZiregexN)rK   rL   rM   rN   r   r   r   r   r     s   r   c                   sF   e  Z d  Z d d   Z   f d d   Z d d   Z d d   Z   S)	
YearLookupc             C   sI   |  j  j  j } t | t  r3 | j j |  } n | j j |  } | S)N)r   r!   r   r
   rX   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    r |  j | | |  j j  \ } } |  j | |  \ } } |  j | |  } |  j | |  j  \ } } | j |  j | |   d | | f | f St	   j
 | |  S)Nz%s %s)r2   r8   r   r:   get_direct_rhs_sqlr   r   r&   get_bound_paramsrV   r9   )	r   r)   r*   rZ   r0   r\   r/   startfinish)rR   r   r   r9     s    !zYearLookup.as_sqlc             C   s   | j  |  j | S)N)r^   rN   )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)rK   rL   rM   r   r9   r   r   r   r   )rR   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)rK   rL   rM   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)rK   rL   rM   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)rK   rL   rM   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)rK   rL   rM   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)rK   rL   rM   r   r   r   r   r   r   $  s   r   )7rm   r   r   Zdjango.core.exceptionsr   Zdjango.db.models.expressionsr   r   r   r   r   Zdjango.db.models.fieldsr	   r
   r   r   Zdjango.db.models.query_utilsr   Zdjango.utils.datastructuresr   Zdjango.utils.functionalr   r   rP   rU   r_   rg   Zregister_lookuprq   rx   rz   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>   sv   ("3? 