U
    R+|jSÿ  ã                   @   sØ  d dl Z d dlZd dlZ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mZmZ d dl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 d dlmZ d dlmZ d dlm Z  G dd„ dƒZ!G dd„ dƒZ"G dd„ dƒZ#eG dd„ de#e"ƒƒZ$e%dƒZ&dd„ e"j'e"j(e"j)e"j*e"j+e"j,fD ƒdd„ e"j'e"j(e"j)e"j*e"j+fD ƒdd„ e"j-e"j.e"j/e"j0e"j1fD ƒdd„ e"j'e"j(e"j)e"j*e"j+e"j,fD ƒe"j'ej2ej3ej4fej4ej3ej4fej3ej2ej4fej3ej4ej4fej3ej3ej3fej5ej3ej5fej3ej5ej5fgie"j(ej2ej3ej4fej4ej3ej4fej2ej2ej3fej2ej4ej3fej4ej2ej3fej4ej4ej3fej3ej3ej3fej5ej3ej5fej5ej5ej3fg	igZ6ee7ƒZ8dd„ Z9e6D ]:Z:e: ;¡ D ]*\Z<Z=e=D ]\Z>Z?Z@e9e>e<e?e@ƒ �q¸�q¬�q ejAdd�dd „ ƒZBG d!d"„ d"e!e$ƒZCG d#d$„ d$eCƒZDG d%d&„ d&eCƒZEed'd(�G d)d*„ d*e"ƒƒZFG d+d,„ d,eFƒZGG d-d.„ d.eFƒZHed/d(�G d0d1„ d1e!e$ƒƒZIed2d(�G d3d4„ d4e!e$ƒƒZJG d5d6„ d6e$ƒZKG d7d8„ d8e$ƒZLG d9d:„ d:e$ƒZMG d;d<„ d<e$ƒZNG d=d>„ d>eIƒZOG d?d@„ d@eIƒZPedAd(�G dBdC„ dCe!e$ƒƒZQG dDdE„ dEeQƒZRedFd(�G dGdH„ dHe$ƒƒZSedId(�G dJdK„ dKe!e$ƒƒZTG dLdM„ dMe#e"ƒZUG dNdO„ dOeUƒZVedPd(�G dQdR„ dRe$ƒƒZWG dSdT„ dTe!e$ƒZXG dUdV„ dVe$ƒZYG dWdX„ dXeYƒZZG dYdZ„ dZeYƒZ[dS )[é    N)Údefaultdict©ÚDecimal)ÚUUID)ÚEmptyResultSetÚ
FieldErrorÚFullResultSet)ÚDatabaseErrorÚNotSupportedErrorÚ
connection)Úfields)Ú
LOOKUP_SEP)ÚQ)Údeconstructible)ÚRemovedInDjango50Warning)Úcached_property)Úmake_hashablec                   @   s   e Zd ZdZdd„ ZdS )ÚSQLiteNumericMixinzp
    Some expressions with output_field=DecimalField() must be cast to
    numeric to be properly filtered.
    c                 K   sL   | j ||f|Ž\}}z| j ¡ dkr,d| }W n tk
rB   Y nX ||fS )NÚDecimalFieldzCAST(%s AS NUMERIC))Úas_sqlÚoutput_fieldÚget_internal_typer   )ÚselfÚcompilerr   Úextra_contextÚsqlÚparams© r   údc:\users\snmko\desktop\web_content\django_cbt\venv\Lib\site-packages\django/db/models/expressions.pyÚ	as_sqlite   s    zSQLiteNumericMixin.as_sqliteN)Ú__name__Ú
__module__Ú__qualname__Ú__doc__r   r   r   r   r   r      s   r   c                   @   s  e Zd ZdZdZdZdZdZdZdZ	dZ
d	Zd
ZdZ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 d1d2„ Z!d3d4„ Z"d5d6„ Z#d7d8„ Z$d9d:„ Z%d;d<„ Z&d=d>„ Z'd?d@„ Z(dAS )BÚ
Combinablezu
    Provide the ability to combine one or two objects with
    some connector. For example F('foo') + F('bar').
    ú+ú-Ú*ú/ú^z%%ú&ú|z<<z>>ú#c                 C   s.   t |dƒst|ƒ}|r"t||| ƒS t| ||ƒS )NÚresolve_expression)ÚhasattrÚValueÚCombinedExpression)r   ÚotherÚ	connectorÚreversedr   r   r   Ú_combine>   s
    
