
 X|                 @   s!  d  d l  Z  d  d l Z d  d l m Z d  d l m Z d  d l m Z d  d l	 m
 Z
 d  d l m Z d  d l m Z Gd d	   d	 e  Z Gd
 d   d e  Z Gd d   d e e  Z Gd d   d e  Z Gd d   d e  Z Gd d   d e  Z Gd d   d e  Z Gd d   d e  Z Gd d   d e  Z Gd d   d e  Z Gd d   d e  Z Gd d   d e  Z Gd  d!   d! e  Z Gd" d#   d# e  Z Gd$ d%   d% e  Z Gd& d'   d' e  Z Gd( d)   d) e  Z  Gd* d+   d+ e  Z! Gd, d-   d- e  Z" d S).    N)
FieldError)utils)fields)Q)six)cached_propertyc               @   sE  e  Z d  Z d Z d Z d Z d Z d Z d Z d Z	 d Z
 d	 Z d
 d d  Z d d   Z d d   Z d d   Z d d   Z d d   Z d d   Z d d   Z d d   Z d d   Z d d    Z d! d"   Z d# d$   Z d% d&   Z d' d(   Z d) d*   Z d+ d,   Z d- d.   Z d/ d0   Z d1 d2   Z d3 d4   Z  d
 S)5
Combinablezv
    Provides the ability to combine one or two objects with
    some connector. For example F('foo') + F('bar').
    +-*/^z%%&|Nc             C   sq   t  | d  sK t | t j  r< t | d t j   } qK t |  } n  | ra t | | |   St |  | |  S)Nresolve_expressionoutput_field)	hasattr
