a
    ‘ÐOcæõ  ã                   @   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 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)fD ƒdd„ e!j,e!j-e!j.e!j/e!j0fD ƒdd„ e!j&e!j'e!j(e!j)e!j*e!j+fD ƒe!j&ej1ej2ej3fej3ej2ej3fej2ej1ej3fej2ej3ej3fej2ej2ej2fej4ej2ej4fej2ej4ej4fgie!j'ej1ej2ej3fej3ej2ej3fej1ej1ej2fej1ej3ej2fej3ej1ej2fej3ej3ej2fej2ej2ej2fej4ej2ej4fej4ej4ej2fg	igZ5ee6ƒZ7dd„ Z8e5D ]:Z9e9 :¡ D ]*\Z;Z<e<D ]\Z=Z>Z?e8e=e;e>e?ƒ �q°�q¤�q˜ej@dd�dd „ ƒZAG d!d"„ d"e e#ƒZBG d#d$„ d$eBƒZCG d%d&„ d&eBƒZDed'd(�G d)d*„ d*e!ƒƒZEG d+d,„ d,eEƒZFG d-d.„ d.eEƒZGed/d(�G d0d1„ d1e e#ƒƒZHed2d(�G d3d4„ d4e e#ƒƒZIG d5d6„ d6e#ƒZJG d7d8„ d8e#ƒZKG d9d:„ d:e#ƒZLG d;d<„ d<e#ƒZMG d=d>„ d>eHƒZNG d?d@„ d@eHƒZOedAd(�G dBdC„ dCe e#ƒƒZPedDd(�G dEdF„ dFe#ƒƒZQedGd(�G dHdI„ dIe e#ƒƒZRG dJdK„ dKe"e!ƒZSG dLdM„ dMeSƒZTedNd(�G dOdP„ dPe#ƒƒZUG dQdR„ dRe e#ƒZVG dSdT„ dTe#ƒZWG dUdV„ dVeWƒZXG dWdX„ dXeWƒZYdS )Yé    N)Údefaultdict©ÚDecimal)ÚUUID)ÚEmptyResultSetÚ