zCombinable._combinec                 C   s   |   d| jd¡S )NéÿÿÿÿF©r4   ÚMUL©r   r   r   r   Ú__neg__K   s    zCombinable.__neg__c                 C   s   |   || jd¡S ©NF©r4   ÚADD©r   r1   r   r   r   Ú__add__N   s    zCombinable.__add__c                 C   s   |   || jd¡S r:   ©r4   ÚSUBr=   r   r   r   Ú__sub__Q   s    zCombinable.__sub__c                 C   s   |   || jd¡S r:   r6   r=   r   r   r   Ú__mul__T   s    zCombinable.__mul__c                 C   s   |   || jd¡S r:   ©r4   ÚDIVr=   r   r   r   Ú__truediv__W   s    zCombinable.__truediv__c                 C   s   |   || jd¡S r:   ©r4   ÚMODr=   r   r   r   Ú__mod__Z   s    zCombinable.__mod__c                 C   s   |   || jd¡S r:   ©r4   ÚPOWr=   r   r   r   Ú__pow__]   s    zCombinable.__pow__c                 C   s4   t | ddƒr(t |ddƒr(t| ƒt|ƒ@ S tdƒ‚d S ©NÚconditionalFúFUse .bitand(), .bitor(), and .bitxor() for bitwise logical operations.©Úgetattrr   ÚNotImplementedErrorr=   r   r   r   Ú__and__`   s
    ÿzCombinable.__and__c                 C   s   |   || jd¡S r:   )r4   ÚBITANDr=   r   r   r   Úbitandg   s    zCombinable.bitandc                 C   s   |   || jd¡S r:   )r4   ÚBITLEFTSHIFTr=   r   r   r   Úbitleftshiftj   s    zCombinable.bitleftshiftc                 C   s   |   || jd¡S r:   )r4   ÚBITRIGHTSHIFTr=   r   r   r   Úbitrightshiftm   s    zCombinable.bitrightshiftc                 C   s4   t | ddƒr(t |ddƒr(t| ƒt|ƒA S tdƒ‚d S rL   rO   r=   r   r   r   Ú__xor__p   s
    ÿzCombinable.__xor__c                 C   s   |   || jd¡S r:   )r4   ÚBITXORr=   r   r   r   Úbitxorw   s    zCombinable.bitxorc                 C   s4   t | ddƒr(t |ddƒr(t| ƒt|ƒB S tdƒ‚d S rL   rO   r=   r   r   r   Ú__or__z   s
    ÿzCombinable.__or__c                 C   s   |   || jd¡S r:   )r4   ÚBITORr=   r   r   r   Úbitor�   s    zCombinable.bitorc                 C   s   |   || jd¡S ©NTr;   r=   r   r   r   Ú__radd__„   s    zCombinable.__radd__c                 C   s   |   || jd¡S r_   r?   r=   r   r   r   Ú__rsub__‡   s    zCombinable.__rsub__c                 C   s   |   || jd¡S r_   r6   r=   r   r   r   Ú__rmul__Š   s    zCombinable.__rmul__c                 C   s   |   || jd¡S r_   rC   r=   r   r   r   Ú__rtruediv__�   s    zCombinable.__rtruediv__c                 C   s   |   || jd¡S r_   rF   r=   r   r   r   Ú__rmod__�   s    zCombinable.__rmod__c                 C   s   |   || jd¡S r_   rI   r=   r   r   r   Ú__rpow__“   s    zCombinable.__rpow__c                 C   s   t dƒ‚d S ©NrN   ©rQ   r=   r   r   r   Ú__rand__–   s    ÿzCombinable.__rand__c                 C   s   t dƒ‚d S rf   rg   r=   r   r   r   Ú__ror__›   s    ÿzCombinable.__ror__c                 C   s   t dƒ‚d S rf   rg   r=   r   r   r   Ú__rxor__    s    ÿzCombinable.__rxor__c                 C   s   t | ƒS ©N)ÚNegatedExpressionr8   r   r   r   Ú
__invert__¥   s    zCombinable.__invert__N))r    r!   r"   r#   r<   r@   r7   rD   rJ   rG   rS   r]   rU   rW   rZ   r4   r9   r>   rA   rB   rE   rH   rK   rR   rT   rV   rX   rY   r[   r\   r^   r`   ra   rb   rc   rd   re   rh   ri   rj   rm   r   r   r   r   r$   %   sL   r$   c                   @   sX  e Zd ZdZeZdZdZdZdZ	dGdd„Z
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edd„ ƒZedd„ ƒZdHdd„Zedd„ ƒZedd „ ƒZed!d"„ ƒZed#d$„ ƒZd%d&„ Zed'd(„ ƒZed)d*„ ƒZd+d,„ Z d-d.„ Z!d/d0„ Z"d1d2„ Z#d3d4„ Z$d5d6„ Z%d7d8„ Z&d9d:„ Z'd;d<„ Z(d=d>„ Z)d?d@„ Z*dAdB„ Z+dCdD„ Z,dEdF„ Z-dS )IÚBaseExpressionz%Base class for all query expressions.FTNc                 C   s   |d k	r|| _ d S rk   ©r   ©r   r   r   r   r   Ú__init__µ   s    zBaseExpression.__init__c                 C   s   | j  ¡ }| dd ¡ |S )NÚconvert_value)Ú__dict__ÚcopyÚpop)r   Ústater   r   r   Ú__getstate__¹   s    
zBaseExpression.__getstate__c                 C   s$   | j | jkrg n| j g| j |¡ S rk   )rr   Ú_convert_value_noopr   Úget_db_converters©r   r   r   r   r   ry   ¾   s
    
ÿ
üz BaseExpression.get_db_convertersc                 C   s   g S rk   r   r8   r   r   r   Úget_source_expressionsÅ   s    z%BaseExpression.get_source_expressionsc                 C   s   |rt ‚d S rk   )ÚAssertionError©r   Úexprsr   r   r   Úset_source_expressionsÈ   s    z%BaseExpression.set_source_expressionsc                 G   s   dd„ |D ƒS )Nc                 S   s4   g | ],}t |d ƒr|nt|tƒr(t|ƒnt|ƒ‘qS ©r-   )r.   Ú
isinstanceÚstrÚ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().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.

        Return: (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()Nrg   ©r   r   r   r   r   r   r   Ó   s    zBaseExpression.as_sqlc                 C   s   t dd„ |  ¡ D ƒƒS )Nc                 s   s   | ]}|o|j V  qd S rk   )Úcontains_aggregate©r…   Úexprr   r   r   Ú	<genexpr>ñ   s    z4BaseExpression.contains_aggregate.<locals>.<genexpr>©Úanyr{   r8   r   r   r   r‹   ï   s    ÿz!BaseExpression.contains_aggregatec                 C   s   t dd„ |  ¡ D ƒƒS )Nc                 s   s   | ]}|o|j V  qd S rk   )Úcontains_over_clauserŒ   r   r   r   rŽ   ÷   s    z6BaseExpression.contains_over_clause.<locals>.<genexpr>r�   r8   r   r   r   r‘   õ   s    ÿz#BaseExpression.contains_over_clausec                 C   s   t dd„ |  ¡ D ƒƒS )Nc                 s   s   | ]}|o|j V  qd S rk   )Úcontains_column_referencesrŒ   r   r   r   rŽ   ý   s   ÿz<BaseExpression.contains_column_references.<locals>.<genexpr>r�   r8   r   r   r   r’   û   s    þz)BaseExpression.contains_column_referencesc                 C   s   t dd„ |  ¡ D ƒƒS )Nc                 s   s$   | ]}|ot |d dƒp|jV  qdS )ÚsubqueryFN)rP   Úcontains_subqueryrŒ   r   r   r   rŽ     s   ÿz3BaseExpression.contains_subquery.<locals>.<genexpr>r�   r8   r   r   r   r”     s    þz BaseExpression.contains_subqueryc                    s4   |   ¡ }ˆ|_| ‡ ‡‡‡fdd„| ¡ D ƒ¡ |S )a
  
        Provide 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

        Return: an Expression to be added to the query.
        c                    s$   g | ]}|r|  ˆˆ ˆˆ¡nd ‘qS rk   r€   rŒ   ©Úallow_joinsÚqueryÚreuseÚ	summarizer   r   r‡     s   þÿz5BaseExpression.resolve_expression.<locals>.<listcomp>)rt   Ú
is_summaryr   r{   ©r   r—   r–   r˜   r™   Úfor_saveÚcr   r•   r   r-   	  s    üÿz!BaseExpression.resolve_expressionc                 C   s   t | jtjƒS rk   )r�   r   r   ÚBooleanFieldr8   r   r   r   rM   &  s    zBaseExpression.conditionalc                 C   s   | j S rk   ro   r8   r   r   r   Úfield*  s    zBaseExpression.fieldc                 C   s"   |   ¡ }|dkrd| _tdƒ‚|S )z+Return the output type of this expressions.NTz4Cannot resolve expression type, unknown output_field)Ú_resolve_output_fieldÚ_output_field_resolved_to_noner   rp   r   r   r   r   .  s
    zBaseExpression.output_fieldc                 C   s*   z| j W S  tk
r$   | js ‚ Y nX dS )z†
        Return the output field of this expression, or None if
        _resolve_output_field() didn't return an output type.
        N)r   r   r¡   r8   r   r   r   Ú_output_field_or_none7  s
    z$BaseExpression._output_field_or_nonec                 C   sT   dd„ |   ¡ D ƒ}|D ]8}|D ](}t||jƒstd|jj|jjf ƒ‚q|  S dS )a}  
        Attempt to infer the output type of the expression.

        As a guess, if the output fields of all source fields match then simply
        infer the same type here.

        If a source's output field resolves to None, exclude it from this check.
        If all sources are None, then an error is raised higher up the stack in
        the output_field property.
        c                 s   s   | ]}|d k	r|V  qd S rk   r   )r…   Úsourcer   r   r   rŽ   Q  s     z7BaseExpression._resolve_output_field.<locals>.<genexpr>zCExpression contains mixed types: %s, %s. You must set output_field.N)Úget_source_fieldsr�   Ú	__class__r   r    )r   Zsources_iterr   r£   r   r   r   r    C  s    ÿþþÿz$BaseExpression._resolve_output_fieldc                 C   s   | S rk   r   ©ÚvalueÚ
expressionr   r   r   r   rx   a  s    z"BaseExpression._convert_value_noopc                 C   sF   | j }| ¡ }|dkrdd„ S | d¡r0dd„ S |dkr@dd„ S | j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.
        Ú
FloatFieldc                 S   s   | d krd S t | ƒS rk   )Úfloatr¦   r   r   r   Ú<lambda>p  s    ÿz.BaseExpression.convert_value.<locals>.<lambda>ÚIntegerFieldc                 S   s   | d krd S t | ƒS rk   )Úintr¦   r   r   r   r«   v  s    ÿr   c                 S   s   | d krd S t | ƒS rk   r   r¦   r   r   r   r«   |  s    ÿ)r   r   Úendswithrx   )r   rŸ   Zinternal_typer   r   r   rr   e  s    ÿ
ÿÿzBaseExpression.convert_valuec                 C   s   | j  |¡S rk   )r   Ú
get_lookup)r   Úlookupr   r   r   r¯   ‚  s    zBaseExpression.get_lookupc                 C   s   | j  |¡S rk   )r   Úget_transform©r   Únamer   r   r   r±   …  s    zBaseExpression.get_transformc                    s(   |   ¡ }| ‡ fdd„|  ¡ D ƒ¡ |S )Nc                    s"   g | ]}|d k	r|  ˆ ¡nd ‘qS rk   )Úrelabeled_clone©r…   Úe©Ú
change_mapr   r   r‡   ‹  s   ÿz2BaseExpression.relabeled_clone.<locals>.<listcomp>©rt   r   r{   )r   r¸   Úcloner   r·   r   r´   ˆ  s    
þÿzBaseExpression.relabeled_clonec                    s>   ˆ   | ¡ }r|S |  ¡ }| ¡ }| ‡ fdd„|D ƒ¡ |S )Nc                    s   g | ]}|r|  ˆ ¡nd ‘qS rk   )Úreplace_expressionsrŒ   ©Úreplacementsr   r   r‡   ˜  s   ÿz6BaseExpression.replace_expressions.<locals>.<listcomp>)Úgetrt   r{   r   )r   r½   Úreplacementrº   Úsource_expressionsr   r¼   r   r»   ’  s    
þÿz"BaseExpression.replace_expressionsc                 C   s$   t ƒ }|  ¡ D ]}|| ¡ O }q|S rk   )Úsetr{   Úget_refs)r   Úrefsr�   r   r   r   rÂ   Ÿ  s    zBaseExpression.get_refsc                 C   s
   t   | ¡S rk   ©rt   r8   r   r   r   rt   ¥  s    zBaseExpression.copyc                    s(   |   ¡ }| ‡ fdd„|  ¡ D ƒ¡ |S )Nc                    s2   g | ]*}t |tƒr$tˆ › |j› �ƒn| ˆ ¡‘qS r   )r�   rƒ   r³   Úprefix_referencesrŒ   ©Úprefixr   r   r‡   «  s   þÿz4BaseExpression.prefix_references.<locals>.<listcomp>r¹   )r   rÇ   rº   r   rÆ   r   rÅ   ¨  s    