isinstancedatetime	timedeltaDurationValuer   DurationFieldValueCombinedExpression)selfother	connectorreversednode r   J/home/ubuntu/projects/ifolica/build/django/django/db/models/expressions.py_combine"   s    zCombinable._combinec             C   s   |  j  | |  j d  S)NF)r!   ADD)r   r   r   r   r    __add__2   s    zCombinable.__add__c             C   s   |  j  | |  j d  S)NF)r!   SUB)r   r   r   r   r    __sub__5   s    zCombinable.__sub__c             C   s   |  j  | |  j d  S)NF)r!   MUL)r   r   r   r   r    __mul__8   s    zCombinable.__mul__c             C   s   |  j  | |  j d  S)NF)r!   DIV)r   r   r   r   r    __truediv__;   s    zCombinable.__truediv__c             C   s   t  |   j |  |  S)N)typer)   )r   r   r   r   r    __div__>   s    zCombinable.__div__c             C   s   |  j  | |  j d  S)NF)r!   MOD)r   r   r   r   r    __mod__A   s    zCombinable.__mod__c             C   s   |  j  | |  j d  S)NF)r!   POW)r   r   r   r   r    __pow__D   s    zCombinable.__pow__c             C   s   t  d   d  S)Nz:Use .bitand() and .bitor() for bitwise logical operations.)NotImplementedError)r   r   r   r   r    __and__G   s    zCombinable.__and__c             C   s   |  j  | |  j d  S)NF)r!   BITAND)r   r   r   r   r    bitandL   s    zCombinable.bitandc             C   s   t  d   d  S)Nz:Use .bitand() and .bitor() for bitwise logical operations.)r0   )r   r   r   r   r    __or__O   s    zCombinable.__or__c             C   s   |  j  | |  j d  S)NF)r!   BITOR)r   r   r   r   r    bitorT   s    zCombinable.bitorc             C   s   |  j  | |  j d  S)NT)r!   r"   )r   r   r   r   r    __radd__W   s    zCombinable.__radd__c             C   s   |  j  | |  j d  S)NT)r!   r$   )r   r   r   r   r    __rsub__Z   s    zCombinable.__rsub__c             C   s   |  j  | |  j d  S)NT)r!   r&   )r   r   r   r   r    __rmul__]   s    zCombinable.__rmul__c             C   s   |  j  | |  j d  S)NT)r!   r(   )r   r   r   r   r    __rtruediv__`   s    zCombinable.__rtruediv__c             C   s   t  |   j |  |  S)N)r*   r:   )r   r   r   r   r    __rdiv__c   s    zCombinable.__rdiv__c             C   s   |  j  | |  j d  S)NT)r!   r,   )r   r   r   r   r    __rmod__f   s    zCombinable.__rmod__c             C   s   |  j  | |  j d  S)NT)r!   r.   )r   r   r   r   r    __rpow__i   s    zCombinable.__rpow__c             C   s   t  d   d  S)Nz:Use .bitand() and .bitor() for bitwise logical operations.)r0   )r   r   r   r   r    __rand__l   s    zCombinable.__rand__c             C   s   t  d   d  S)Nz:Use .bitand() and .bitor() for bitwise logical operations.)r0   )r   r   r   r   r    __ror__q   s    zCombinable.__ror__)!__name__
__module____qualname____doc__r"   r$   r&   r(   r.   r,   r2   r5   r!   r#   r%   r'   r)   r+   r-   r/   r1   r3   r4   r6   r7   r8   r9   r:   r;   r<   r=   r>   r?   r   r   r   r    r      s<   r   c               @   s~  e  Z d  Z d Z d Z d Z d d d  Z 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 d d d d d  Z d d   Z e d d    Z e d d    Z e d d    Z d d    Z d! d"   Z d# d$   Z d% d&   Z d' d(   Z d) d*   Z d+ d,   Z d- d.   Z d/ d0   Z d1 d2   Z d3 d4   Z d5 d6   Z  d S)7BaseExpressionz/
    Base class for all query expressions.
    FNc             C   s   | d  k	 r | |  _  n  d  S)N)_output_field)r   r   r   r   r    __init__   s    zBaseExpression.__init__c             C   s   |  j  g |  j j |  S)N)convert_valuer   get_db_converters)r   
connectionr   r   r    rH      s    z BaseExpression.get_db_convertersc             C   s   g  S)Nr   )r   r   r   r    get_source_expressions   s    z%BaseExpression.get_source_expressionsc             C   s   t  |  d k s t  d  S)Nr   )lenAssertionError)r   exprsr   r   r    set_source_expressions   s    z%BaseExpression.set_source_expressionsc             G   s   d d   | D S)Nc             S   sO   g  |  ]E } t  | d   r! | n' t | t j  r? t |  n	 t |   q S)r   )r   r   r   string_typesFr   ).0argr   r   r    
<listcomp>   s   	z5BaseExpression._parse_expressions.<locals>.<listcomp>r   )r   expressionsr   r   r    _parse_expressions   s    	z!BaseExpression._parse_expressionsc             C   s   t  d   d S)a  
        Responsible for returning a (sql, [params]) tuple to be included
        in the current query.

        Different backends can provide their own implementation, by
        providing an `as_{vendor}` method and patching the Expression:

        ```
        def override_as_sql(self, compiler, connection):
            # custom logic
            return super(Expression, self).as_sql(compiler, connection)
        setattr(Expression, 'as_' + connection.vendor, override_as_sql)
        ```

        Arguments:
         * compiler: the query compiler responsible for generating the query.
           Must have a compile method, returning a (sql, [params]) tuple.
           Calling compiler(value) will return a quoted `value`.

         * connection: the database connection used for the current query.

        Returns: (sql, params)
          Where `sql` is a string containing ordered sql parameters to be
          replaced with the elements of the list `params`.
        z"Subclasses must implement as_sql()N)r0   )r   compilerrI   r   r   r    as_sql   s    zBaseExpression.as_sqlc             C   s.   x' |  j    D] } | r | j r d Sq Wd S)NTF)rJ   contains_aggregate)r   exprr   r   r    rX      s    z!BaseExpression.contains_aggregatec             C   s.   x' |  j    D] } | r | j r d Sq Wd S)NTF)rJ   contains_column_references)r   rY   r   r   r    rZ      s    z)BaseExpression.contains_column_referencesTc                sH   |  j    }  | _ | j      f d d   | j   D  | S)a  
        Provides the chance to do any preprocessing or validation before being
        added to the query.

        Arguments:
         * query: the backend query implementation
         * allow_joins: boolean allowing or denying use of joins
           in this query
         * reuse: a set of reusable joins for multijoins
         * summarize: a terminal aggregate clause
         * for_save: whether this expression about to be used in a save or update

        Returns: an Expression to be added to the query.
        c                s(   g  |  ] } | j         q Sr   )r   )rQ   rY   )allow_joinsqueryreuse	summarizer   r    rS      s   	z5BaseExpression.resolve_expression.<locals>.<listcomp>)copy
is_summaryrN   rJ   )r   r\   r[   r]   r^   for_savecr   )r[   r\   r]   r^   r    r      s    	z!BaseExpression.resolve_expressionc             C   s   |  S)zQ
        Hook used by Lookup.get_prep_lookup() to do custom preparation.
        r   )r   fieldr   r   r    _prepare   s    zBaseExpression._preparec             C   s   |  j  S)N)r   )r   r   r   r    rc      s    zBaseExpression.fieldc             C   s%   |  j  d k r t d   n  |  j  S)z>
        Returns the output type of this expressions.
        Nz4Cannot resolve expression type, unknown output_field)_output_field_or_noner   )r   r   r   r    r      s    zBaseExpression.output_fieldc             C   s#   |  j  d k r |  j   n  |  j  S)a  
        Returns the output field of this expression, or None if no output type
        can be resolved. Note that the 'output_field' property will raise
        FieldError if no type can be resolved, but this attribute allows for
        None values.
        N)rE   _resolve_output_field)r   r   r   r    re      s    z$BaseExpression._output_field_or_nonec             C   s   |  j  d k r |  j   } t |  } | d k r? d |  _  q x] | D]R } |  j  d k rg | |  _  n  | d k	 rF t |  j  | j  rF t d   qF qF Wn  d S)a  
        Attempts to infer the output type of the expression. If the output
        fields of all source fields match then we can simply infer the same
        type here. This isn't always correct, but it makes sense most of the
        time.

        Consider the difference between `2 + 2` and `2 / 3`. Inferring
        the type here is a convenience for the common case. The user should
        supply their own output_field with more complex computations.

        If a source does not have an `_output_field` then we exclude it from
        this check. If all sources are `None`, then an error will be thrown
        higher up the stack in the `output_field` property.
        Nr   z:Expression contains mixed types. You must set output_field)rE   get_source_fieldsrK   r   	__class__r   )r   sourcesZnum_sourcessourcer   r   r    rf      s    "z$BaseExpression._resolve_output_fieldc             C   sq   |  j  } | j   } | d k r% | S| d k r; t |  S| j d  rT t |  S| d k rm t j |  S| S)z
        Expressions provide their own converters because users have the option
        of manually specifying the output_field which may be a different type
        from the one the database returns.
        N
FloatFieldZIntegerFieldDecimalField)r   get_internal_typefloatendswithintbackend_utilsZtypecast_decimal)r   value
expressionrI   contextrc   Zinternal_typer   r   r    rG     s    	

zBaseExpression.convert_valuec             C   s   |  j  j |  S)N)r   
get_lookup)r   lookupr   r   r    ru   "  s    zBaseExpression.get_lookupc             C   s   |  j  j |  S)N)r   get_transform)r   namer   r   r    rw   %  s    zBaseExpression.get_transformc                s6   |  j    } | j   f d d   |  j   D  | S)Nc                s   g  |  ] } | j      q Sr   )relabeled_clone)rQ   e)
change_mapr   r    rS   +  s   	 z2BaseExpression.relabeled_clone.<locals>.<listcomp>)r_   rN   rJ   )r   r{   cloner   )r{   r    ry   (  s     zBaseExpression.relabeled_clonec             C   s   t  j  |   } d | _ | S)NT)r_   copied)r   rb   r   r   r    r_   .  s    	zBaseExpression.copyc             C   sD   |  j  s |  g Sg  } x' |  j   D] } | j | j    q# W| S)N)rX   rJ   extendget_group_by_cols)r   colsrj   r   r   r    r   3  s    	z BaseExpression.get_group_by_colsc             C   s   d d   |  j    D S)zT
        Returns the underlying field types used by this
        aggregate.
        c             S   s   g  |  ] } | j   q Sr   )re   )rQ   rz   r   r   r    rS   @  s   	 z4BaseExpression.get_source_fields.<locals>.<listcomp>)rJ   )r   r   r   r    rg   ;  s    z BaseExpression.get_source_fieldsc             C   s
   t  |   S)N)OrderBy)r   r   r   r    ascB  s    zBaseExpression.ascc             C   s   t  |  d d S)N
descendingT)r   )r   r   r   r    descE  s    zBaseExpression.descc             C   s   |  S)Nr   )r   r   r   r    reverse_orderingH  s    zBaseExpression.reverse_orderingc             c   sE   |  Vx9 |  j    D]+ } | r x | j   D] } | Vq+ Wq q Wd S)zi
        Recursively yield this expression and all subexpressions, in
        depth-first order.
        N)rJ   flatten)r   rY   Z
inner_exprr   r   r    r   K  s
    zBaseExpression.flatten)!r@   rA   rB   rC   r`   rE   rF   rH   rJ   rN   rU   rW   r   rX   rZ   r   rd   propertyrc   r   re   rf   rG   ru   rw   ry   r_   r   rg   r   r   r   r   r   r   r   r    rD   w   s8   	rD   c               @   s   e  Z d  Z d Z d S)