FieldError)Ú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   sN   | j ||fi |¤Ž\}}z| j ¡ dkr0d| }W n tyD   Y n0 ||fS )NÚDecimalFieldzCAST(%s AS NUMERIC))Úas_sqlÚoutput_fieldÚget_internal_typer   )ÚselfÚcompilerr
   Úextra_contextÚsqlÚparams© r   úS/var/www/html/gsl.tools/lib/python3.9/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?S )@Ú
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©r3   ÚMUL©r   r   r   r   Ú__neg__K   s    zCombinable.__neg__c                 C   s   |   || jd¡S ©NF©r3   ÚADD©r   r0   r   r   r   Ú__add__N   s    zCombinable.__add__c                 C   s   |   || jd¡S r9   ©r3   ÚSUBr<   r   r   r   Ú__sub__Q   s    zCombinable.__sub__c                 C   s   |   || jd¡S r9   r5   r<   r   r   r   Ú__mul__T   s    zCombinable.__mul__c                 C   s   |   || jd¡S r9   ©r3   ÚDIVr<   r   r   r   Ú__truediv__W   s    zCombinable.__truediv__c                 C   s   |   || jd¡S r9   ©r3   ÚMODr<   r   r   r   Ú__mod__Z   s    zCombinable.__mod__c                 C   s   |   || jd¡S r9   ©r3   Ú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 r9   )r3   ÚBITANDr<   r   r   r   Úbitandg   s    zCombinable.bitandc                 C   s   |   || jd¡S r9   )r3   ÚBITLEFTSHIFTr<   r   r   r   Úbitleftshiftj   s    zCombinable.bitleftshiftc                 C   s   |   || jd¡S r9   )r3   Ú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 rK   rN   r<   r   r   r   Ú__xor__p   s
    ÿzCombinable.__xor__c                 C   s   |   || jd¡S r9   )r3   Ú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 rK   rN   r<   r   r   r   Ú__or__z   s
    ÿzCombinable.__or__c                 C   s   |   || jd¡S r9   )r3   Ú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^   r5   r<   r   r   r   Ú__rmul__Š   s    zCombinable.__rmul__c                 C   s   |   || jd¡S r^   rB   r<   r   r   r   Ú__rtruediv__�   s    zCombinable.__rtruediv__c                 C   s   |   || jd¡S r^   rE   r<   r   r   r   Ú__rmod__�   s    zCombinable.__rmod__c                 C   s   |   || jd¡S r^   rH   r<   r   r   r   Ú__rpow__“   s    zCombinable.__rpow__c                 C   s   t dƒ‚d S ©NrM   ©rP   r<   r   r   r   Ú__rand__–   s    ÿzCombinable.__rand__c                 C   s   t dƒ‚d S re   rf   r<   r   r   r   Ú__ror__›   s    ÿzCombinable.__ror__c                 C   s   t dƒ‚d S re   rf   r<   r   r   r   Ú__rxor__    s    ÿzCombinable.__rxor__N)(r   r    r!   r"   r;   r?   r6   rC   rI   rF   rR   r\   rT   rV   rY   r3   r8   r=   r@   rA   rD   rG   rJ   rQ   rS   rU   rW   rX   rZ   r[   r]   r_   r`   ra   rb   rc   rd   rg   rh   ri   r   r   r   r   r#   %   sJ   r#   c                   @   sF  e Zd ZdZeZdZdZdZdZ	dCd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dDd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-d.„ Z!d/d0„ Z"d1d2„ Z#d3d4„ Z$dEd5d6„Z%d7d8„ Z&d9d:„ Z'd;d<„ Z(d=d>„ Z)d?d@„ Z*dAdB„ Z+dS )FÚBaseExpressionz%Base class for all query expressions.FTNc                 C   s   |d ur|| _ d S ©N©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u rg n| j g| j |¡ S rk   )ro   Ú_convert_value_noopr   Úget_db_converters©r   r
   r   r   r   rv   »   s
    
ÿ
üz BaseExpression.get_db_convertersc                 C   s   g S rk   r   r7   r   r   r   Úget_source_expressionsÂ   s    z%BaseExpression.get_source_expressionsc                 C   s   |rJ ‚d S rk   r   ©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()Nrf   ©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>©Úanyrx   r7   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‹   r7   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‹   r7   r   r   r   rŽ   ø   s    þz)BaseExpression.contains_column_referencesc                    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>)rq   Ú
is_summaryr{   rx   ©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   ÚBooleanFieldr7   r   r   r   rL     s    zBaseExpression.conditionalc                 C   s   | j S rk   rl   r7   r   r   r   Úfield   s    zBaseExpression.fieldc                 C   s"   |   ¡ }|du 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   rm   r   r   r   r   $  s
    zBaseExpression.output_fieldc                 C   s(   z| j W S  ty"   | js‚ Y n0 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›   r7   r   r   r   Ú_output_field_or_none-  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 ur|V  qd S rk   r   )r�   Úsourcer   r   r   rŠ   G  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š   9  s    ÿþþÿz$BaseExpression._resolve_output_fieldc                 C   s   | S rk   r   ©ÚvalueÚ
expressionr
   r   r   r   ru   W  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 u rd S t | ƒS rk   )Úfloatr    r   r   r   Ú<lambda>f  s    ÿz.BaseExpression.convert_value.<locals>.<lambda>ÚIntegerFieldc                 S   s   | d u rd S t | ƒS rk   )Úintr    r   r   r   r¥   l  s    ÿr   c                 S   s   | d u rd S t | ƒS rk   r   r    r   r   r   r¥   r  s    ÿ)r   r   Úendswithru   )r   r™   Zinternal_typer   r   r   ro   [  s    ÿ
ÿÿzBaseExpression.convert_valuec                 C   s   | j  |¡S rk   )r   Ú
get_lookup)r   Úlookupr   r   r   r©   x  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 ur|  ˆ ¡nd ‘qS rk   )Úrelabeled_clone©r�   Úe©Ú
change_mapr   r   rƒ   �  s   ÿz2BaseExpression.relabeled_clone.<locals>.<listcomp>©rq   r{   rx   )r   r²   Úcloner   r±   r   r®   ~  s    
þÿzBaseExpression.relabeled_clonec                    s(   |   ¡ }| ‡ fdd„|  ¡ D ƒ¡ |S )Nc                    s   g | ]}|  ˆ ¡‘qS r   )Úreplace_referencesrˆ   ©Úreferences_mapr   r   rƒ   ‹  s   ÿz5BaseExpression.replace_references.<locals>.<listcomp>r³   )r   r·   r´   r   r¶   r   rµ   ˆ  s    
þÿz!BaseExpression.replace_referencesc                 C   s
   t   | ¡S rk   )rq   r7   r   r   r   rq   ’  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‡   rx   ÚextendÚget_group_by_cols©r   ÚaliasÚ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ƒ   «  ó    z4BaseExpression.get_source_fields.<locals>.<listcomp>)rx   r7   r   r   r   rž   ©  s    z BaseExpression.get_source_fieldsc                 K   s   t | fi |¤Ž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   r7   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)rx   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)N),r   r    r!   r"   ÚNotImplementedÚempty_result_set_valuer”   r›   Ú