üÿz BaseExpression.prefix_referencesc                 C   s0   | j s| gS g }|  ¡ D ]}| | ¡ ¡ q|S rk   )r‹   r{   ÚextendÚget_group_by_cols©r   Úcolsr£   r   r   r   rÉ   ´  s    z BaseExpression.get_group_by_colsc                 C   s   dd„ |   ¡ D ƒS )z9Return the underlying field types used by this aggregate.c                 S   s   g | ]
}|j ‘qS r   )r¢   rµ   r   r   r   r‡   ¾  s     z4BaseExpression.get_source_fields.<locals>.<listcomp>)r{   r8   r   r   r   r¤   ¼  s    z BaseExpression.get_source_fieldsc                 K   s   t | f|ŽS rk   ©ÚOrderBy©r   Úkwargsr   r   r   ÚascÀ  s    zBaseExpression.ascc                 K   s   t | fddi|—ŽS ©NÚ
descendingTrÌ   rÎ   r   r   r   ÚdescÃ  s    zBaseExpression.descc                 C   s   | S rk   r   r8   r   r   r   Úreverse_orderingÆ  s    zBaseExpression.reverse_orderingc                 c   s<   | V  |   ¡ D ](}|rt|dƒr0| ¡ E dH  q|V  qdS )zi
        Recursively yield this expression and all subexpressions, in
        depth-first order.
        ÚflattenN)r{   r.   rÕ   )r   r�   r   r   r   rÕ   É  s    
zBaseExpression.flattenc                 C   s$   t | jdƒr| j |||¡S ||fS )z†
        Custom format for select clauses. For example, EXISTS expressions need
        to be wrapped in CASE WHEN on Oracle.
        Úselect_format)r.   r   rÖ   ©r   r   r   r   r   r   r   rÖ   Ö  s    zBaseExpression.select_format)N)NTNFF).r    r!   r"   r#   ÚNotImplementedÚempty_result_set_valuerš   r¡   Z
filterableÚwindow_compatiblerq   rw   ry   r{   r   r‰   r   r   r‹   r‘   r’   r”   r-   ÚpropertyrM   rŸ   r   r¢   r    Ústaticmethodrx   rr   r¯   r±   r´   r»   rÂ   rt   rÅ   rÉ   r¤   rÐ   rÓ   rÔ   rÕ   rÖ   r   r   r   r   rn   ©   sl   




         ÿ







rn   c                   @   s,   e Zd ZdZedd„ ƒZdd„ Zdd„ ZdS )	Ú
Expressionz:An expression that can be combined with other expressions.c           	      C   sœ   t  | j¡}| j\}}|j||Ž}| ¡  |j ¡ }| jg}|D ]R\}}t	|t
jƒr||jrr|jrr|jjj|jf}q„t|ƒ}nt|ƒ}| ||f¡ q@t|ƒS rk   )ÚinspectÚ	signaturerq   Z_constructor_argsÚbind_partialÚapply_defaultsÚ	argumentsÚitemsr¥   r�   r   ÚFieldr³   ÚmodelÚ_metaÚlabelÚtyper   ÚappendÚtuple)	r   Zconstructor_signatureÚargsrÏ   rß   râ   Úidentityr†   r§   r   r   r   rì   ä  s    


zExpression.identityc                 C   s   t |tƒstS |j| jkS rk   )r�   rÝ   rØ   rì   r=   r   r   r   Ú__eq__÷  s    
zExpression.__eq__c                 C   s
   t | jƒS rk   )Úhashrì   r8   r   r   r   Ú__hash__ü  s    zExpression.__hash__N)r    r!   r"   r#   r   rì   rí   rï   r   r   r   r   rÝ   à  s
   
rÝ   c                 C   s<   i | ]4}|t jt jt jft jt jt jft jt jt jfg“qS r   )r   r¬   r©   r   ©r…   r2   r   r   r   Ú
<dictcomp>
  s   ûýrñ   c              	   C   sJ   i | ]B}|t jt jt jft jt jt jft jt jt jft jt jt jfg“qS r   )r   r¬   r   r©   rð   r   r   r   rñ     s   úüc                 C   s    i | ]}|t jt jt jfg“qS r   )r   r¬   rð   r   r   r   rñ   ,  s   ýÿc                 C   s8   i | ]0}t jt jt jfD ]}||t|ft||fg“qqS r   )r   r¬   r   r©   ÚNoneType)r…   r2   Z
field_typer   r   r   rñ   9  s    ôþc                 C   s   t |  | ||f¡ dS )zÂ
    Register combinable types:
        lhs <connector> rhs -> result
    e.g.
        register_combinable_fields(
            IntegerField, Combinable.ADD, FloatField, FloatField
        )
    N)Ú_connector_combinatorsré   )Úlhsr2   ÚrhsÚresultr   r   r   Úregister_combinable_fieldsl  s    	r÷   é€   )Úmaxsizec                 C   s<   t  | d¡}|D ]&\}}}t||ƒrt||ƒr|  S qd S )Nr   )ró   r¾   Ú
issubclass)r2   Úlhs_typeÚrhs_typeZcombinatorsZcombinator_lhs_typeZcombinator_rhs_typeÚcombined_typer   r   r   Ú_resolve_combined_type~  s     ÿrþ   c                       sX   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„ Z	ddd„Z
‡  ZS )r0   Nc                    s$   t ƒ j|d� || _|| _|| _d S ©Nro   )Úsuperrq   r2   rô   rõ   )r   rô   r2   rõ   r   ©r¥   r   r   rq   ‰  s    zCombinedExpression.__init__c                 C   s   d  | jj| ¡S )Nz<{}: {}>)Úformatr¥   r    r8   r   r   r   Ú__repr__�  s    zCombinedExpression.__repr__c                 C   s   d  | j| j| j¡S )Nz{} {} {})r  rô   r2   rõ   r8   r   r   r   Ú__str__’  s    zCombinedExpression.__str__c                 C   s   | j | jgS rk   ©rô   rõ   r8   r   r   r   r{   •  s    z)CombinedExpression.get_source_expressionsc                 C   s   |\| _ | _d S rk   r  r}   r   r   r   r   ˜  s    z)CombinedExpression.set_source_expressionsc                 C   sZ   t | jt| jjƒt| jjƒƒ}|d krTtd| j›d| jjjj	› d| jjjj	› d�ƒ‚|ƒ S )NzCannot infer type of z# expression involving these types: ú, z. You must set output_field.)
rþ   r2   rè   rô   r¢   rõ   r   r   r¥   r    )r   rý   r   r   r   r    ›  s    

ý(ÿz(CombinedExpression._resolve_output_fieldc                 C   sp   g }g }|  | j¡\}}| |¡ | |¡ |  | j¡\}}| |¡ | |¡ d}|j | j|¡}|| |fS ©Nz(%s))Úcompilerô   ré   rÈ   rõ   ÚopsZcombine_expressionr2   ©r   r   r   rˆ   Zexpression_paramsr   r   Zexpression_wrapperr   r   r   r   ¬  s    



zCombinedExpression.as_sqlTFc              	   C   s*  | j  |||||¡}| j |||||¡}t| ttfƒ�sz|j ¡ }W n tt	fk
rb   d }Y nX z|j ¡ }	W n tt	fk
rŽ   d }	Y nX d||	hkrÄ||	krÄt| j | j
| jƒ |||||¡S dddh}
| j
| jk�r||
k�r||	k�rt| j | jƒ |||||¡S |  ¡ }||_||_ ||_|S )NÚDurationFieldÚ	DateFieldÚDateTimeFieldÚ	TimeField)rô   r-   rõ   r�   ÚDurationExpressionÚTemporalSubtractionr   r   ÚAttributeErrorr   r2   r@   rt   rš   )r   r—   r–   r˜   r™   rœ   rô   rõ   rû   rü   Zdatetime_fieldsr�   r   r   r   r-   º  sl        ÿ    ÿ

  ÿù	