ExpressionzD
    An expression that can be combined with other expressions.
    N)r@   rA   rB   rC   r   r   r   r    r   W  s   r   c                   s|   e  Z d  Z d   f d d  Z d d   Z d d   Z d d	   Z d
 d   Z d d   Z d d d d d d d  Z	   S)r   Nc                s8   t  t |   j d |  | |  _ | |  _ | |  _ d  S)Nr   )superr   rF   r   lhsrhs)r   r   r   r   r   )rh   r   r    rF   `  s    		zCombinedExpression.__init__c             C   s   d j  |  j j |   S)Nz<{}: {}>)formatrh   r@   )r   r   r   r    __repr__f  s    zCombinedExpression.__repr__c             C   s   d j  |  j |  j |  j  S)Nz{} {} {})r   r   r   r   )r   r   r   r    __str__i  s    zCombinedExpression.__str__c             C   s   |  j  |  j g S)N)r   r   )r   r   r   r    rJ   l  s    z)CombinedExpression.get_source_expressionsc             C   s   | \ |  _  |  _ d  S)N)r   r   )r   rM   r   r   r    rN   o  s    z)CombinedExpression.set_source_expressionsc       
      C   s  y |  j  j } Wn t k
 r* d  } Yn Xy |  j j } Wn t k
 rU d  } Yn X| j j r | r{ | j   d k s | r | j   d k r t |  j  |  j |  j  j	 | |  S| r| r|  j |  j
 k r| j   d k r| j   | j   k rt |  j  |  j  j	 | |  Sg  } g  } | j |  j   \ } } | j |  | j |  | j |  j  \ } } | j |  | j |  d }	 | j j |  j |  } |	 | | f S)Nr   	DateFieldDateTimeField	TimeFieldz(%s)>   r   r   r   )r   r   r   r   featureshas_native_duration_fieldrm   DurationExpressionr   rW   r$   TemporalSubtractioncompileappendr~   opsZcombine_expression)
r   rV   rI   Z
lhs_outputZ
rhs_outputrT   expression_paramssqlparamsexpression_wrapperr   r   r    rW   r  s6    %zCombinedExpression.as_sqlTFc             C   s[   |  j    } | | _ | j j | | | | |  | _ | j j | | | | |  | _ | S)N)r_   r`   r   r   r   )r   r\   r[   r]   r^   ra   rb   r   r   r    r     s
    	!!z%CombinedExpression.resolve_expression)