filterableÚwindow_compatiblern   rt   rv   rx   r{   r…   r   r   r‡   r�   rŽ   r,   ÚpropertyrL   r™   r   rœ   rš   Ústaticmethodru   ro   r©   r«   r®   rµ   rq   r¸   r¼   rž   rÅ   rÈ   rÉ   rÊ   rË   r   r   r   r   rj   ¦   s^   



 ÿ









rj   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|i |¤Ž}| ¡  |j ¡ }| jg}|D ]R\}}t	|t
jƒr€|jrv|jrv|jjj|jf}qˆt|ƒ}nt|ƒ}| ||f¡ qDt|ƒS rk   )ÚinspectÚ	signaturern   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â   r7   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�   r1   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�   r1   Z
field_typer   r   r   rç   %  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ß   )Úlhsr1   ÚrhsÚresultr   r   r   Úregister_combinable_fieldsX  s    	rí   é€   )Úmaxsizec                 C   s<   t  | d¡}|D ]&\}}}t||ƒrt||ƒr|  S qd S )Nr   )ré   ÚgetÚ
issubclass)r1   Úlhs_typeÚrhs_typeZcombinatorsZcombinator_lhs_typeZcombinator_rhs_typeÚcombined_typer   r   r   Ú_resolve_combined_typej  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 )r/   Nc                    s$   t ƒ j|d� || _|| _|| _d S ©Nrl   )Úsuperrn   r1   rê   rë   )r   rê   r1   rë   r   ©rŸ   r   r   rn   u  s    zCombinedExpression.__init__c                 C   s   d  | jj| ¡S )Nz<{}: {}>)ÚformatrŸ   r   r7   r   r   r   Ú__repr__{  s    zCombinedExpression.__repr__c                 C   s   d  | j| j| j¡S )Nz{} {} {})rù   rê   r1   rë   r7   r   r   r   Ú__str__~  s    zCombinedExpression.__str__c                 C   s   | j | jgS rk   ©rê   rë   r7   r   r   r   rx   �  s    z)CombinedExpression.get_source_expressionsc                 C   s   |\| _ | _d S rk   rü   ry   r   r   r   r{   „  s    z)CombinedExpression.set_source_expressionsc                 C   sZ   t | jt| jjƒt| jjƒƒ}|d u 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õ   r1   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_expressionr1   ©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y^   d }Y n0 z|j ¡ }	W n tt	fyˆ   d }	Y n0 d||	hv r¾||	kr¾t| j | j
| jƒ |||||¡S h d£}
| j
| jkrþ||
v rþ||	krþt| j | jƒ |||||¡S |  ¡ }||_||_ ||_|S )NÚDurationField>   Ú	DateFieldÚ	TimeFieldÚDateTimeField)rê   r,   rë   r}   ÚDurationExpressionÚTemporalSubtractionr   r   ÚAttributeErrorr   r1   r?   rq   r”   )r   r‘   r�   r’   r“   r–   rê   rë   rò   ró   Zdatetime_fieldsr—   r   r   r   r,   ¦  sX    
ÿ
ÿ

ÿù	
ÿþýûz%CombinedExpression.resolve_expression)N)NTNFF)r   r    r!   rn   rú   rû   rx   r{   rš   r   r,   Ú__classcell__r   r   rø   r   r/   t  s    ÿr/   c                       s,   e Zd Zdd„ Z‡ fdd„Zdd„ Z‡  ZS )r  c                 C   sR   z
|j }W n ty   Y n,0 | ¡ dkrH| |¡\}}|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_expressionr1   r  rø   r   r   r   â  s    



zDurationExpression.as_sqlc           	   	   K   s�   | j ||fi |¤Ž\}}| jtjtjhv rˆz| jj ¡ }| jj ¡ }W n t	t
fy\   Y n,0 h d£}||vsv||vrˆtd| j› d�ƒ‚||fS )N>   r¦   r  r   r£   zInvalid arguments for operator Ú.)r   r1   r#   r6   rC   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÷   rn   r?   )r   rê   rë   rø   r   r   rn     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   rn   r   r	  r   r   rø   r   r  	  s   r  zdjango.db.models.F)Úpathc                   @   sR   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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   rn     s    z
F.__init__c                 C   s   d  | jj| j¡S ©Nú{}({}))rù   rŸ   r   r­   r7   r   r   r   rú   #  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   |  | j| ¡S rk   )rð   r­   )r   r·   r   r   r   rµ   +  s    zF.replace_referencesc                 K   s   t | fi |¤ŽS rk   rÁ   rÃ   r   r   r   rÅ   .  s    zF.ascc                 K   s   t | fddi|¤ŽS rÆ   rÁ   rÃ   r   r   r   rÈ   1  s    zF.descc                 C   s   | j |j ko| j|jkS rk   )rŸ   r­   r<   r   r   r   rã   4  s    zF.__eq__c                 C   s
   t | jƒS rk   )rä   r­   r7   r   r   r   rå   7  s    z