ÿþýûz%CombinedExpression.resolve_expression)N)NTNFF)r    r!   r"   rq   r  r  r{   r   r    r   r-   Ú__classcell__r   r   r  r   r0   ˆ  s            ÿr0   c                       s,   e Zd Zdd„ Z‡ fdd„Zdd„ Z‡  ZS )r  c                 C   sT   z
|j }W n tk
r   Y n,X | ¡ dkrJ| |¡\}}|j |¡|fS | |¡S )Nr  )r   r   r   r  r	  Zformat_for_duration_arithmetic)r   Zsider   r   Úoutputr   r   r   r   r   r  ë  s    
zDurationExpression.compilec                    sš   |j jrtƒ  ||¡S |j | ¡ g }g }|  | j||¡\}}| |¡ | 	|¡ |  | j
||¡\}}| |¡ | 	|¡ d}|j | j|¡}|| |fS r  )ÚfeaturesZhas_native_duration_fieldr   r   r	  Úcheck_expression_supportr  rô   ré   rÈ   rõ   Zcombine_duration_expressionr2   r
  r  r   r   r   ö  s    



zDurationExpression.as_sqlc           	   	   K   s’   | j ||f|Ž\}}| jtjtjhkrŠz| jj ¡ }| jj ¡ }W n t	t
fk
rZ   Y n0X ddddh}||ksx||krŠtd| j› d�ƒ‚||fS )Nr   r  r©   r¬   zInvalid arguments for operator Ú.)r   r2   r$   r7   rD   rô   r   r   rõ   r  r   r	   )	r   r   r   r   r   r   rû   rü   Zallowed_fieldsr   r   r   r     s"    üÿzDurationExpression.as_sqlite)r    r!   r"   r  r   r   r  r   r   r  r   r  ê  s   r  c                       s,   e Zd Ze ¡ Z‡ fdd„Zdd„ Z‡  ZS )r  c                    s   t ƒ  || j|¡ d S rk   )r   rq   r@   )r   rô   rõ   r  r   r   rq      s    zTemporalSubtraction.__init__c                 C   s<   |j  | ¡ | | j¡}| | j¡}|j  | jj ¡ ||¡S rk   )r	  r  r  rô   rõ   Zsubtract_temporalsr   r   )r   r   r   rô   rõ   r   r   r   r   #  s    
  ÿzTemporalSubtraction.as_sql)	r    r!   r"   r   r  r   rq   r   r  r   r   r  r   r    s   r  zdjango.db.models.F)Úpathc                   @   sZ   e 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„ Zdd„ ZdS )rƒ   zDAn 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)r³   r²   r   r   r   rq   0  s    z
F.__init__c                 C   s   d  | jj| j¡S ©Nú{}({}))r  r¥   r    r³   r8   r   r   r   r  7  s    z
F.__repr__NTFc                 C   s   |  | j|||¡S rk   )Úresolve_refr³   ©r   r—   r–   r˜   r™   rœ   r   r   r   r-   :  s    zF.resolve_expressionc                 C   s   |  | | ¡S rk   )r¾   )r   r½   r   r   r   r»   ?  s    zF.replace_expressionsc                 K   s   t | f|ŽS rk   rÌ   rÎ   r   r   r   rÐ   B  s    zF.ascc                 K   s   t | fddi|—ŽS rÑ   rÌ   rÎ   r   r   r   rÓ   E  s    zF.descc                 C   s   | j |j ko| j|jkS rk   )r¥   r³   r=   r   r   r   rí   H  s    zF.__eq__c                 C   s
   t | jƒS rk   )rî   r³   r8   r   r   r   rï   K  s    z
F.__hash__c                 C   s
   t   | ¡S rk   rÄ   r8   r   r   r   rt   N  s    zF.copy)NTNFF)r    r!   r"   r#   rq   r  r-   r»   rÐ   rÓ   rí   rï   rt   r   r   r   r   rƒ   ,  s            ÿ
rƒ   c                       s@   e Zd ZdZdZdZdd„ Z‡ fdd„Zdd„ Zd	d
„ Z	‡  Z
S )ÚResolvedOuterRefz¿
    An object that contains a reference to an outer query.

    In this case, the reference to the outer query has been resolved because
    the inner query has been used as a subquery.
    Fc                 O   s   t dƒ‚d S )NzXThis queryset contains a reference to an outer query and may only be used in a subquery.)Ú
ValueError©r   rë   rÏ   r   r   r   r   ]  s    ÿzResolvedOuterRef.as_sqlc                    s6   t ƒ j||Ž}|jr&td| j› d�ƒ‚t| jk|_|S )Nz<Referencing outer query window expression is not supported: r  )r   r-   r‘   r
   r³   r   Úpossibly_multivalued)r   rë   rÏ   Úcolr  r   r   r-   c  s    ÿz#ResolvedOuterRef.resolve_expressionc                 C   s   | S rk   r   ©r   Úrelabelsr   r   r   r´   p  s    z ResolvedOuterRef.relabeled_clonec                 C   s   g S rk   r   r8   r   r   r   rÉ   s  s    z"ResolvedOuterRef.get_group_by_cols)r    r!   r"   r#   r‹   r‘   r   r-   r´   rÉ   r  r   r   r  r   r  R  s   r  c                   @   s$   e Zd ZdZdZdd„ Zdd„ ZdS )ÚOuterRefFc                 O   s   t | j| jƒr| jS t| jƒS rk   )r�   r³   r¥   r  r  r   r   r   r-   {  s    zOuterRef.resolve_expressionc                 C   s   | S rk   r   r!  r   r   r   r´   €  s    zOuterRef.relabeled_cloneN)r    r!   r"   r‹   r‘   r-   r´   r   r   r   r   r#  w  s   r#  zdjango.db.models.Funcc                       sv   e Zd ZdZdZd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d„Zddd„Z‡ fdd„Z‡  ZS )ÚFunczAn SQL function call.Nz%(function)s(%(expressions)s)r  ro   c                   sh   | j d k	rDt|ƒ| j krDtd| jj| j | j dkr4dndt|ƒf ƒ‚tƒ j|d� | j|Ž | _|| _	d S )Nz#'%s' takes exactly %s %s (%s given)é   Zargumentrâ   ro   )
ÚarityÚlenÚ	TypeErrorr¥   r    r   rq   r‰   rÀ   Úextra)r   r   rˆ   r)  r  r   r   rq   �  s    üÿÿ	zFunc.__init__c                 C   sh   | j  dd„ | jD ƒ¡}| j|  ¡ –}|rXd dd„ t| ¡ ƒD ƒ¡}d | jj	||¡S d | jj	|¡S )Nc                 s   s   | ]}t |ƒV  qd S rk   ©r‚   r„   r   r   r   rŽ   �  s     z Func.__repr__.<locals>.<genexpr>r  c                 s   s&   | ]\}}t |ƒd  t |ƒ V  qdS )ú=Nr*  )r…   ÚkeyÚvalr   r   r   rŽ      s    ú
{}({}, {})r  )
Ú
arg_joinerÚjoinrÀ   r)  Ú_get_repr_optionsÚsortedrã   r  r¥   r    )r   rë   r)  r   r   r   r  œ  s    