r@   rA   rB   rF   r   r   rJ   rN   rW   r   r   r   )rh   r    r   ^  s   r   c               @   s(   e  Z d  Z d d   Z d d   Z d S)r   c             C   s~   t  | t  sq y | j } Wn t k
 r0 Yqq X| j   d k rq | j |  \ } } | j j |  | f Sn  | j |  S)Nr   )r   r   r   r   rm   r   r   Zformat_for_duration_arithmetic)r   ZsiderV   rI   outputr   r   r   r   r    r     s    zDurationExpression.compilec             C   s   | j  j |   g  } g  } |  j |  j | |  \ } } | j |  | j |  |  j |  j | |  \ } } | j |  | j |  d } | j  j |  j |  } | | | f S)Nz(%s))	r   check_expression_supportr   r   r   r~   r   Zcombine_duration_expressionr   )r   rV   rI   rT   r   r   r   r   r   r   r    rW     s    zDurationExpression.as_sqlN)r@   rA   rB   r   rW   r   r   r   r    r     s   r   c                   s.   e  Z d  Z   f d d   Z d d   Z   S)r   c                s/   t  t |   j | |  j | d t j   d  S)Nr   )r   r   rF   r$   r   r   )r   r   r   )rh   r   r    rF     s    zTemporalSubtraction.__init__c             C   s\   | j  j |   | j |  j |  } | j |  j |  } | j  j |  j j j   | |  S)N)r   r   r   r   r   Zsubtract_temporalsr   rm   )r   rV   rI   r   r   r   r   r    rW     s    zTemporalSubtraction.as_sql)r@   rA   rB   rF   rW   r   r   )rh   r    r     s   r   c               @   sa   e  Z d  Z d Z d d   Z d d   Z d d d d d d	 d
  Z d d   Z d d   Z d S)rP   zN
    An object capable of resolving references to existing query objects.
    c             C   s   | |  _  d S)z^
        Arguments:
         * name: the name of the field this expression references
        N)rx   )r   rx   r   r   r    rF     s    z