F.__hash__)NTNFF)r   r    r!   r"   rn   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‡ fdd„Zdd„ Zd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   E  s    ÿzResolvedOuterRef.as_sqlc                    s"   t ƒ j|i |¤Ž}t| jv |_|S rk   )r÷   r,   r   r­   Úpossibly_multivalued)r   rá   rÄ   Úcolrø   r   r   r,   K  s    z#ResolvedOuterRef.resolve_expressionc                 C   s   | S rk   r   ©r   Zrelabelsr   r   r   r®   S  s    z ResolvedOuterRef.relabeled_cloneNc                 C   s   g S rk   r   ©r   r¾   r   r   r   r¼   V  s    z"ResolvedOuterRef.get_group_by_cols)N)
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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®   b  s    zOuterRef.relabeled_cloneN)r   r    r!   r‡   r,   r®   r   r   r   r   r  Z  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ý   rl   c                   sh   | j d u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)é   ÚargumentrØ   rl   )
ÚarityÚlenÚ	TypeErrorrŸ   r   r÷   rn   r…   Úsource_expressionsÚextra)r   r   r„   r"  rø   r   r   rn   o  s    üÿÿ	zFunc.__init__c                 C   sl   | j  dd„ | jD ƒ¡}i | j¥|  ¡ ¥}|r\d 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Š     rÀ   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   r7   r   r   r   r*  ˆ  s    zFunc._get_repr_optionsc                 C   s   | j S rk   ©r!  r7   r   r   r   rx   Œ  s    zFunc.get_source_expressionsc                 C   s
   || _ d S rk   r,  ry   r   r   r   r{   �  s    zFunc.set_source_expressionsTFc           	      C   s>   |   ¡ }||_t|jƒD ] \}}| |||||¡|j|< q|S rk   )rq   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 ]f}	z| |	¡\}
}W n: tyj   t|	dtƒ}|tu rT‚ | t|ƒ¡\}
}Y n0 | |
¡ | 	|¡ qi | j
¥|¥}|d ur¢||d< n| d| j¡ |pÀ| d| j¡}|pÒ| d| j¡}| |¡ |d< |d< || |fS )NrÎ   ÚfunctionÚtemplater(  r„   r™   )r   r  r!  rÿ   r   rO   rÍ   r.   rß   r»   r"  Ú
setdefaultr/  rð   r0  r(  r)  )r   r   r
   r/  r0  r(  r   Z	sql_partsr   r‚   Zarg_sqlZ
arg_paramsrÎ   Údatar   r   r   r   �  s.    	
ÿ

zFunc.as_sqlc                    s*   t ƒ  ¡ }| jd d … |_| j ¡ |_|S rk   )r÷   rq   r!  r"  )r   rq   rø   r   r   rq   Â  s    
z	Func.copy)NTNFF)NNN)r   r    r!   r"   r/  r0  r(  r  rn   rú   r*  rx   r{   r,   r   rq   r	  r   r   rø   r   r  f  s"   
 ÿ
   ú
%r  zdjango.db.models.Valuec                       sb   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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().
        rl   N)r÷   rn   r¡   )r   r¡   r   rø   r   r   rn   Ñ  s    	zValue.__init__c                 C   s   | j j› d| j›d�S )Nú(ú))rŸ   r   r¡   r7   r   r   r   rú   Ý  s    zValue.__repr__c                 C   s|   |j  | ¡ | j}| j}|d urb| jr6|j||d�}n|j||d�}t|dƒrb| |||¡|gfS |d u rrdg fS d|gfS )N)r
   Úget_placeholderZNULLz%s)	r   r  r¡   rœ   r–   Zget_db_prep_saveZget_db_prep_valuer-   r5  )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   r  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	UUIDFieldr7   r   r   r   rš   ü  s,    zValue._resolve_output_fieldc                 C   s   | j S rk   )r¡   r7   r   r   r   rÎ     s    zValue.empty_result_set_value)N)NTNFF)N)r   r    r!   r"   r–   rn   rú   r   r,   r¼   rš   rÑ   rÎ   r	  r   r   rø   r   r.   É  s    ÿ
r.   c                       sF   e Zd Zd‡ fdd„	Zdd„ Zdd„ Zddd	„Zd‡ fdd„	Z‡  ZS )ÚRawSQLNc                    s0   |d u rt  ¡ }|| | _| _tƒ j|d� d S rö   )r   rÚ   r   r   r÷   rn   )r   r   r   r   rø   r   r   rn     s    zRawSQL.__init__c                 C   s   d  | jj| j| j¡S ©Nr'  )rù   rŸ   r   r   r   r7   r   r   r   rú      s    zRawSQL.__repr__c                 C   s   d| j  | jfS rþ   )r   r   r†   r   r   r   r   #  s    zRawSQL.as_sqlc                 C   s   | gS rk   r   r  r   r   r   r¼   &  s    zRawSQL.get_group_by_colsTFc           
         sn   |j rZ|j j ¡ D ]F}|jjD ]8}| ¡ \}}	|	 ¡ | j ¡ v 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,   )  s    
ÿ
ÿzRawSQL.resolve_expression)N)N)NTNFF)	r   r    r!   rn   rú   r   r¼   r,   r	  r   r   rø   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   r7   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   rA  ;  s   rA  c                       sP   e 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	dd„ Z
‡  ZS )ÚColTFNc                    s,   |d u r|}t ƒ j|d� || | _| _d S rö   )r÷   rn   r¾   Útarget)r   r¾   rC  r   rø   r   r   rn   H  s    zCol.__init__c                 C   s>   | j | j }}|r|t|ƒfnt|ƒf}d | jjd |¡¡S )Nr  rý   )r¾   rC  r~   rù   rŸ   r   r)  )r   r¾   rC  Úidentifiersr   r   r   rú   N  s    zCol.__repr__c                 C   s<   | j | jj }}|r||fn|f}d t|j|ƒ¡}|g fS )Nr  )r¾   rC  Úcolumnr)  ÚmapZquote_name_unless_alias)r   r   r
   r¾   rE  rD  r   r   r   r   r   S  s    z