ÿzFunc.__repr__c                 C   s   i S )zAReturn a dict of extra __init__() options to include in the repr.r   r8   r   r   r   r1  ¦  s    zFunc._get_repr_optionsc                 C   s   | j S rk   ©rÀ   r8   r   r   r   r{   ª  s    zFunc.get_source_expressionsc                 C   s
   || _ d S rk   r3  r}   r   r   r   r   ­  s    zFunc.set_source_expressionsTFc           	      C   s>   |   ¡ }||_t|jƒD ] \}}| |||||¡|j|< q|S rk   )rt   rš   Ú	enumeraterÀ   r-   )	r   r—   r–   r˜   r™   rœ   r�   Úposr†   r   r   r   r-   °  s        ÿzFunc.resolve_expressionc              	   K   s  |j  | ¡ g }g }| jD ]Œ}	z| |	¡\}
}W n` tk
rl   t|	dtƒ}|tkrV‚ | t|ƒ¡\}
}Y n& tk
r�   | tdƒ¡\}
}Y nX | 	|
¡ | 
|¡ q| j|–}|d k	rÄ||d< n| d| j¡ |pâ| d| j¡}|pô| d| j¡}| |¡ |d< |d< || |fS )NrÙ   TÚfunctionÚtemplater/  rˆ   rŸ   )r	  r  rÀ   r  r   rP   rØ   r/   r   ré   rÈ   r)  Ú
setdefaultr6  r¾   r7  r/  r0  )r   r   r   r6  r7  r/  r   Z	sql_partsr   r†   Zarg_sqlZ
arg_paramsrÙ   Údatar   r   r   r   »  s6    	
  ÿ


zFunc.as_sqlc                    s*   t ƒ  ¡ }| jd d … |_| j ¡ |_|S rk   )r   rt   rÀ   r)  )r   rt   r  r   r   rt   â  s    
z	Func.copy)NTNFF)NNN)r    r!   r"   r#   r6  r7  r/  r&  rq   r  r1  r{   r   r-   r   rt   r  r   r   r  r   r$  „  s*   
         ÿ
   ú
'r$  zdjango.db.models.Valuec                       s`   e Zd ZdZdZd‡ fdd„	Zdd„ Zdd	„ Zd‡ fdd„	Zdd„ Z	dd„ Z
edd„ ƒZ‡  ZS )r/   z9Represent a wrapped value as a node within an expression.FNc                    s   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().
        ro   N)r   rq   r§   )r   r§   r   r  r   r   rq   ñ  s    	zValue.__init__c                 C   s   | j j› d| j›d�S )Nú(ú))r¥   r    r§   r8   r   r   r   r  ý  s    zValue.__repr__c                 C   s|   |j  | ¡ | j}| j}|d k	rb| jr6|j||d�}n|j||d�}t|dƒrb| |||¡|gfS |d krrdg fS d|gfS )N)r   Úget_placeholderÚNULLz%s)	r	  r  r§   r¢   rœ   Zget_db_prep_saveZget_db_prep_valuer.   r<  )r   r   r   r-  r   r   r   r   r      s    
zValue.as_sqlTc                    s   t ƒ  |||||¡}||_|S rk   )r   r-   rœ   r›   r  r   r   r-     s    zValue.resolve_expressionc                 C   s   g S rk   r   r8   r   r   r   rÉ     s    zValue.get_group_by_colsc                 C   sè   t | jtƒrt ¡ S t | jtƒr(t ¡ S t | jtƒr<t ¡ S t | jt	ƒrPt 
¡ S t | jtjƒrft ¡ S t | jtjƒr|t ¡ S t | jtjƒr’t ¡ S t | jtjƒr¨t ¡ S t | jtƒr¼t ¡ S t | jtƒrÐt ¡ S t | jtƒrät ¡ S d S rk   )r�   r§   r‚   r   Z	CharFieldÚboolrž   r­   r¬   rª   r©   Údatetimer  Údater  Útimer  Ú	timedeltar  r   r   ÚbytesZBinaryFieldr   Z	UUIDFieldr8   r   r   r   r      s,    zValue._resolve_output_fieldc                 C   s   | j S rk   )r§   r8   r   r   r   rÙ   4  s    zValue.empty_result_set_value)N)NTNFF)r    r!   r"   r#   rœ   rq   r  r   r-   rÉ   r    rÛ   rÙ   r  r   r   r  r   r/   é  s            ÿr/   c                       sD   e Zd Zd‡ fdd„	Zdd„ Zdd„ Zdd	„ Zd‡ fdd„	Z‡  ZS )ÚRawSQLNc                    s0   |d krt  ¡ }|| | _| _tƒ j|d� d S rÿ   )r   rä   r   r   r   rq   )r   r   r   r   r  r   r   rq   :  s    zRawSQL.__init__c                 C   s   d  | jj| j| j¡S ©Nr.  )r  r¥   r    r   r   r8   r   r   r   r  @  s    zRawSQL.__repr__c                 C   s   d| j  | jfS r  )r   r   rŠ   r   r   r   r   C  s    zRawSQL.as_sqlc                 C   s   | gS rk   r   r8   r   r   r   rÉ   F  s    zRawSQL.get_group_by_colsTFc           
         sn   |j rZ|j j ¡ D ]F}|jjD ]8}| ¡ \}}	|	 ¡ | j ¡ kr| |j|||¡  qqqt	ƒ  
|||||¡S rk   )rå   ræ   Zget_parent_listZlocal_fieldsZget_attname_columnÚlowerr   r  r³   r   r-   )
r   r—   r–   r˜   r™   rœ   ÚparentZparent_fieldÚ_Zcolumn_namer  r   r   r-   I  s&       ÿ    ÿzRawSQL.resolve_expression)N)NTNFF)	r    r!   r"   rq   r  r   rÉ   r-   r  r   r   r  r   rD  9  s            ÿrD  c                   @   s   e Zd Zdd„ Zdd„ ZdS )ÚStarc                 C   s   dS )Nz'*'r   r8   r   r   r   r  \  s    zStar.__repr__c                 C   s   dg fS )Nr'   r   rŠ   r   r   r   r   _  s    zStar.as_sqlN)r    r!   r"   r  r   r   r   r   r   rI  [  s   rI  c                       sN   e Zd 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
‡  ZS )ÚColTFNc                    s,   |d kr|}t ƒ j|d� || | _| _d S rÿ   )r   rq   ÚaliasÚtarget)r   rK  rL  r   r  r   r   rq   g  s    zCol.__init__c                 C   s>   | j | j }}|r|t|ƒfnt|ƒf}d | jjd |¡¡S )Nr  r  )rK  rL  r‚   r  r¥   r    r0  )r   rK  rL  Úidentifiersr   r   r   r  m  s    zCol.__repr__c                 C   s<   | j | jj }}|r||fn|f}d t|j|ƒ¡}|g fS )Nr  )rK  rL  Úcolumnr0  ÚmapZquote_name_unless_alias)r   r   r   rK  rN  rM  r   r   r   r   r   r  s    z
Col.as_sqlc                 C   s,   | j d kr| S |  | | j | j ¡| j| j¡S rk   )rK  r¥   r¾   rL  r   r!  r   r   r   r´   x  s    
  ÿzCol.relabeled_clonec                 C   s   | gS rk   r   r8   r   r   r   rÉ     s    zCol.get_group_by_colsc                 C   s0   | j | jkr| j |¡S | j |¡| j  |¡ S rk   )rL  r   ry   rz   r   r   r   ry   ‚  s    ÿ
þzCol.get_db_converters)N)r    r!   r"   r’   r  rq   r  r   r´   rÉ   ry   r  r   r   r  r   rJ  c  s   rJ  c                       sb   e Zd ZdZ‡ f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‡  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 ƒ  ¡  || | _| _d S rk   )r   rq   rÃ   r£   )r   rÃ   r£   r  r   r   rq   �  s    
zRef.__init__c                 C   s   d  | jj| j| j¡S rE  )r  r¥   r    rÃ   r£   r8   r   r   r   r  ”  s    zRef.__repr__c                 C   s   | j gS rk   ©r£   r8   r   r   r   r{   —  s    zRef.get_source_expressionsc                 C   s   |\| _ d S rk   rQ  r}   r   r   r   r   š  s    zRef.set_source_expressionsNTFc                 C   s   | S rk   r   r  r   r   r   r-   �  s    zRef.resolve_expressionc                 C   s   | j hS rk   )rÃ   r8   r   r   r   rÂ   ¤  s    zRef.get_refsc                 C   s   |   ¡ }| j |¡|_|S rk   )rt   r£   r´   )r   r"  rº   r   r   r   r´   §  s    zRef.relabeled_clonec                 C   s   |j  | j¡g fS rk   )r	  Z
quote_namerÃ   rŠ   r   r   r   r   ¬  s    z
Ref.as_sqlc                 C   s   | gS rk   r   r8   r   r   r   rÉ   ¯  s    zRef.get_group_by_cols)NTNFF)r    r!   r"   r#   rq   r  r{   r   r-   rÂ   r´   r   rÉ   r  r   r   r  r   rP  Š  s            ÿ
rP  c                       s<   e Zd ZdZdZ‡ fdd„Zdd„ Zdd„ Zd	d
„ Z‡  Z	S )ÚExpressionListz¬
    An expression containing multiple expressions. Can be used to provide a
    list of expressions as an argument to another expression, like a partition
    clause.
    z%(expressions)sc                    s&   |st d| jj ƒ‚tƒ j||Ž d S )Nz$%s requires at least one expression.)r  r¥   r    r   rq   ©r   rˆ   r)  r  r   r   rq   ¼  s
    