F.__init__c             C   s   d j  |  j j |  j  S)Nz{}({}))r   rh   r@   rx   )r   r   r   r    r     s    z
F.__repr__NTFc             C   s   | j  |  j | | |  S)N)Zresolve_refrx   )r   r\   r[   r]   r^   ra   r   r   r    r     s    zF.resolve_expressionc             C   s
   t  |   S)N)r   )r   r   r   r    r     s    zF.ascc             C   s   t  |  d d S)Nr   T)r   )r   r   r   r    r     s    zF.desc)	r@   rA   rB   rC   rF   r   r   r   r   r   r   r   r    rP     s   rP   c                   s   e  Z d  Z d Z d Z d Z d Z d Z   f d d   Z d d   Z	 d	 d
   Z
 d d   Z d d d d d d d  Z d d d d d  Z d d   Z   f d d   Z   S)Funcz
    An SQL function call.
    Nz%(function)s(%(expressions)s)z, c                s   |  j  d  k	 rg t |  |  j  k rg t d |  j j |  j  |  j  d k rN d n d t |  f   n  | j d d   } t t |   j d |  |  j	 |   |  _
 | |  _ d  S)Nz#'%s' takes exactly %s %s (%s given)   argument	argumentsr   )arityrK   	TypeErrorrh   r@   popr   r   rF   rU   source_expressionsextra)r   rT   r   r   )rh   r   r    rF     s    $	zFunc.__init__c             C   s|   |  j  j d d   |  j D  } d j d d   |  j j   D  } | rf d j |  j j | |  Sd j |  j j |  S)Nc             s   s   |  ] } t  |  Vq d  S)N)str)rQ   rR   r   r   r    	<genexpr>  s    z Func.__repr__.<locals>.<genexpr>z, c             s   s/   |  ]% \ } } t  |  d  t  |  Vq d S)=N)r   )rQ   keyvalr   r   r    r     s    z
{}({}, {})z{}({}))
arg_joinerjoinr   r   itemsr   rh   r@   )r   argsr   r   r   r    r     s
    "%zFunc.__repr__c             C   s   |  j  S)N)r   )r   r   r   r    rJ     s    zFunc.get_source_expressionsc             C   s   | |  _  d  S)N)r   )r   rM   r   r   r    rN     s    zFunc.set_source_expressionsTFc       	      C   s[   |  j    } | | _ x? t | j  D]. \ } } | j | | | | |  | j | <q% W| S)N)r_   r`   	enumerater   r   )	r   r\   r[   r]   r^   ra   rb   posrR   r   r   r    r     s
    	&zFunc.resolve_expressionc             K   s  | j  j |   g  } g  } x@ |  j D]5 }	 | j |	  \ }
 } | j |
  | j |  q& W|  j j   } | j |   | d  k	 r | | d <n | j	 d |  j
  | p | j d |  j  } | p | j d |  j  } | j |  | d <| d <| | | f S)Nfunctiontemplater   rT   rc   )r   r   r   r   r   r~   r   r_   update
setdefaultr   getr   r   r   )r   rV   rI   r   r   r   extra_contextZ	sql_partsr   rR   Zarg_sqlZ
arg_paramsdatar   r   r    rW     s     zFunc.as_sqlc             C   s]   |  j  | |  \ } } y& |  j j   d k r= d | } n  Wn t k
 rR Yn X| | f S)Nrl   zCAST(%s AS NUMERIC))rW   r   rm   r   )r   rV   rI   r   r   r   r   r    	as_sqlite  s    zFunc.as_sqlitec                sA   t  t |   j   } |  j d  d   | _ |  j j   | _ | S)N)r   r   r_   r   r   )r   r_   )rh   r   r    r_   #  s    z	Func.copy)r@   rA   rB   rC   r   r   r   r   rF   r   rJ   rN   r   rW   r   r_   r   r   )rh   r    r     s   	r   c                   sp   e  Z d  Z d Z d   f d d  Z d d   Z d d   Z d d	 d d
 d
   f d d  Z d d   Z   S)r   zC
    Represents a wrapped value as a node within an expression
    Nc                s&   t  t |   j d |  | |  _ d S)a:  
        Arguments:
         * value: the value this expression represents. The value will be
           added into the sql parameter list and properly quoted.

         * output_field: an instance of the model field type that this
           expression will return, such as IntegerField() or CharField().
        r   N)r   r   rF   rr   )r   rr   r   )rh   r   r    rF   .  s    	zValue.__init__c             C   s   d j  |  j j |  j  S)Nz{}({}))r   rh   r@   rr   )r   r   r   r    r   :  s    zValue.__repr__c             C   s   | j  j |   |  j } |  j d  k	 rg |  j rL |  j j | d | } qg |  j j | d | } n  | d  k r} d g  f Sd | g f S)NrI   ZNULLz%s)r   r   rr   rE   ra   r   Zget_db_prep_saveZget_db_prep_value)r   rV   rI   r   r   r   r    rW   =  s    		