Col.as_sqlc                 C   s,   | j d u r| S |  | | j | j ¡| j| j¡S rk   )r¾   rŸ   rð   rC  r   r  r   r   r   r®   Y  s
    
ÿzCol.relabeled_clonec                 C   s   | gS rk   r   r  r   r   r   r¼   `  s    zCol.get_group_by_colsc                 C   s0   | j | jkr| j |¡S | j |¡| j  |¡ S rk   )rC  r   rv   rw   r   r   r   rv   c  s    ÿ
þzCol.get_db_converters)N)N)r   r    r!   rŽ   r  rn   rú   r   r®   r¼   rv   r	  r   r   rø   r   rB  C  s   
rB  c                       s\   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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÷   rn   Úrefsr�   )r   rH  r�   rø   r   r   rn   q  s    
zRef.__init__c                 C   s   d  | jj| j| j¡S r=  )rù   rŸ   r   rH  r�   r7   r   r   r   rú   u  s    zRef.__repr__c                 C   s   | j gS rk   ©r�   r7   r   r   r   rx   x  s    zRef.get_source_expressionsc                 C   s   |\| _ d S rk   rI  ry   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   | S rk   r   r  r   r   r   r®   …  s    zRef.relabeled_clonec                 C   s   |j  | j¡g fS rk   )r   Z
quote_namerH  r†   r   r   r   r   ˆ  s    z
Ref.as_sqlc                 C   s   | gS rk   r   r  r   r   r   r¼   ‹  s    zRef.get_group_by_cols)NTNFF)N)r   r    r!   r"   rn   rú   rx   r{   r,   r®   r   r¼   r	  r   r   rø   r   rG  k  s    ÿ
rG  c                       s4   e Zd ZdZdZ‡ f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|i |¤Ž d S )Nz$%s requires at least one expression.)r  rŸ   r   r÷   rn   ©r   r„   r"  rø   r   r   rn   ˜  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Š      rÀ   z)ExpressionList.__str__.<locals>.<genexpr>)r(  r)  r!  r7   r   r   r   rû   Ÿ  s    zExpressionList.__str__c                 K   s   | j ||fi |¤ŽS rk   )r   )r   r   r
   r   r   r   r   r   ¢  s    zExpressionList.as_sqlite)	r   r    r!   r"   r0  rn   rû   r   r	  r   r   rø   r   rJ  �  s
   rJ  c                       s,   e Zd ZdZ‡ fdd„Z‡ fdd„Z‡  ZS )ÚOrderByListzORDER BY %(expressions)sc                    s$   dd„ |D ƒ}t ƒ j|i |¤Ž 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÷   rn   rK  rø   r   r   rn   ª  s    úzOrderByList.__init__c                    s   | j s
dS tƒ j|i |¤ŽS )N)Ú r   )r!  r÷   r   r  rø   r   r   r   µ  s    zOrderByList.as_sql)r   r    r!   r0  rn   r   r	  r   r   rø   r   rL  §  s   rL  z"django.db.models.ExpressionWrapperc                       sN   e Zd ZdZ‡ fdd„Zdd„ Zdd„ Zd‡ 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÷   rn   r¢   )r   r¢   r   rø   r   r   rn   Â  s    zExpressionWrapper.__init__c                 C   s   |d | _ d S ©Nr   ©r¢   ry   r   r   r   r{   Æ  s    z(ExpressionWrapper.set_source_expressionsc                 C   s   | j gS rk   rQ  r7   r   r   r   rx   É  s    z(ExpressionWrapper.get_source_expressionsNc                    s4   t | jtƒr*| j ¡ }| j|_|j|d�S tƒ  ¡ S )N)r¾   )r}   r¢   rÓ   rq   r   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¢   r7   r   r   r   rú   Ø  s    zExpressionWrapper.__repr__)N)r   r    r!   r"   rn   r{   rx   r¼   r   rú   r	  r   r   rø   r   rO  »  s   	rO  zdjango.db.models.Whenc                       sl   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d„Z‡  ZS )ÚWhenz"WHEN %(condition)s THEN %(result)sFNc                    s¢   |rD|d u r"t f i |¤Žd  }}n"t|ddƒrDt |fi |¤Žd  }}|d u s\t|ddƒr\|rdtdƒ‚t|t ƒrz|sztdƒ‚tƒ jd d� || _|  |¡d | _	d S )NrL   FzLWhen() supports a Q object, a boolean expression, or lookups as a condition.z1An empty Q() can't be used as a When() condition.rl   r   )
r   rO   r   r}   r  r÷   rn   Ú	conditionr…   rì   )r   rS  ÚthenÚlookupsrø   r   r   rn   â  s    ÿzWhen.__init__c                 C   s   d| j | jf S )NzWHEN %r THEN %r©rS  rì   r7   r   r   r   rû   ó  s    zWhen.__str__c                 C   s   d| j j| f S ©Nz<%s: %s>©rŸ   r   r7   r   r   r   rú   ö  s    zWhen.__repr__c                 C   s   | j | jgS rk   rV  r7   r   r   r   rx   ù  s    zWhen.get_source_expressionsc                 C   s   |\| _ | _d S rk   rV  ry   r   r   r   r{   ü  s    zWhen.set_source_expressionsc                 C   s
   | j jgS rk   )rì   rœ   r7   r   r   r   rž   ÿ  s    zWhen.get_source_fieldsTc                 C   sJ   |   ¡ }||_t|jdƒr0|j ||||d¡|_|j |||||¡|_|S )Nr,   F)rq   r”   r-   rS  r,   rì   r•   r   r   r   r,     s    
ÿ
ÿzWhen.resolve_expressionc                 K   sn   |j  | ¡ |}g }| | j¡\}}||d< | |¡ | | j¡\}	}
|	|d< | |
¡ |p`| j}|| |fS )NrS  rì   )r   r  rÿ   rS  r»   rì   r0  )r   r   r
   r0  r   Útemplate_paramsÚ