ÿzExpressionList.__init__c                 C   s   | j  dd„ | jD ƒ¡S )Nc                 s   s   | ]}t |ƒV  qd S rk   r*  r„   r   r   r   rŽ   Ä  s     z)ExpressionList.__str__.<locals>.<genexpr>)r/  r0  rÀ   r8   r   r   r   r  Ã  s    zExpressionList.__str__c                 K   s   | j ||f|ŽS rk   )r   )r   r   r   r   r   r   r   r   Æ  s    zExpressionList.as_sqlitec                 C   s$   g }|   ¡ D ]}| | ¡ ¡ q|S rk   ©r{   rÈ   rÉ   )r   Úgroup_by_colsÚ	partitionr   r   r   rÉ   Ê  s    z ExpressionList.get_group_by_cols)
r    r!   r"   r#   r7  rq   r  r   rÉ   r  r   r   r  r   rR  ³  s   rR  c                       s4   e Zd ZdZ‡ fdd„Z‡ fdd„Zdd„ Z‡  ZS )ÚOrderByListzORDER BY %(expressions)sc                    s    dd„ |D ƒ}t ƒ j||Ž d S )Nc                 s   s@   | ]8}t |tƒr4|d  dkr4tt|dd… ƒdd�n|V  qdS )r   r&   r%  NT©rÒ   )r�   r‚   rÍ   rƒ   rŒ   r   r   r   rŽ   Õ  s   ýÿ
ÿz'OrderByList.__init__.<locals>.<genexpr>)r   rq   rS  r  r   r   rq   Ô  s    úzOrderByList.__init__c                    s   | j s
dS tƒ j||ŽS )N)Ú r   )rÀ   r   r   r  r  r   r   r   ß  s    zOrderByList.as_sqlc                 C   s$   g }|   ¡ D ]}| | ¡ ¡ q|S rk   rT  )r   rU  Úorder_byr   r   r   rÉ   ä  s    zOrderByList.get_group_by_cols)r    r!   r"   r7  rq   r   rÉ   r  r   r   r  r   rW  Ñ  s   rW  z"django.db.models.ExpressionWrapperc                       sL   e Zd ZdZ‡ fdd„Zdd„ Zdd„ Z‡ fdd	„Zd
d„ Zdd„ Z	‡  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 ƒ j|d� || _d S rÿ   )r   rq   r¨   )r   r¨   r   r  r   r   rq   ò  s    zExpressionWrapper.__init__c                 C   s   |d | _ d S ©Nr   ©r¨   r}   r   r   r   r   ö  s    z(ExpressionWrapper.set_source_expressionsc                 C   s   | j gS rk   r]  r8   r   r   r   r{   ù  s    z(ExpressionWrapper.get_source_expressionsc                    s0   t | jtƒr&| j ¡ }| j|_| ¡ S tƒ  ¡ S rk   )r�   r¨   rÝ   rt   r   rÉ   r   ©r   r¨   r  r   r   rÉ   ü  s
    
z#ExpressionWrapper.get_group_by_colsc                 C   s   |  | j¡S rk   )r  r¨   rŠ   r   r   r   r     s    zExpressionWrapper.as_sqlc                 C   s   d  | jj| j¡S r  )r  r¥   r    r¨   r8   r   r   r   r    s    zExpressionWrapper.__repr__)r    r!   r"   r#   rq   r   r{   rÉ   r   r  r  r   r   r  r   r[  ë  s   	r[  c                       sJ   e Zd ZdZ‡ fdd„Zdd„ Z‡ fdd„Zd‡ fdd„	Zdd„ Z‡  Z	S )rl   z1The logical negation of a conditional expression.c                    s   t ƒ j|t ¡ d� d S rÿ   )r   rq   r   rž   r^  r  r   r   rq     s    zNegatedExpression.__init__c                 C   s
   | j  ¡ S rk   )r¨   rt   r8   r   r   r   rm     s    zNegatedExpression.__invert__c                    s€   zt ƒ  ||¡\}}W n6 tk
rL   |jj}|js:Y dS | tdƒ¡ Y S X |jj}| 	| j
¡srd|› d�|fS d|› �|fS )N)z1=1r   Tz
CASE WHEN z = 0 THEN 1 ELSE 0 ENDzNOT )r   r   r   r   r  Ú&supports_boolean_expr_in_select_clauser  r/   r	  Ú0conditional_expression_supported_in_where_clauser¨   )r   r   r   r   r   r  r	  r  r   r   r     s    zNegatedExpression.as_sqlNTFc                    s.   t ƒ  |||||¡}t|jddƒs*tdƒ‚|S )NrM   Fz*Cannot negate non-conditional expressions.)r   r-   rP   r¨   r(  )r   r—   r–   r˜   r™   rœ   Úresolvedr  r   r   r-   %  s        ÿz$NegatedExpression.resolve_expressionc                 C   s0   |j jj}|j jjs(|| jƒr(d |¡}||fS ©NzCASE WHEN {} THEN 1 ELSE 0 END)r   r	  r`  r  r_  r¨   r  )r   r   r   r   Z$expression_supported_in_where_clauser   r   r   rÖ   /  s    ÿÿý
zNegatedExpression.select_format)NTNFF)
r    r!   r"   r#   rq   rm   r   r-   rÖ   r  r   r   r  r   rl     s            ÿ
rl   zdjango.db.models.Whenc                       sj   e Zd 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
ddd„Zddd„Zdd„ Z‡  ZS )ÚWhenz"WHEN %(condition)s THEN %(result)sFNc                    sš   |r<|d krt f |Žd  }}nt|ddƒr<t |f|Žd  }}|d ksTt|ddƒrT|r\tdƒ‚t|t ƒrr|srtdƒ‚tƒ jd d� || _|  |¡d | _	d S )NrM   FzLWhen() supports a Q object, a boolean expression, or lookups as a condition.z1An empty Q() can't be used as a When() condition.ro   r   )
r   rP   r(  r�   r  r   rq   Ú	conditionr‰   rö   )r   rd  ÚthenÚlookupsr  r   r   rq   E  s    ÿzWhen.__init__c                 C   s   d| j | jf S )NzWHEN %r THEN %r©rd  rö   r8   r   r   r   r  V  s    zWhen.__str__c                 C   s   d| j j| f S ©Nz<%s: %s>©r¥   r    r8   r   r   r   r  Y  s    zWhen.__repr__c                 C   s   | j | jgS rk   rg  r8   r   r   r   r{   \  s    zWhen.get_source_expressionsc                 C   s   |\| _ | _d S rk   rg  r}   r   r   r   r   _  s    zWhen.set_source_expressionsc                 C   s
   | j jgS rk   )rö   r¢   r8   r   r   r   r¤   b  s    zWhen.get_source_fieldsTc                 C   sJ   |   ¡ }||_t|jdƒr0|j ||||d¡|_|j |||||¡|_|S )Nr-   F)rt   rš   r.   rd  r-   rö   r›   r   r   r   r-   f  s$        ÿ    ÿzWhen.resolve_expressionc                 K   s`   |j  | ¡ |}g }| | j¡\}}||d< | | j¡\}	}
|	|d< |pL| j}|| |||
˜fS )Nrd  rö   )r	  r  r  rd  rö   r7  )r   r   r   r7  r   Útemplate_paramsÚ
sql_paramsZcondition_sqlZcondition_paramsZ
result_sqlZresult_paramsr   r   r   r   t  s    
ýzWhen.as_sqlc                 C   s$   g }|   ¡ D ]}| | ¡ ¡ q|S rk   rT  rÊ   r   r   r   rÉ   ƒ  s    zWhen.get_group_by_cols)NN)NTNFF)N)r    r!   r"   r7  rM   rq   r  r  r{   r   r¤   r-   r   rÉ   r  r   r   r  r   rc  ?  s             ÿ