zValue.as_sqlTFc                s1   t  t |   j | | | | |  } | | _ | S)N)r   r   r   ra   )r   r\   r[   r]   r^   ra   rb   )rh   r   r    r   M  s    $	zValue.resolve_expressionc             C   s   g  S)Nr   )r   r   r   r    r   R  s    zValue.get_group_by_cols)	r@   rA   rB   rC   rF   r   rW   r   r   r   r   )rh   r    r   *  s   !r   c                   s"   e  Z d  Z   f d d   Z   S)r   c                sT   | j  j |   | j j rA | j j rA t t |   j | |  S| j  j |  j	  S)N)
r   r   r   r   Zdriver_supports_timedelta_argsr   r   rW   Zdate_interval_sqlrr   )r   rV   rI   )rh   r   r    rW   W  s
    zDurationValue.as_sql)r@   rA   rB   rW   r   r   )rh   r    r   V  s   r   c                   sI   e  Z d  Z d   f d d  Z d d   Z d d   Z d d	   Z   S)
RawSQLNc                sK   | d  k r t  j   } n  | | |  _ |  _ t t |   j d |  d  S)Nr   )r   ZFieldr   r   r   r   rF   )r   r   r   r   )rh   r   r    rF   `  s    zRawSQL.__init__c             C   s   d j  |  j j |  j |  j  S)Nz
{}({}, {}))r   rh   r@   r   r   )r   r   r   r    r   f  s    zRawSQL.__repr__c             C   s   d |  j  |  j f S)Nz(%s))r   r   )r   rV   rI   r   r   r    rW   i  s    zRawSQL.as_sqlc             C   s   |  g S)Nr   )r   r   r   r    r   l  s    zRawSQL.get_group_by_cols)r@   rA   rB   rF   r   rW   r   r   r   )rh   r    r   _  s   r   c               @   s(   e  Z d  Z d d   Z d d   Z d S)Starc             C   s   d S)Nz'*'r   )r   r   r   r    r   q  s    zStar.__repr__c             C   s
   d g  f S)Nr   r   )r   rV   rI   r   r   r    rW   t  s    zStar.as_sqlN)r@   rA   rB   r   rW   r   r   r   r    r   p  s   r   c                   s:   e  Z d  Z   f d d   Z d d   Z d d   Z   S)Randomc                s#   t  t |   j d t j    d  S)Nr   )r   r   rF   r   rk   )r   )rh   r   r    rF   y  s    zRandom.__init__c             C   s   d S)NzRandom()r   )r   r   r   r    r   |  s    zRandom.__repr__c             C   s   | j  j   g  f S)N)r   Zrandom_function_sql)r   rV   rI   r   r   r    rW     s    zRandom.as_sql)r@   rA   rB   rF   r   rW   r   r   )rh   r    r   x  s   r   c                   sg   e  Z d  Z d Z d   f d d  Z d d   Z d d   Z d	 d
   Z d d   Z d d   Z	   S)ColTNc                sE   | d  k r | } n  t  t |   j d |  | | |  _ |  _ d  S)Nr   )r   r   rF   aliastarget)r   r   r   r   )rh   r   r    rF     s    	zCol.__init__c             C   s   d j  |  j j |  j |  j  S)Nz
{}({}, {}))r   rh   r@   r   r   )r   r   r   r    r     s    zCol.__repr__c             C   s2   | j  } d | |  j  | |  j j  f g  f S)Nz%s.%s)Zquote_name_unless_aliasr   r   column)r   rV   rI   qnr   r   r    rW     s    	z
Col.as_sqlc             C   s+   |  j  | j |  j |  j  |  j |  j  S)N)rh   r   r   r   r   )r   relabelsr   r   r    ry     s    zCol.relabeled_clonec             C   s   |  g S)Nr   )r   r   r   r    r     s    zCol.get_group_by_colsc             C   sB   |  j  |  j k r" |  j j |  S|  j j |  |  j  j |  S)N)r   r   rH   )r   rI   r   r   r    rH     s    zCol.get_db_converters)
r@   rA   rB   rZ   rF   r   rW   ry   r   rH   r   r   )rh   r    r     s   r   c                   s   e  Z d  Z d Z   f d d   Z d d   Z d d   Z d d	   Z d
 d d
 d d d d  Z d d   Z	 d d   Z
 d d   Z   S)Refz~
    Reference to column alias of the query. For example, Ref('sum_cost') in
    qs.annotate(sum_cost=Sum('cost')) query.
    c                s*   t  t |   j   | | |  _ |  _ d  S)N)r   r   rF   refsrj   )r   r   rj   )rh   r   r    rF     s    zRef.__init__c             C   s   d j  |  j j |  j |  j  S)Nz
{}({}, {}))r   rh   r@   r   rj   )r   r   r   r    r     s    zRef.__repr__c             C   s
   |  j  g S)N)rj   )r   r   r   r    rJ     s    zRef.get_source_expressionsc             C   s   | \ |  _  d  S)N)rj   )r   rM   r   r   r    rN     s    zRef.set_source_expressionsNTFc             C   s   |  S)Nr   )r   r\   r[   r]   r^   ra   r   r   r    r     s    zRef.resolve_expressionc             C   s   |  S)Nr   )r   r   r   r   r    ry     s    zRef.relabeled_clonec             C   s   d | j  j |  j  g  f S)Nz%s)r   Z
quote_namer   )r   rV   rI   r   r   r    rW     s    z
Ref.as_sqlc             C   s   |  g S)Nr   )r   r   r   r    r     s    zRef.get_group_by_cols)r@   rA   rB   rC   rF   r   rJ   rN   r   ry   rW   r   r   r   )rh   r    r     s   r   c                   sX   e  Z d  Z d Z   f d d   Z d d   Z d d   Z d d	   Z d
 d   Z   S)ExpressionWrapperz
    An expression that can wrap another expression so that it can provide
    extra context to the inner expression, such as the output_field.
    c                s&   t  t |   j d |  | |  _ d  S)Nr   )r   r   rF   rs   )r   rs   r   )rh   r   r    rF     s    zExpressionWrapper.__init__c             C   s   | d |  _  d  S)Nr   )rs   )r   rM   r   r   r    rN     s    z(ExpressionWrapper.set_source_expressionsc             C   s
   |  j  g S)N)rs   )r   r   r   r    rJ     s    z(ExpressionWrapper.get_source_expressionsc             C   s   |  j  j | |  S)N)rs   rW   )r   rV   rI   r   r   r    rW     s    zExpressionWrapper.as_sqlc             C   s   d j  |  j j |  j  S)Nz{}({}))r   rh   r@   rs   )r   r   r   r    r     s    zExpressionWrapper.__repr__)	r@   rA   rB   rC   rF   rN   rJ   rW   r   r   r   )rh   r    r     s   r   c                   s   e  Z d  Z d Z d d   f d d  Z d d   Z d d   Z d	 d
   Z d d   Z d d   Z	 d d d d d d d  Z
 d d d  Z d d   Z   S)Whenz"WHEN %(condition)s THEN %(result)sNc                s   | r( | d  k r( t  |   d  } } n  | d  k sJ t | t   sJ | rY t d   n  t t |   j d d   | |  _ |  j |  d |  _ d  S)NzB__init__() takes either a Q object or lookups as keyword argumentsr   r   )	r   r   r   r   r   rF   	conditionrU   result)r   r   ZthenZlookups)rh   r   r    rF     s    "	zWhen.__init__c             C   s   d |  j  |  j f S)NzWHEN %r THEN %r)r   r   )r   r   r   r    r     s    zWhen.__str__c             C   s   d |  j  j |  f S)Nz<%s: %s>)rh   r@   )r   r   r   r    r     s    zWhen.__repr__c             C   s   |  j  |  j g S)N)r   r   )r   r   r   r    rJ     s    zWhen.get_source_expressionsc             C   s   | \ |  _  |  _ d  S)N)r   r   )r   rM   r   r   r    rN     s    zWhen.set_source_expressionsc             C   s   |  j  j g S)N)r   re   )r   r   r   r    rg     s    zWhen.get_source_fieldsTFc             C   sp   |  j    } | | _ t | j d  rK | j j | | | | d  | _ n  | j j | | | | |  | _ | S)Nr   F)r_   r`   r   r   r   r   )r   r\   r[   r]   r^   ra   rb   r   r   r    r     s    	$!zWhen.resolve_expressionc             K   s   | j  j |   | } g  } | j |  j  \ } } | | d <| j |  | j |  j  \ }	 }
 |	 | d <| j |
  | p |  j } | | | f S)Nr   r   )r   r   r   r   r~   r   r   )r   rV   rI   r   r   template_params