sql_paramsZcondition_sqlZcondition_paramsZ
result_sqlZresult_paramsr   r   r   r     s    


zWhen.as_sqlc                 C   s$   g }|   ¡ D ]}| | ¡ ¡ q|S rk   ©rx   r»   r¼   r½   r   r   r   r¼     s    zWhen.get_group_by_cols)NN)NTNFF)N)N)r   r    r!   r0  rL   rn   rû   rú   rx   r{   rž   r,   r   r¼   r	  r   r   rø   r   rR  Ü  s    ÿ

rR  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d‡ 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}   rR  )r�   Úcaser   r   r   rŠ   8  rÀ   z Case.__init__.<locals>.<genexpr>z.Positional arguments must all be When objects.r   )	Úallr   r÷   rn   ÚlistÚcasesr…   r^  r"  )r   r^  r   rb  r"  rø   r   r   rn   7  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Š   A  rÀ   zCase.__str__.<locals>.<genexpr>)r)  rb  r^  r7   r   r   r   rû   ?  s    þzCase.__str__c                 C   s   d| j j| f S rW  rX  r7   r   r   r   rú   E  s    zCase.__repr__c                 C   s   | j | jg S rk   ©rb  r^  r7   r   r   r   rx   H  s    zCase.get_source_expressionsc                 C   s   |�^ | _ | _d S rk   rc  ry   r   r   r   r{   K  s    zCase.set_source_expressionsTFc           	      C   sT   |   ¡ }||_t|jƒD ] \}}| |||||¡|j|< q|j |||||¡|_|S rk   )rq   r”   r-  rb  r,   r^  )	r   r‘   r�   r’   r“   r–   r—   r.  r_  r   r   r   r,   N  s    
ÿ
ÿzCase.resolve_expressionc                    s   t ƒ  ¡ }|jd d … |_|S rk   )r÷   rq   rb  )r   r—   rø   r   r   rq   \  s    
z	Case.copyc              	   K   s  |j  | ¡ | js| | j¡S i | j¥|¥}g }g }| jD ]B}	z| |	¡\}
}W n tyf   Y q:Y n0 | |
¡ | |¡ q:| | j¡\}}|sš||fS |p¢| j	}| 
|¡|d< ||d< | |¡ |pÔ| d| j¡}|| }| jd urú|j  | j¡| }||fS )Nrb  r^  r0  )r   r  rb  rÿ   r^  r"  r   rß   r»   Úcase_joinerr)  rð   r0  rœ   Zunification_cast_sqlr   )r   r   r
   r0  rd  r   rY  Z
case_partsrZ  r_  Zcase_sqlZcase_paramsZdefault_sqlZdefault_paramsr   r   r   r   r   a  s2    





zCase.as_sqlc                    s   | j s| j |¡S tƒ  |¡S rk   )rb  r^  r¼   r÷   r  rø   r   r   r¼   ~  s    zCase.get_group_by_cols)NTNFF)NN)N)r   r    r!   r"   r0  rd  rn   rû   rú   rx   r{   r,   rq   r   r¼   r	  r   r   rø   r   r\  &  s    ÿ
 ÿ