rc  zdjango.db.models.Casec                       s|   e Zd ZdZdZdZdddœ‡ fdd„
Zdd	„ Zd
d„ Zdd„ Z	dd„ Z
ddd„Z‡ fdd„Zddd„Z‡ fdd„Z‡  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ú N)Údefaultr   c                   sJ   t dd„ |D ƒƒstdƒ‚tƒ  |¡ t|ƒ| _|  |¡d | _|| _d S )Nc                 s   s   | ]}t |tƒV  qd S rk   )r�   rc  )r…   Úcaser   r   r   rŽ   �  s     z Case.__init__.<locals>.<genexpr>z.Positional arguments must all be When objects.r   )	Úallr(  r   rq   ÚlistÚcasesr‰   rn  r)  )r   rn  r   rr  r)  r  r   r   rq   œ  s    
zCase.__init__c                 C   s    dd  dd„ | jD ƒ¡| jf S )NzCASE %s, ELSE %rr  c                 s   s   | ]}t |ƒV  qd S rk   r*  )r…   r�   r   r   r   rŽ   ¦  s     zCase.__str__.<locals>.<genexpr>)r0  rr  rn  r8   r   r   r   r  ¤  s    þzCase.__str__c                 C   s   d| j j| f S rh  ri  r8   r   r   r   r  ª  s    zCase.__repr__c                 C   s   | j | jg S rk   ©rr  rn  r8   r   r   r   r{   ­  s    zCase.get_source_expressionsc                 C   s   |�^ | _ | _d S rk   rs  r}   r   r   r   r   °  s    zCase.set_source_expressionsTFc           	      C   sT   |   ¡ }||_t|jƒD ] \}}| |||||¡|j|< q|j |||||¡|_|S rk   )rt   rš   r4  rr  r-   rn  )	r   r—   r–   r˜   r™   rœ   r�   r5  ro  r   r   r   r-   ³  s$        ÿ    ÿzCase.resolve_expressionc                    s   t ƒ  ¡ }|jd d … |_|S rk   )r   rt   rr  )r   r�   r  r   r   rt   Á  s    
z	Case.copyc              	   K   s*  |j  | ¡ | js| | j¡S | j|–}g }g }| | j¡\}	}
| jD ]l}z| |¡\}}W n@ tk
rt   Y qFY n* tk
rœ   | |j¡\}	}
Y  q´Y nX | 	|¡ | 
|¡ qF|sÀ|	|
fS |pÈ| j}| |¡|d< |	|d< | 
|
¡ |pú| d| j¡}|| }| jd k	�r"|j  | j¡| }||fS )Nrr  rn  r7  )r	  r  rr  r  rn  r)  r   r   rö   ré   rÈ   Úcase_joinerr0  r¾   r7  r¢   Zunification_cast_sqlr   )r   r   r   r7  rt  r   rj  Z
case_partsrk  Zdefault_sqlZdefault_paramsro  Zcase_sqlZcase_paramsr   r   r   r   r   Æ  s8    




zCase.as_sqlc                    s   | j s| j ¡ S tƒ  ¡ S rk   )rr  rn  rÉ   r   r8   r  r   r   rÉ   æ  s    
zCase.get_group_by_cols)NTNFF)NN)r    r!   r"   r#   r7  rt  rq   r  r  r{   r   r-   rt   r   rÉ   r  r   r   r  r   rl  ‹  s&            ÿ
   ÿ
 rl  c                       s|   e Zd ZdZdZdZdZdZd‡ fdd„	Zdd	„ Z	d
d„ Z
dd„ Z‡ fdd„Zedd„ ƒZdd„ Zddd„Zdd„ Z‡  ZS )ÚSubqueryz”
    An explicit subquery. It may contain OuterRef() references to the outer
    query which will be resolved when it is applied to that query.
    z(%(subquery)s)FNTc                    s0   t |d|ƒ ¡ | _d| j_|| _tƒ  |¡ d S )Nr—   T)rP   rº   r—   r“   r)  r   rq   )r   Úquerysetr   r)  r  r   r   rq   ÷  s    zSubquery.__init__c                 C   s   | j gS rk   ©r—   r8   r   r   r   r{   þ  s    zSubquery.get_source_expressionsc                 C   s   |d | _ d S r\  rw  r}   r   r   r   r     s    zSubquery.set_source_expressionsc                 C   s   | j jS rk   )r—   r   r8   r   r   r   r      s    zSubquery._resolve_output_fieldc                    s   t ƒ  ¡ }|j ¡ |_|S rk   )r   rt   r—   rº   )r   rº   r  r   r   rt     s    
zSubquery.copyc                 C   s   | j jS rk   )r—   Úexternal_aliasesr8   r   r   r   rx    s    zSubquery.external_aliasesc                 C   s
   | j  ¡ S rk   )r—   Úget_external_colsr8   r   r   r   ry    s    zSubquery.get_external_colsc           	      K   sZ   |j  | ¡ | j|–}| j ||¡\}}|dd… |d< |pH| d| j¡}|| }||fS )Nr%  r5   r“   r7  )r	  r  r)  r—   r   r¾   r7  )	r   r   r   r7  r   rj  Zsubquery_sqlrk  r   r   r   r   r     s    
zSubquery.as_sqlc                 C   s   | j j| d�S )N)Úwrapper)r—   rÉ   r8   r   r   r   rÉ     s    zSubquery.get_group_by_cols)N)N)r    r!   r"   r#   r7  r‹   rÙ   r“   rq   r{   r   r    rt   rÛ   rx  ry  r   rÉ   r  r   r   r  r   ru  ì  s   


ru  c                       s4   e Zd ZdZe ¡ ZdZ‡ fdd„Zdd„ Z	‡  Z
S )ÚExistszEXISTS(%(subquery)s)Fc                    s    t ƒ j|f|Ž | j ¡ | _d S rk   )r   rq   r—   Úexists)r   rv  rÏ   r  r   r   rq   &  s    zExists.__init__c                 C   s   |j jjsd |¡}||fS rb  )r   r  r_  r  r×   r   r   r   rÖ   *  s    

zExists.select_format)r    r!   r"   r7  r   rž   r   rÙ   rq   rÖ   r  r   r   r  r   r{  !  s
   r{  zdjango.db.models.OrderByc                   @   sh   e Zd 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d„ ZdS )rÍ   z%(expression)s %(ordering)sFNc                 C   s^   |r|rt dƒ‚|dks |dkr0tjdtdd� || _|| _|| _t|dƒsTt dƒ‚|| _d S )Nz1nulls_first and nulls_last are mutually exclusiveFzNPassing nulls_first=False or nulls_last=False is deprecated, use None instead.é   )Ú
stacklevelr-   z%expression must be an expression type)	r  ÚwarningsÚwarnr   Únulls_firstÚ
nulls_lastrÒ   r.   r¨   )r   r¨   rÒ   r�  r‚  r   r   r   rq   8  s    ü
zOrderBy.__init__c                 C   s   d  | jj| j| j¡S )Nz{}({}, descending={}))r  r¥   r    r¨   rÒ   r8   r   r   r   r  M  s
      ÿzOrderBy.__repr__c                 C   s   |d | _ d S r\  r]  r}   r   r   r   r   R  s    zOrderBy.set_source_expressionsc                 C   s   | j gS rk   r]  r8   r   r   r   r{   U  s    zOrderBy.get_source_expressionsc                 K   s¾   |p| j }|jjr2| jr"d| }ql| jrld| }n:| jrP| jrF|jjsPd| }n| jrl| jsd|jjsld| }|j | ¡ | 	| j
¡\}}|| jr”dnddœ|–}|| d¡9 }||  ¡ |fS )	Nz%s NULLS LASTz%s NULLS FIRSTz%%(expression)s IS NULL, %sz%%(expression)s IS NOT NULL, %sZDESCÚASC)r¨   Zorderingz%(expression)s)r7  r  Z supports_order_by_nulls_modifierr‚  r�  rÒ   Zorder_by_nulls_firstr	  r  r  r¨   ÚcountÚrstrip)r   r   r   r7  r   Zexpression_sqlr   Zplaceholdersr   r   r   r   X  s6    