sql_paramsZcondition_sqlZcondition_paramsZ
result_sqlZresult_paramsr   r   r    rW     s    

zWhen.as_sqlc             C   s4   g  } x' |  j    D] } | j | j    q W| S)N)rJ   r~   r   )r   r   rj   r   r   r    r     s    zWhen.get_group_by_cols)r@   rA   rB   r   rF   r   r   rJ   rN   rg   r   rW   r   r   r   )rh   r    r     s   	r   c                   s   e  Z d  Z d Z d Z d Z   f d d   Z d d   Z d d	   Z d
 d   Z	 d d   Z
 d d d d d d d  Z   f d d   Z d d d d  Z   S)Casez
    An SQL searched CASE expression:

        CASE
            WHEN n > 0
                THEN 'positive'
            WHEN n < 0
                THEN 'negative'
            ELSE 'zero'
        END
    z#CASE %(cases)s ELSE %(default)s END c                s   t  d d   | D  s( t d   n  | j d d   } | j d d   } t t |   j |  t |  |  _ |  j |  d |  _	 | |  _
 d  S)Nc             s   s   |  ] } t  | t  Vq d  S)N)r   r   )rQ   caser   r   r    r   #  s    z Case.__init__.<locals>.<genexpr>z.Positional arguments must all be When objects.defaultr   r   )allr   r   r   r   rF   listcasesrU   r   r   )r   r   r   r   r   )rh   r   r    rF   "  s    zCase.__init__c             C   s*   d d j  d d   |  j D  |  j f S)NzCASE %s, ELSE %rz, c             s   s   |  ] } t  |  Vq d  S)N)r   )rQ   rb   r   r   r    r   -  s    zCase.__str__.<locals>.<genexpr>)r   r   r   )r   r   r   r    r   ,  s    zCase.__str__c             C   s   d |  j  j |  f S)Nz<%s: %s>)rh   r@   )r   r   r   r    r   /  s    zCase.__repr__c             C   s   |  j  |  j g S)N)r   r   )r   r   r   r    rJ   2  s    zCase.get_source_expressionsc             C   s$   | d  d  |  _  | d |  _ d  S)Nr   r   )r   r   )r   rM   r   r   r    rN   5  s    zCase.set_source_expressionsNTFc       	      C   s|   |  j    } | | _ x? t | j  D]. \ } } | j | | | | |  | j | <q% W| j j | | | | |  | _ | S)N)r_   r`   r   r   r   r   )	r   r\   r[   r]   r^   ra   rb   r   r   r   r   r    r   9  s    	&!zCase.resolve_expressionc                s/   t  t |   j   } | j d  d   | _ | S)N)r   r   r_   r   )r   rb   )rh   r   r    r_   A  s    z	Case.copyc             K   s?  | j  j |   |  j s) | j |  j  S|  j j   } | j |  g  } g  } x@ |  j D]5 }	 | j |	  \ }
 } | j |
  | j	 |  q[ W| p |  j
 } | j |  | d <| j |  j  \ } } | | d <| j	 |  | p | j d |  j  } | | } |  j d  k	 r5| j  j |  j  | } n  | | f S)Nr   r   r   )r   r   r   r   r   r   r_   r   r   r~   case_joinerr   r   r   re   Zunification_cast_sqlr   )r   rV   rI   r   r   r   r   Z