r\  c                       sz   e 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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)FNc                    s0   t |d|ƒ ¡ | _d| j_|| _tƒ  |¡ d S )Nr‘   T)rO   r´   r‘   Úsubqueryr"  r÷   rn   )r   Úquerysetr   r"  rø   r   r   rn   Ž  s    zSubquery.__init__c                 C   s   | j gS rk   ©r‘   r7   r   r   r   rx   •  s    zSubquery.get_source_expressionsc                 C   s   |d | _ d S rP  rh  ry   r   r   r   r{   ˜  s    zSubquery.set_source_expressionsc                 C   s   | j jS rk   )r‘   r   r7   r   r   r   rš   ›  s    zSubquery._resolve_output_fieldc                    s   t ƒ  ¡ }|j ¡ |_|S rk   )r÷   rq   r‘   r´   ©r   r´   rø   r   r   rq   ž  s    
zSubquery.copyc                 C   s   | j jS rk   )r‘   Úexternal_aliasesr7   r   r   r   rj  £  s    zSubquery.external_aliasesc                 C   s
   | j  ¡ S rk   )r‘   Úget_external_colsr7   r   r   r   rk  §  s    zSubquery.get_external_colsc           
      K   sf   |j  | ¡ i | j¥|¥}|p"| j}| ||¡\}}|dd… |d< |pT| d| j¡}|| }	|	|fS )Nr  r4   rf  r0  )r   r  r"  r‘   r   rð   r0  )
r   r   r
   r0  r‘   r   rY  Zsubquery_sqlrZ  r   r   r   r   r   ª  s    
zSubquery.as_sqlc                 C   s   |rt || ƒgS | j ¡ S rk   )rG  r‘   r¼   r  r   r   r   r¼   µ  s    zSubquery.get_group_by_cols)N)NN)N)r   r    r!   r"   r0  r‡   rÎ   rn   rx   r{   rš   rq   rÑ   rj  rk  r   r¼   r	  r   r   rø   r   re  „  s   

re  c                       sV   e Zd ZdZe ¡ Zd‡ fdd„	Zdd„ Zd‡ fdd	„	Z	d‡ fd
d„	Z
dd„ Z‡  ZS )ÚExistszEXISTS(%(subquery)s)Fc                    s   || _ tƒ j|fi |¤Ž d S rk   )Únegatedr÷   rn   )r   rg  rm  rÄ   rø   r   r   rn   Ã  s    zExists.__init__c                 C   s   |   ¡ }| j |_|S rk   )rq   rm  ri  r   r   r   Ú
__invert__Ç  s    
zExists.__invert__Nc                    s   |d u r| gS t ƒ  |¡S rk   )r÷   r¼   r  rø   r   r   r¼   Ì  s    zExists.get_group_by_colsc           	         sŽ   | j j|jd�}z$tƒ j||f||dœ|¤Ž\}}W n@ tyt   | jrn|jj}|j	s\Y dS | 
tdƒ¡ Y S ‚ Y n0 | jr†d |¡}||fS )N)Zusing)r0  r‘   )z1=1r   TzNOT {})r‘   Úexistsr¾   r÷   r   r   rm  r
   r  Ú&supports_boolean_expr_in_select_clauserÿ   r.   rù   )	r   r   r
   r0  r   r‘   r   r   r  rø   r   r   r   Ô  s*    þüû
zExists.as_sqlc                 C   s   |j jjsd |¡}||fS )NzCASE WHEN {} THEN 1 ELSE 0 END)r
   r  rp  rù   rÌ   r   r   r   rË   é  s    

zExists.select_format)F)N)N)r   r    r!   r0  r   r˜   r   rn   rn  r¼   r   rË   r	  r   r   rø   r   rl  ¿  s   rl  zdjango.db.models.OrderByc                   @   sj   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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u s |du 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Ç   ru  rv  r   r   r   rn   ÷  s    ü
zOrderBy.__init__c                 C   s   d  | jj| j| j¡S )Nz{}({}, descending={}))rù   rŸ   r   r¢   rÇ   r7   r   r   r   rú     s    ÿzOrderBy.__repr__c                 C   s   |d | _ d S rP  rQ  ry   r   r   r   r{     s    zOrderBy.set_source_expressionsc                 C   s   | j gS rk   rQ  r7   r   r   r   rx     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)r0  r  Z supports_order_by_nulls_modifierrv  ru  rÇ   Zorder_by_nulls_firstr   r  rÿ   r¢   ÚcountÚrstrip)r   r   r
   r0  r   Zexpression_sqlr   Zplaceholdersr   r   r   r     s6    


ÿÿ
ÿÿþýzOrderBy.as_sqlc                 C   sF   |j  | j¡r:|  ¡ }tt| jdd�dd�|_| ||¡S |  ||¡S )NT)rT  F)r^  )r   Z0conditional_expression_supported_in_where_clauser¢   rq   r\  rR  r   )r   r   r
   rq   r   r   r   Ú	as_oracle1  s    ÿþzOrderBy.as_oraclec                 C   s$   g }|   ¡ D ]}| | ¡ ¡ q|S rk   r[  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Ç   ru  rv  r7   r   r   r   rÉ   E  s    
zOrderBy.reverse_orderingc                 C   s
   d| _ d S r9   rM  r7   r   r   r   rÅ   O  s    zOrderBy.ascc                 C   s
   d| _ d S r^   rM  r7   r   r   r   rÈ   R  s    zOrderBy.desc)FNN)N)N)r   r    r!   r0  rL   rn   rú   r{   rx   r   rz  r¼   rÉ   rÅ   rÈ   r   r   r   r   rÂ   ò  s   



rÂ   c                       sv   e 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
ddd„Z‡ fdd„Zdd„ Zdd„ Zddd„Z‡  ZS )ÚWindowz %(expression)s OVER (%(window)s)FTNc                    sÎ   || _ || _|| _t|ddƒs.td|jj ƒ‚| j d ur^t| j tt	fƒsR| j f| _ t
| j Ž | _ | jd u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.rl   r   )Úpartition_byÚorder_byÚframerO   r  rŸ   r   r}   rà   ra  rJ  rL  rj   r~   r÷   rn   r…   Úsource_expression)r   r¢   r|  r}  r~  r   rø   r   r   rn   _  s.    ÿÿ