ÿÿ
ÿÿþýzOrderBy.as_sqlc                 C   sF   |j  | j¡r:|  ¡ }tt| jdd�dd�|_| ||¡S |  ||¡S )NT)re  F)rn  )r	  r`  r¨   rt   rl  rc  r   )r   r   r   rt   r   r   r   Ú	as_oracler  s    ÿþzOrderBy.as_oraclec                 C   s$   g }|   ¡ D ]}| | ¡ ¡ q|S rk   rT  rÊ   r   r   r   rÉ   €  s    zOrderBy.get_group_by_colsc                 C   s4   | j  | _ | jrd| _d | _n| jr0d| _d | _| S r_   )rÒ   r�  r‚  r8   r   r   r   rÔ   †  s    
zOrderBy.reverse_orderingc                 C   s
   d| _ d S r:   rX  r8   r   r   r   rÐ   �  s    zOrderBy.ascc                 C   s
   d| _ d S r_   rX  r8   r   r   r   rÓ   “  s    zOrderBy.desc)FNN)N)r    r!   r"   r7  rM   rq   r  r   r{   r   r†  rÉ   rÔ   rÐ   rÓ   r   r   r   r   rÍ   3  s   


rÍ   c                       sp   e Zd ZdZdZdZd‡ fdd„	Zdd„ Zd	d
„ Zdd„ Z	ddd„Z
‡ fdd„Zdd„ Zdd„ Zdd„ Z‡  ZS )ÚWindowz %(expression)s OVER (%(window)s)FTNc                    sÎ   || _ || _|| _t|ddƒs.td|jj ƒ‚| j d k	r^t| j tt	fƒsR| j f| _ t
| j Ž | _ | jd k	r¬t| jt	tfƒr†t| jŽ | _n&t| jttfƒr¤t| jƒ| _ntdƒ‚tƒ j|d� |  |¡d | _d S )NrÚ   Fz3Expression '%s' isn't compatible with OVER clauses.zhWindow.order_by must be either a string reference to a field, an expression, or a list or tuple of them.ro   r   )Úpartition_byrZ  ÚframerP   r  r¥   r    r�   rê   rq  rR  rW  rn   r‚   r   rq   r‰   Úsource_expression)r   r¨   rˆ  rZ  r‰  r   r  r   r   rq   Ÿ  s.    ÿÿ


ÿzWindow.__init__c                 C   s   | j jS rk   )rŠ  r   r8   r   r   r   r    Ã  s    zWindow._resolve_output_fieldc                 C   s   | j | j| j| jgS rk   ©rŠ  rˆ  rZ  r‰  r8   r   r   r   r{   Æ  s    zWindow.get_source_expressionsc                 C   s   |\| _ | _| _| _d S rk   r‹  r}   r   r   r   r   É  s    zWindow.set_source_expressionsc                 C   sò   |j  | ¡ |jjstdƒ‚| | j¡\}}g d }}| jd k	rl| jj||dd�\}}	| 	|¡ |t
|	ƒ7 }| jd k	rœ| | j¡\}
}| 	|
¡ |t
|ƒ7 }| jrÈ| | j¡\}}| 	|¡ |t
|ƒ7 }|pÐ| j}||d |¡ ¡ dœ ||˜fS )Nz1This backend does not support window expressions.r   zPARTITION BY %(expressions)s)r   r   r7  rm  )r¨   Zwindow)r	  r  r  Zsupports_over_clauser
   r  rŠ  rˆ  r   ré   rê   rZ  r‰  r7  r0  Ústrip)r   r   r   r7  Zexpr_sqlr   Z
window_sqlZwindow_paramsZsql_exprrk  Z	order_sqlZorder_paramsZ	frame_sqlZframe_paramsr   r   r   r   Ì  s2    

ý





þzWindow.as_sqlc                    sT   t | jtjƒrH|  ¡ }| ¡ }t ¡ |d _| |¡ tt	|ƒ 
||¡S |  ||¡S r\  )r�   r   r   r   rt   r{   r©   r   r   r‡  r   r   )r   r   r   rt   rÀ   r  r   r   r   í  s    
zWindow.as_sqlitec                 C   s>   d  t| jƒ| jr dt| jƒ ndt| jp,dƒt| jp8dƒ¡S )Nz{} OVER ({}{}{})zPARTITION BY rY  )r  r‚   rŠ  rˆ  rZ  r‰  r8   r   r   r   r  ÷  s    üzWindow.__str__c                 C   s   d| j j| f S rh  ri  r8   r   r   r   r  ÿ  s    zWindow.__repr__c                 C   s8   g }| j r| | j  ¡ ¡ | jd k	r4| | j ¡ ¡ |S rk   )rˆ  rÈ   rÉ   rZ  )r   rU  r   r   r   rÉ     s    
zWindow.get_group_by_cols)NNNN)N)r    r!   r"   r7  r‹   r‘   rq   r    r{   r   r   r   r  r  rÉ   r  r   r   r  r   r‡  —  s        ú$
!
r‡  c                   @   sV   e 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S )ÚWindowFrameaV  
    Model the frame clause in window expressions. There are two types of frame
    clauses which are subclasses, however, all processing and validation (by no
    means intended to be complete) is done here. Thus, providing an end for a
    frame is optional (the default is UNBOUNDED FOLLOWING, which is the last
    row in the frame).
    z,%(frame_type)s BETWEEN %(start)s AND %(end)sNc                 C   s   t |ƒ| _t |ƒ| _d S rk   )r/   ÚstartÚend©r   rŽ  r�  r   r   r   rq     s    
zWindowFrame.__init__c                 C   s   |\| _ | _d S rk   ©rŽ  r�  r}   r   r   r   r     s    z"WindowFrame.set_source_expressionsc                 C   s   | j | jgS rk   r‘  r8   r   r   r   r{     s    z"WindowFrame.get_source_expressionsc                 C   s>   |j  | ¡ |  || jj| jj¡\}}| j| j||dœ g fS )N©Ú
frame_typerŽ  r�  )r	  r  Úwindow_frame_start_endrŽ  r§   r�  r7  r“  )r   r   r   rŽ  r�  r   r   r   r      s      ÿýÿùzWindowFrame.as_sqlc                 C   s   d| j j| f S rh  ri  r8   r   r   r   r  /  s    zWindowFrame.__repr__c                 C   s   g S rk   r   r8   r   r   r   rÉ   2  s    zWindowFrame.get_group_by_colsc                 C   sÈ   | j jd k	r2| j jdk r2dt| j jƒtjjf }n*| j jd k	rT| j jdkrTtjj}ntjj}| jjd k	rŠ| jjdkrŠd| jjtjj	f }n*| jjd k	r¬| jjdkr¬tjj}ntjj
}| j| j||dœ S )Nr   z%d %sr’  )rŽ  r§   Úabsr   r	  Z	PRECEDINGZCURRENT_ROWZUNBOUNDED_PRECEDINGr�  Z	FOLLOWINGZUNBOUNDED_FOLLOWINGr7  r“  r�  r   r   r   r  5  s    

ýzWindowFrame.__str__c                 C   s   t dƒ‚d S )Nz3Subclasses must implement window_frame_start_end().rg   ©r   r   rŽ  r�  r   r   r   r”  I  s    z"WindowFrame.window_frame_start_end)NN)r    r!   r"   r#   r7  rq   r   r{   r   r  rÉ   r  r”  r   r   r   r   r�    s   
r�  c                   @   s   e Zd ZdZdd„ ZdS )ÚRowRangeZROWSc                 C   s   |j  ||¡S rk   )r	  Zwindow_frame_rows_start_endr–  r   r   r   r”  P  s    zRowRange.window_frame_start_endN©r    r!   r"   r“  r”  r   r   r   r   r—  M  s   r—  c                   @   s   e Zd ZdZdd„ ZdS )Ú
ValueRangeÚRANGEc                 C   s   |j  ||¡S rk   )r	  Zwindow_frame_range_start_endr–  r   r   r   r”  W  s    z!ValueRange.window_frame_start_endNr˜  r   r   r   r   r™  T  s   r™  )\rt   r?  Ú	functoolsrÞ   r  Úcollectionsr   Údecimalr   Úuuidr   Zdjango.core.exceptionsr   r   r   Z	django.dbr	   r
   r   Zdjango.db.modelsr   Zdjango.db.models.constantsr   Zdjango.db.models.query_utilsr   Zdjango.utils.deconstructr   Zdjango.utils.deprecationr   Zdjango.utils.functionalr   Zdjango.utils.hashabler   r   r$   rn   rÝ   rè   rò   r<   r@   r7   rD   rG   rJ   rS   r]   rU   rW   rZ   r  r  r  r  Z_connector_combinationsrq  ró   r÷   Údrã   r2   Zfield_typesrô   rõ   rö   Ú	lru_cacherþ   r0   r  r  rƒ   r  r#  r$  r/   rD  rI  rJ  rP  rR  rW  r[  rl   rc  rl  ru  r{  rÍ   r‡  r�  r—  r™  r   r   r   r   Ú<module>   sô      9%øúûùûüúûöÿôÿ±a

	b3%%dO"') 3K`5ctB