case_partsr   r   Zcase_sqlZcase_paramsZdefault_sqlZdefault_paramsr   r   r   r    rW   F  s*    	

zCase.as_sql)r@   rA   rB   rC   r   r   rF   r   r   rJ   rN   r   r_   rW   r   r   )rh   r    r     s   
r   c               @   s   e  Z d  Z 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
 d d   Z d d   Z d S)r   z%(expression)s %(ordering)sFc             C   s4   | |  _  t | d  s' t d   n  | |  _ d  S)Nr   z%expression must be an expression type)r   r   
ValueErrorrs   )r   rs   r   r   r   r    rF   a  s    	zOrderBy.__init__c             C   s   d j  |  j j |  j |  j  S)Nz{}({}, descending={}))r   rh   r@   rs   r   )r   r   r   r    r   g  s    zOrderBy.__repr__c             C   s   | d |  _  d  S)Nr   )rs   )r   rM   r   r   r    rN   k  s    zOrderBy.set_source_expressionsc             C   s
   |  j  g S)N)rs   )r   r   r   r    rJ   n  s    zOrderBy.get_source_expressionsNc             K   s{   | j  j |   | j |  j  \ } } i | d 6|  j rA d n d d 6} | j |  | pd |  j } | | j   | f S)Nrs   ZDESCZASCZordering)r   r   r   rs   r   r   r   rstrip)r   rV   rI   r   r   Zexpression_sqlr   Zplaceholdersr   r   r    rW   q  s    zOrderBy.as_sqlc             C   s4   g  } x' |  j    D] } | j | j    q W| S)N)rJ   r~   r   )r   r   rj   r   r   r    r   |  s    zOrderBy.get_group_by_colsc             C   s   |  j  |  _  |  S)N)r   )r   r   r   r    r     s    zOrderBy.reverse_orderingc             C   s   d |  _  d  S)NF)r   )r   r   r   r    r     s    zOrderBy.ascc             C   s   d |  _  d  S)NT)r   )r   r   r   r    r     s    zOrderBy.desc)r@   rA   rB   r   rF   r   rN   rJ   rW   r   r   r   r   r   r   r   r    r   ^  s   r   )#r_   r   Zdjango.core.exceptionsr   Zdjango.db.backendsr   rq   Zdjango.db.modelsr   Zdjango.db.models.query_utilsr   Zdjango.utilsr   Zdjango.utils.functionalr   objectr   rD   r   r   r   r   rP   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r    <module>   s4   k:R,	!9K