ÿzWindow.__init__c                 C   s   | j jS rk   )r  r   r7   r   r   r   rš   ƒ  s    zWindow._resolve_output_fieldc                 C   s   | j | j| j| jgS rk   ©r  r|  r}  r~  r7   r   r   r   rx   †  s    zWindow.get_source_expressionsc                 C   s   |\| _ | _| _| _d S rk   r€  ry   r   r   r   r{   ‰  s    zWindow.set_source_expressionsc                 C   sø   |j  | ¡ |jjstdƒ‚| | j¡\}}g d }}| jd url| jj||dd�\}}	| 	|¡ |t
|	ƒ7 }| jd urœ| | j¡\}
}| 	|
¡ |t
|ƒ7 }| jrÈ| | j¡\}}| 	|¡ |t
|ƒ7 }|pÐ| j}||d |¡ ¡ dœ g |¢|¢R fS )Nz1This backend does not support window expressions.r   zPARTITION BY %(expressions)s)r   r
   r0  r]  )r¢   Zwindow)r   r  r  Zsupports_over_clauser	   rÿ   r  r|  r   rß   rà   r}  r~  r0  r)  Ústrip)r   r   r
   r0  Zexpr_sqlr   Z
window_sqlZwindow_paramsZsql_exprrZ  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 rP  )r}   r   r   r   rq   rx   r£   r{   r÷   r{  r   r   )r   r   r
   rq   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 rN  )rù   r~   r  r|  r}  r~  r7   r   r   r   rû   ·  s    üzWindow.__str__c                 C   s   d| j j| f S rW  rX  r7   r   r   r   rú   ¿  s    zWindow.__repr__c                 C   s   g S rk   r   r  r   r   r   r¼   Â  s    zWindow.get_group_by_cols)NNNN)N)N)r   r    r!   r0  r‡   r�   rÏ   rn   rš   rx   r{   r   r   rû   rú   r¼   r	  r   r   rø   r   r{  V  s"       ú$
!
r{  c                   @   sX   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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   rn   Ñ  s    
zWindowFrame.__init__c                 C   s   |\| _ | _d S rk   ©rƒ  r„  ry   r   r   r   r{   Õ  s    z"WindowFrame.set_source_expressionsc                 C   s   | j | jgS rk   r†  r7   r   r   r   rx   Ø  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„  r0  rˆ  )r   r   r
   rƒ  r„  r   r   r   r   Û  s    ÿýÿùzWindowFrame.as_sqlc                 C   s   d| j j| f S rW  rX  r7   r   r   r   rú   ê  s    zWindowFrame.__repr__c                 C   s   g S rk   r   r  r   r   r   r¼   í  s    zWindowFrame.get_group_by_colsc                 C   sÈ   | j jd ur2| j jdk r2dt| j jƒtjjf }n*| j jd urT| j jdkrTtjj}ntjj}| jjd urŠ| jjdkrŠd| jjtjj	f }n*| jjd u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_FOLLOWINGr0  rˆ  r…  r   r   r   rû   ð  s    

ýzWindowFrame.__str__c                 C   s   t dƒ‚d S )Nz3Subclasses must implement window_frame_start_end().rf   ©r   r
   rƒ  r„  r   r   r   r‰    s    z"WindowFrame.window_frame_start_end)NN)N)r   r    r!   r"   r0  rn   r{   rx   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‰    s    zRowRange.window_frame_start_endN©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 )Ú
ValueRangeÚRANGEc                 C   s   |j  ||¡S rk   )r   Zwindow_frame_range_start_endr‹  r   r   r   r‰    s    z!ValueRange.window_frame_start_endNr�  r   r   r   r   rŽ    s   rŽ  )Zrq   r7  Ú	functoolsrÔ   rs  Úcollectionsr   Údecimalr   Úuuidr   Zdjango.core.exceptionsr   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#   rj   rÓ   rÞ   rè   r;   r?   r6   rC   rF   rI   rR   r\   rT   rV   rY   r  r  r  r  Z_connector_combinationsra  ré   rí   ÚdrÙ   r1   Zfield_typesrê   rë   rì   Ú	lru_cacherõ   r/   r  r  r   r  r  r  r.   r<  rA  rB  rG  rJ  rL  rO  rR  r\  re  rl  rÂ   r{  r‚  rŒ  rŽ  r   r   r   r   Ú<module>   sð      )%øúüùûüúûöÿôÿ²`

	b3"bO"($ I];3cpB