o
    ÕèFhé ã                   @   sø  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 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 G dd„ dƒZ G dd„ dƒZ!G dd„ dƒZ"eG dd„ de"e!ƒƒZ#dd„ e!j$e!j%e!j&e!j'e!j(fD ƒ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!j-e!j.fD ƒdd„ e!j$e!j)e!j%e!j&e!j'e!j(fD ƒe!j$ej/ej0ej1fej1ej0ej1fej0ej/ej1fej0ej1ej1fej0ej0ej0fej2ej0ej2fej0ej2ej2fgie!j)ej/ej0ej1fej1ej0ej1fej/ej/ej0fej/ej1ej0fej1ej/ej0fej1ej1ej0fej0ej0ej0fej2ej0ej2fej2ej2ej0fg	igZ3ee4ƒZ5dd„ Z6e3D ]Z7e7 8¡ D ]\Z9Z:e:D ]\Z;Z<Z=e6e;e9e<e=ƒ �qd�q^�qXej>dd�d d!„ ƒZ?G d"d#„ d#e e#ƒZ@G d$d%„ d%e@ƒZAG d&d'„ d'e@ƒZBed(d)�G d*d+„ d+e!ƒƒZCG d,d-„ d-eCƒZDG d.d/„ d/eCƒZEed0d)�G d1d2„ d2e e#ƒƒZFed3d)�G d4d5„ d5e e#ƒƒZGG d6d7„ d7e#ƒZHG d8d9„ d9e#ƒZIG d:d;„ d;e#ƒZJG d<d=„ d=e#ƒZKG d>d?„ d?e#ƒZLG d@dA„ dAeFƒZMG dBdC„ dCeFƒZNedDd)�G dEdF„ dFe e#ƒƒZOG dGdH„ dHeOƒZPedId)�G dJdK„ dKe#ƒƒZQedLd)�G dMdN„ dNe e#ƒƒZRG dOdP„ dPe"e!ƒZSG dQdR„ dReSƒZTedSd)�G dTdU„ dUe#ƒƒZUG dVdW„ dWe e#ƒZVG dXdY„ dYe#ƒZWG dZd[„ d[eWƒZXG d\d]„ d]eWƒZYdS )^é    N)Údefaultdict©ÚDecimal)ÚNoneType)ÚUUID)ÚEmptyResultSetÚ
FieldErrorÚFullResultSet)ÚDatabaseErrorÚNotSupportedErrorÚ
connection)Úfields)Ú
LOOKUP_SEP)ÚQ)Údeconstructible)Úcached_property)Úmake_hashablec                   @   ó   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   s\   | j ||fi |¤Ž\}}z| j ¡ dkrd| }W ||fS W ||fS  ty-   Y ||fS w )NÚDecimalFieldz(CAST(%s AS NUMERIC)))Úas_sqlÚoutput_fieldÚget_internal_typer   )ÚselfÚcompilerr   Úextra_contextÚsqlÚparams© r   úU/var/www/html/loop/nvenv/lib/python3.10/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©r5   ÚMUL©r   r   r   r   Ú__neg__J   ó   zCombinable.__neg__c                 C   ó   |   || jd¡S ©NF©r5   ÚADD©r   r2   r   r   r   Ú__add__M   r;   zCombinable.__add__c                 C   r<   r=   ©r5   ÚSUBr@   r   r   r   Ú__sub__P   r;   zCombinable.__sub__c                 C   r<   r=   r7   r@   r   r   r   Ú__mul__S   r;   zCombinable.__mul__c                 C   r<   r=   ©r5   ÚDIVr@   r   r   r   Ú__truediv__V   r;   zCombinable.__truediv__c                 C   r<   r=   ©r5   ÚMODr@   r   r   r   Ú__mod__Y   r;   zCombinable.__mod__c                 C   r<   r=   ©r5   ÚPOWr@   r   r   r   Ú__pow__\   r;   zCombinable.__pow__c                 C   s0   t | ddƒrt |ddƒrt| ƒt|ƒ@ S tdƒ‚©NÚconditionalFúFUse .bitand(), .bitor(), and .bitxor() for bitwise logical operations.©Úgetattrr   ÚNotImplementedErrorr@   r   r   r   Ú__and___   ó
   ÿzCombinable.__and__c                 C   r<   r=   )r5   ÚBITANDr@   r   r   r   Úbitandf   r;   zCombinable.bitandc                 C   r<   r=   )r5   ÚBITLEFTSHIFTr@   r   r   r   Úbitleftshifti   r;   zCombinable.bitleftshiftc                 C   r<   r=   )r5   ÚBITRIGHTSHIFTr@   r   r   r   Úbitrightshiftl   r;   zCombinable.bitrightshiftc                 C   s0   t | ddƒrt |ddƒrt| ƒt|ƒA S tdƒ‚rO   rR   r@   r   r   r   Ú__xor__o   rV   zCombinable.__xor__c                 C   r<   r=   )r5   ÚBITXORr@   r   r   r   Úbitxorv   r;   zCombinable.bitxorc                 C   s0   t | ddƒrt |ddƒrt| ƒt|ƒB S tdƒ‚rO   rR   r@   r   r   r   Ú__or__y   rV   zCombinable.__or__c                 C   r<   r=   )r5   ÚBITORr@   r   r   r   Úbitor€   r;   zCombinable.bitorc                 C   r<   ©NTr>   r@   r   r   r   Ú__radd__ƒ   r;   zCombinable.__radd__c                 C   r<   rc   rB   r@   r   r   r   Ú__rsub__†   r;   zCombinable.__rsub__c                 C   r<   rc   r7   r@   r   r   r   Ú__rmul__‰   r;   zCombinable.__rmul__c                 C   r<   rc   rF   r@   r   r   r   Ú__rtruediv__Œ   r;   zCombinable.__rtruediv__c                 C   r<   rc   rI   r@   r   r   r   Ú__rmod__�   r;   zCombinable.__rmod__c                 C   r<   rc   rL   r@   r   r   r   Ú__rpow__’   r;   zCombinable.__rpow__c                 C   ó   t dƒ‚©NrQ   ©rT   r@   r   r   r   Ú__rand__•   ó   ÿzCombinable.__rand__c                 C   rj   rk   rl   r@   r   r   r   Ú__ror__š   rn   zCombinable.__ror__c                 C   rj   rk   rl   r@   r   r   r   Ú__rxor__Ÿ   rn   zCombinable.__rxor__c                 C   s   t | ƒS ©N)ÚNegatedExpressionr9   r   r   r   Ú
__invert__¤   ó   zCombinable.__invert__N))r!   r"   r#   r$   r?   rC   r8   rG   rM   rJ   rW   ra   rY   r[   r^   r5   r:   rA   rD   rE   rH   rK   rN   rU   rX   rZ   r\   r]   r_   r`   rb   rd   re   rf   rg   rh   ri   rm   ro   rp   rs   r   r   r   r   r%   $   sN    r%   c                   @   s^  e Zd ZdZeZd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 ur	|| _ d S d S rq   ©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__º   ó   
zBaseExpression.__getstate__c                 C   s$   | j | ju rg n| j g| j |¡ S rq   )ry   Ú_convert_value_noopr   Úget_db_converters©r   r   r   r   r   r�   ¿   s
   ÿ
üz BaseExpression.get_db_convertersc                 C   ó   g S rq   r   r9   r   r   r   Úget_source_expressionsÆ   ó   z%BaseExpression.get_source_expressionsc                 C   s   |rJ ‚d S rq   r   ©r   Úexprsr   r   r   Úset_source_expressionsÉ   ó   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ÚFr0   ©Ú.0Úargr   r   r   Ú
<listcomp>Í   s    ýÿüz5BaseExpression._parse_expressions.<locals>.<listcomp>r   )r   Úexpressionsr   r   r   Ú_parse_expressionsÌ   s   úz!BaseExpression._parse_expressionsc                 C   rj   )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()rl   ©r   r   r   r   r   r   r   Ö   s   zBaseExpression.as_sqlc                 C   ó   t dd„ |  ¡ D ƒƒS )Nc                 s   ó   � | ]}|o|j V  qd S rq   )Úcontains_aggregate©r�   Úexprr   r   r   Ú	<genexpr>ô   ó   € 

ÿz4BaseExpression.contains_aggregate.<locals>.<genexpr>©Úanyr„   r9   r   r   r   r—   ò   ó   ÿz!BaseExpression.contains_aggregatec                 C   r•   )Nc                 s   r–   rq   )Úcontains_over_clauser˜   r   r   r   rš   ú   r›   z6BaseExpression.contains_over_clause.<locals>.<genexpr>rœ   r9   r   r   r   rŸ   ø   rž   z#BaseExpression.contains_over_clausec                 C   r•   )Nc                 s   r–   rq   )Úcontains_column_referencesr˜   r   r   r   rš      s
   € ÿ
ÿz<BaseExpression.contains_column_references.<locals>.<genexpr>rœ   r9   r   r   r   r    þ   ó   þz)BaseExpression.contains_column_referencesc                 C   r•   )Nc                 s   s&   � | ]}|ot |d dƒp|jV  qdS )ÚsubqueryFN)rS   Úcontains_subqueryr˜   r   r   r   rš     s
   € ÿ
ÿz3BaseExpression.contains_subquery.<locals>.<genexpr>rœ   r9   r   r   r   r£     r¡   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 rq   rŠ   r˜   ©Úallow_joinsÚqueryÚreuseÚ	summarizer   r   r‘      s    ýÿüz5BaseExpression.resolve_expression.<locals>.<listcomp>)r{   Ú
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 rq   )r‹   r   r   ÚBooleanFieldr9   r   r   r   rP   +  s   zBaseExpression.conditionalc                 C   ó   | j S rq   rv   r9   r   r   r   Úfield/  ó   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   rw   r   r   r   r   3  s
   zBaseExpression.output_fieldc                 C   s&   z| j W S  ty   | js‚ Y dS w )z†
        Return the output field of this expression, or None if
        _resolve_output_field() didn't return an output type.
        N)r   r   r²   r9   r   r   r   Ú_output_field_or_none<  s   ÿÿz$BaseExpression._output_field_or_nonec                 C   sT   dd„ |   ¡ D ƒ}|D ]}|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 rq   r   )r�   Úsourcer   r   r   rš   V  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   Úsources_iterr   r´   r   r   r   r±   H  s    ÿþþÿÿ	õz$BaseExpression._resolve_output_fieldc                 C   ó   | S rq   r   ©ÚvalueÚ
expressionr   r   r   r   r€   f  ó   z"BaseExpression._convert_value_noopc                 C   sF   | j }| ¡ }|dkrdd„ S | d¡rd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   ó   | d u rd S t | ƒS rq   )Úfloatr¹   r   r   r   Ú<lambda>t  ó   z.BaseExpression.convert_value.<locals>.<lambda>ÚIntegerFieldc                 S   r¾   rq   )Úintr¹   r   r   r   rÀ   x  rÁ   r   c                 S   r¾   rq   r   r¹   r   r   r   rÀ   |  rÁ   )r   r   Úendswithr€   )r   r¯   Úinternal_typer   r   r   ry   j  s   
zBaseExpression.convert_valuec                 C   ó   | j  |¡S rq   )r   Ú
get_lookup)r   Úlookupr   r   r   rÇ   �  r‰   zBaseExpression.get_lookupc                 C   rÆ   rq   )r   Úget_transform©r   Únamer   r   r   rÉ   „  r‰   zBaseExpression.get_transformc                    ó(   |   ¡ }| ‡ fdd„|  ¡ D ƒ¡ |S )Nc                    s"   g | ]}|d ur|  ˆ ¡nd ‘qS rq   )Úrelabeled_clone©r�   Úe©Ú
change_mapr   r   r‘   Š  s    ÿÿz2BaseExpression.relabeled_clone.<locals>.<listcomp>©r{   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 rq   )Úreplace_expressionsr˜   ©Úreplacementsr   r   r‘   —  s    ÿÿz6BaseExpression.replace_expressions.<locals>.<listcomp>)Úgetr{   r„   rˆ   )r   rÖ   ÚreplacementrÓ   Úsource_expressionsr   rÕ   r   rÔ   ‘  s   
þÿz"BaseExpression.replace_expressionsc                 C   s$   t ƒ }|  ¡ D ]}|| ¡ O }q|S rq   )Úsetr„   Úget_refs)r   Úrefsr™   r   r   r   rÛ   ž  s   zBaseExpression.get_refsc                 C   ó
   t   | ¡S rq   ©r{   r9   r   r   r   r{   ¤  ó   
zBaseExpression.copyc                    rÌ   )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 rq   )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„   r9   r   r   r   rµ   ½  s   z BaseExpression.get_source_fieldsc                 K   ó   t | fi |¤ŽS rq   ©ÚOrderBy©r   Úkwargsr   r   r   ÚascÁ  r;   zBaseExpression.ascc                 K   ó   t | fddi|¤ŽS ©NÚ
descendingTrè   rê   r   r   r   ÚdescÄ  rÁ   zBaseExpression.descc                 C   r¸   rq   r   r9   r   r   r   Úreverse_orderingÇ  r…   zBaseExpression.reverse_orderingc                 c   s>   � | V  |   ¡ D ]}|rt|dƒr| ¡ 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_formatrq   ©NTNFF)/r!   r"   r#   r$   ÚNotImplementedÚempty_result_set_valuer©   r²   Ú
filterableÚwindow_compatibleÚallowed_defaultrx   r~   r�   r„   rˆ   r“   r   r   r—   rŸ   r    r£   r.   ÚpropertyrP   r¯   r   r³   r±   Ústaticmethodr€   ry   rÇ   rÉ   rÍ   rÔ   rÛ   r{   rà   rä   rµ   rì   rð   rñ   rò   ró   r   r   r   r   ru   ¨   sh    






ÿ






ru   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 ])\}}t	|t
jƒr@|jr;|jr;|jjj|jf}n	t|ƒ}nt|ƒ}| ||f¡ q"t|ƒS rq   )ÚinspectÚ	signaturerx   Ú_constructor_argsÚbind_partialÚapply_defaultsÚ	argumentsÚitemsr¶   r‹   r   ÚFieldrË   ÚmodelÚ_metaÚlabelÚtyper   ÚappendÚtuple)	r   Ú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 rq   )r‹   rý   rö   r  r@   r   r   r   Ú__eq__ø  s   
zExpression.__eq__c                 C   ó
   t | jƒS rq   )Úhashr  r9   r   r   r   Ú__hash__ý  rß   zExpression.__hash__N)r!   r"   r#   r$   r   r  r  r  r   r   r   r   rý   á  s    
rý   c                 C   ó    i | ]}|t jt jt jfg“qS r   )r   ÚPositiveIntegerField©r�   r3   r   r   r   Ú
<dictcomp>  s    ùýÿÿr  c                 C   s<   i | ]}|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   sJ   i | ]!}|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   r  r   )r   rÂ   r  r   r   r   r  ?  s    ýÿÿc                 C   s8   i | ]}t jt jt jfD ]}||t|ft||fg“qqS r   )r   rÂ   r   r½   r   )r�   r3   Ú
field_typer   r   r   r  L  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
  )Úlhsr3   ÚrhsÚresultr   r   r   Úregister_combinable_fields  s   	r  é€   )Úmaxsizec                 C   s<   t  | d¡}|D ]\}}}t||ƒrt||ƒr|  S qd S )Nr   )r  r×   Ú
issubclass)r3   Úlhs_typeÚrhs_typeÚcombinatorsÚcombinator_lhs_typeÚcombinator_rhs_typeÚcombined_typer   r   r   Ú_resolve_combined_type‘  s   ÿ€ür&  c                       sf   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
edd„ ƒZ‡  ZS )r1   Nc                    s$   t ƒ j|d� || _|| _|| _d S ©Nrv   )Úsuperrx   r3   r  r  )r   r  r3   r  r   ©r¶   r   r   rx   œ  s   
zCombinedExpression.__init__c                 C   s   d  | jj| ¡S )Nz<{}: {}>)Úformatr¶   r!   r9   r   r   r   Ú__repr__¢  r;   zCombinedExpression.__repr__c                 C   s   d  | j| j| j¡S )Nz{} {} {})r*  r  r3   r  r9   r   r   r   Ú__str__¥  rÁ   zCombinedExpression.__str__c                 C   ó   | j | jgS rq   ©r  r  r9   r   r   r   r„   ¨  r‰   z)CombinedExpression.get_source_expressionsc                 C   ó   |\| _ | _d S rq   r.  r†   r   r   r   rˆ   «  r;   z)CombinedExpression.set_source_expressionsc                 C   sZ   t | jt| jjƒt| jjƒƒ}|d u r*t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&  r3   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  ÚopsÚcombine_expressionr3   ©r   r   r   r’   Úexpression_paramsr   r   Ú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w z|j ¡ }	W n tt	fyD   d }	Y nw 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   r3   rC   r{   r©   )r   r¦   r¥   r§   r¨   r«   r  r  r   r!  Údatetime_fieldsr¬   r   r   r   r.   Í  sZ   
ÿ
ÿÿÿÿûþ	ûz%CombinedExpression.resolve_expressionc                 C   ó   | j jo| jjS rq   )r  rú   r  r9   r   r   r   rú   ü  ó   z"CombinedExpression.allowed_defaultrq   rõ   )r!   r"   r#   rx   r+  r,  r„   rˆ   r±   r   r.   r   rú   Ú__classcell__r   r   r)  r   r1   ›  s    
ÿ/r1   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w | ¡ dkr$| |¡\}}|j |¡|fS | |¡S )Nr8  )r   r   r   r2  r3  Úformat_for_duration_arithmetic)r   Úsider   r   Úoutputr   r   r   r   r   r2    s   
ÿ
zDurationExpression.compilec                    sš   |j jrtƒ  ||¡S |j | ¡ g }g }|  | j||¡\}}| |¡ | 	|¡ |  | j
||¡\}}| |¡ | 	|¡ d}|j | j|¡}|| |fS r1  )ÚfeaturesÚhas_native_duration_fieldr(  r   r3  Úcheck_expression_supportr2  r  r
  rã   r  Úcombine_duration_expressionr3   r5  r)  r   r   r     s   



zDurationExpression.as_sqlc           	   	   K   s–   | j ||fi |¤Ž\}}| jtjtjhv rGz| jj ¡ }| jj ¡ }W n t	t
fy1   Y ||fS w h d£}||vs>||vrGtd| j› d�ƒ‚||fS )N>   r½   r   rÂ   r8  zInvalid arguments for operator Ú.)r   r3   r%   r8   rG   r  r   r   r  r>  r   r
   )	r   r   r   r   r   r   r   r!  Úallowed_fieldsr   r   r   r      s   óÿzDurationExpression.as_sqlite)r!   r"   r#   r2  r   r    rB  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 rq   )r(  rx   rC   )r   r  r  r)  r   r   rx   7  ó   zTemporalSubtraction.__init__c                 C   s<   |j  | ¡ | | j¡}| | j¡}|j  | jj ¡ ||¡S rq   )r3  rH  r2  r  r  Úsubtract_temporalsr   r   )r   r   r   r  r  r   r   r   r   :  s   ÿzTemporalSubtraction.as_sql)	r!   r"   r#   r   r8  r   rx   r   rB  r   r   r)  r   r=  4  s    r=  zdjango.db.models.F)Úpathc                   @   s`   e Zd ZdZdZdd„ Zdd„ Z	dd	d
„Zdd„ Zdd„ Z	dd„ Z
dd„ Zdd„ Zdd„ ZdS )r�   zDAn object capable of resolving references to existing query objects.Fc                 C   s
   || _ dS )z^
        Arguments:
         * name: the name of the field this expression references
        N)rË   rÊ   r   r   r   rx   I  s   
z
F.__init__c                 C   ó   d  | jj| j¡S ©Nú{}({}))r*  r¶   r!   rË   r9   r   r   r   r+  P  ó   z
F.__repr__NTc                 C   s   |  | j|||¡S rq   )Úresolve_refrË   ©r   r¦   r¥   r§   r¨   r«   r   r   r   r.   S  s   zF.resolve_expressionc                 C   s   |  | | ¡S rq   )r×   )r   rÖ   r   r   r   rÔ   X  r‰   zF.replace_expressionsc                 K   rç   rq   rè   rê   r   r   r   rì   [  r;   zF.ascc                 K   rí   rî   rè   rê   r   r   r   rð   ^  rÁ   zF.descc                 C   s   | j |j ko| j|jkS rq   )r¶   rË   r@   r   r   r   r  a  ó   zF.__eq__c                 C   r  rq   )r  rË   r9   r   r   r   r  d  rß   z
F.__hash__c                 C   rÝ   rq   rÞ   r9   r   r   r   r{   g  rß   zF.copyrõ   )r!   r"   r#   r$   rú   rx   r+  r.   rÔ   rì   rð   r  r  r{   r   r   r   r   r�   C  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   rj   )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   v  rn   zResolvedOuterRef.as_sqlc                    s:   t ƒ j|i |¤Ž}|jrtd| j› d�ƒ‚t| jv |_|S )Nz<Referencing outer query window expression is not supported: rJ  )r(  r.   rŸ   r   rË   r   Úpossibly_multivalued)r   r  rë   Úcolr)  r   r   r.   |  s   ÿÿz#ResolvedOuterRef.resolve_expressionc                 C   r¸   rq   r   ©r   Úrelabelsr   r   r   rÍ   ‰  r…   z ResolvedOuterRef.relabeled_clonec                 C   rƒ   rq   r   r9   r   r   r   rä   Œ  r…   z"ResolvedOuterRef.get_group_by_cols)r!   r"   r#   r$   r—   rŸ   r   r.   rÍ   rä   rB  r   r   r)  r   rV  k  s    rV  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 rq   )r‹   rË   r¶   rV  rX  r   r   r   r.   ”  s   
zOuterRef.resolve_expressionc                 C   r¸   rq   r   r[  r   r   r   rÍ   ™  r…   zOuterRef.relabeled_cloneN)r!   r"   r#   r—   rŸ   r.   rÍ   r   r   r   r   r]  �  s
    r]  zdjango.db.models.Funcc                       sŠ   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edd„ ƒZ‡  ZS )ÚFunczAn SQL function call.Nz%(function)s(%(expressions)s)r0  rv   c                   sh   | j d ur"t|ƒ| j kr"td| jj| j | j dkrdndt|ƒf ƒ‚tƒ j|d� | j|Ž | _|| _	d S )Nz#'%s' takes exactly %s %s (%s given)é   Úargumentr  rv   )
ÚarityÚlenÚ	TypeErrorr¶   r!   r(  rx   r“   rÙ   Úextra)r   r   r’   rd  r)  r   r   rx   ¦  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   ó   � | ]}t |ƒV  qd S rq   ©rŒ   rŽ   r   r   r   rš   ¶  ó   € z Func.__repr__.<locals>.<genexpr>r0  c                 s   s(   � | ]\}}t |ƒd  t |ƒ V  qdS )ú=Nrf  )r�   ÚkeyÚvalr   r   r   rš   ¹  s   € 
ÿú
{}({}, {})rQ  )
Ú
arg_joinerÚjoinrÙ   rd  Ú_get_repr_optionsÚsortedr  r*  r¶   r!   )r   r  rd  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   r9   r   r   r   rn  ¿  r¼   zFunc._get_repr_optionsc                 C   r®   rq   ©rÙ   r9   r   r   r   r„   Ã  ó   zFunc.get_source_expressionsc                 C   s
   || _ d S rq   rp  r†   r   r   r   rˆ   Æ  rß   zFunc.set_source_expressionsTFc           	      C   s>   |   ¡ }||_t|jƒD ]\}}| |||||¡|j|< q|S rq   )r{   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 ]D}	z	| |	¡\}
}W n. ty5   t|	dtƒ}|tu r*‚ | t|ƒ¡\}
}Y n tyF   | tdƒ¡\}
}Y nw | 	|
¡ | 
|¡ qi | j¥|¥}|d urb||d< n| d| j¡ |pq| d| j¡}|pz| d| j¡}| |¡ |d< |d< || |fS )Nr÷   TÚfunctionÚtemplaterl  r’   r¯   )r3  rH  rÙ   r2  r   rS   rö   r0   r	   r
  rã   rd  Ú
setdefaultrt  r×   ru  rl  rm  )r   r   r   rt  ru  rl  r   Ú	sql_partsr   r�   Úarg_sqlÚ
arg_paramsr÷   Údatar   r   r   r   Ô  s4   	
ÿÿ

zFunc.as_sqlc                    s*   t ƒ  ¡ }| jd d … |_| j ¡ |_|S rq   )r(  r{   rÙ   rd  )r   r{   r)  r   r   r{   û  s   
z	Func.copyc                 C   s   t dd„ | jD ƒƒS )Nc                 s   ó   � | ]}|j V  qd S rq   ©rú   )r�   r»   r   r   r   rš     s   € z'Func.allowed_default.<locals>.<genexpr>)ÚallrÙ   r9   r   r   r   rú     ó   zFunc.allowed_defaultrõ   )NNN)r!   r"   r#   r$   rt  ru  rl  ra  rx   r+  rn  r„   rˆ   r.   r   r{   r   rú   rB  r   r   r)  r   r^  �  s(    

ÿ
ú'r^  zdjango.db.models.Valuec                       sf   e Zd 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 )r0   z9Represent a wrapped value as a node within an expression.FTNc                    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().
        rv   N)r(  rx   rº   )r   rº   r   r)  r   r   rx     s   	
zValue.__init__c                 C   s   | j j› d| j›d�S )Nú(ú))r¶   r!   rº   r9   r   r   r   r+    rL  zValue.__repr__c                 C   s|   |j  | ¡ | j}| j}|d ur1| jr|j||d�}n|j||d�}t|dƒr1| |||¡|gfS |d u r9dg fS d|gfS )N)r   Úget_placeholderÚNULLz%s)	r3  rH  rº   r³   r«   Úget_db_prep_saveÚget_db_prep_valuer/   r�  )r   r   r   rj  r   r   r   r   r     s   

zValue.as_sqlc                    s   t ƒ  |||||¡}||_|S rq   )r(  r.   r«   rª   r)  r   r   r.   0  s   zValue.resolve_expressionc                 C   rƒ   rq   r   r9   r   r   r   rä   7  r…   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	ƒr(t 
¡ S t | jtjƒr3t ¡ S t | jtjƒr>t ¡ S t | jtjƒrIt ¡ S t | jtjƒrTt ¡ S t | jtƒr^t ¡ S t | jtƒrht ¡ S t | jtƒrrt ¡ S d S rq   )r‹   rº   rŒ   r   Ú	CharFieldÚboolr­   rÃ   rÂ   r¿   r½   Údatetimer;  Údater9  Útimer:  Ú	timedeltar8  r   r   ÚbytesÚBinaryFieldr   Ú	UUIDFieldr9   r   r   r   r±   :  s.   ÿzValue._resolve_output_fieldc                 C   r®   rq   )rº   r9   r   r   r   r÷   R  r°   zValue.empty_result_set_valuerq   rõ   )r!   r"   r#   r$   r«   rú   rx   r+  r   r.   rä   r±   rû   r÷   rB  r   r   r)  r   r0     s    ÿr0   c                       sJ   e Zd ZdZd‡ fdd„	Zdd„ Zdd„ Zd	d
„ Z	d‡ fdd„	Z‡  Z	S )ÚRawSQLTNc                    s0   |d u rt  ¡ }||| _| _tƒ j|d� d S r'  )r   r  r   r   r(  rx   )r   r   r   r   r)  r   r   rx   Z  s   zRawSQL.__init__c                 C   ó   d  | jj| j| j¡S ©Nrk  )r*  r¶   r!   r   r   r9   r   r   r   r+  `  rL  zRawSQL.__repr__c                 C   s   d| j  | jfS r1  )r   r   r”   r   r   r   r   c  r;   zRawSQL.as_sqlc                 C   ó   | gS rq   r   r9   r   r   r   rä   f  rq  zRawSQL.get_group_by_colsFc           
         sn   |j r-|j j ¡ D ]#}|jjD ]}| ¡ \}}	|	 ¡ | j ¡ v r+| |j|||¡  nqq	t	ƒ  
|||||¡S rq   )r  r  Úget_parent_listÚlocal_fieldsÚget_attname_columnÚlowerr   rS  rË   r(  r.   )
r   r¦   r¥   r§   r¨   r«   ÚparentÚparent_fieldÚ_Úcolumn_namer)  r   r   r.   i  s   
ÿü€
ÿzRawSQL.resolve_expressionrq   rõ   )
r!   r"   r#   rú   rx   r+  r   rä   r.   rB  r   r   r)  r   rŽ  W  s    ÿrŽ  c                   @   s   e Zd Zdd„ Zdd„ ZdS )ÚStarc                 C   s   dS )Nz'*'r   r9   r   r   r   r+  |  r…   zStar.__repr__c                 C   ó   dg fS )Nr(   r   r”   r   r   r   r     rt   zStar.as_sqlN)r!   r"   r#   r+  r   r   r   r   r   rš  {  s    rš  c                   @   r   )ÚDatabaseDefaultzCPlaceholder expression for the database default in an insert query.c                 C   r›  )NÚDEFAULTr   r”   r   r   r   r   †  rt   zDatabaseDefault.as_sqlN)r!   r"   r#   r$   r   r   r   r   r   rœ  ƒ  ó    rœ  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 u r|}t ƒ j|d� ||| _| _d S r'  )r(  rx   ÚaliasÚtarget)r   r   r¡  r   r)  r   r   rx   Ž  s   zCol.__init__c                 C   s>   | j | j}}|r|t|ƒfnt|ƒf}d | jjd |¡¡S )NrQ  r0  )r   r¡  rŒ   r*  r¶   r!   rm  )r   r   r¡  Úidentifiersr   r   r   r+  ”  s   zCol.__repr__c                 C   s<   | j | jj}}|r||fn|f}d t|j|ƒ¡}|g fS )NrJ  )r   r¡  Úcolumnrm  ÚmapÚquote_name_unless_alias)r   r   r   r   r£  r¢  r   r   r   r   r   ™  s   z
Col.as_sqlc                 C   s,   | j d u r| S |  | | j | j ¡| j| j¡S rq   )r   r¶   r×   r¡  r   r[  r   r   r   rÍ   Ÿ  s
   
ÿzCol.relabeled_clonec                 C   r‘  rq   r   r9   r   r   r   rä   ¦  rq  zCol.get_group_by_colsc                 C   s0   | j | jkr| j |¡S | j |¡| j  |¡ S rq   )r¡  r   r�   r‚   r   r   r   r�   ©  s   ÿ
þzCol.get_db_convertersrq   )r!   r"   r#   r    rY  rx   r+  r   rÍ   rä   r�   rB  r   r   r)  r   rŸ  Š  s    rŸ  c                       sd   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 rq   )r(  rx   rÜ   r´   )r   rÜ   r´   r)  r   r   rx   ·  s   
zRef.__init__c                 C   r�  r�  )r*  r¶   r!   rÜ   r´   r9   r   r   r   r+  »  rL  zRef.__repr__c                 C   ó   | j gS rq   ©r´   r9   r   r   r   r„   ¾  rt   zRef.get_source_expressionsc                 C   s   |\| _ d S rq   r¨  r†   r   r   r   rˆ   Á  r‰   zRef.set_source_expressionsNTFc                 C   r¸   rq   r   rT  r   r   r   r.   Ä  s   zRef.resolve_expressionc                 C   s   | j hS rq   )rÜ   r9   r   r   r   rÛ   Ë  rt   zRef.get_refsc                 C   s   |   ¡ }| j |¡|_|S rq   )r{   r´   rÍ   )r   r\  rÓ   r   r   r   rÍ   Î  s   zRef.relabeled_clonec                 C   s   |j  | j¡g fS rq   )r3  Ú
quote_namerÜ   r”   r   r   r   r   Ó  rR  z
Ref.as_sqlc                 C   r‘  rq   r   r9   r   r   r   rä   Ö  rq  zRef.get_group_by_colsrõ   )r!   r"   r#   r$   rx   r+  r„   rˆ   r.   rÛ   rÍ   r   rä   rB  r   r   r)  r   r¦  ±  s    
ÿr¦  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|i |¤Ž d S )Nz$%s requires at least one expression.)rW  r¶   r!   r(  rx   ©r   r’   rd  r)  r   r   rx   ã  s
   
ÿzExpressionList.__init__c                 C   s   | j  dd„ | jD ƒ¡S )Nc                 s   re  rq   rf  rŽ   r   r   r   rš   ë  rg  z)ExpressionList.__str__.<locals>.<genexpr>)rl  rm  rÙ   r9   r   r   r   r,  ê  rU  zExpressionList.__str__c                 K   s   | j ||fi |¤ŽS rq   )r   )r   r   r   r   r   r   r   r    í  r~  zExpressionList.as_sqlitec                 C   ó$   g }|   ¡ D ]	}| | ¡ ¡ q|S rq   ©r„   rã   rä   )r   Úgroup_by_colsÚ	partitionr   r   r   rä   ñ  ó   z ExpressionList.get_group_by_cols)
r!   r"   r#   r$   ru  rx   r,  r    rä   rB  r   r   r)  r   rª  Ú  s    rª  c                       s8   e Zd ZdZdZ‡ fdd„Z‡ fdd„Zdd„ Z‡  ZS )	ÚOrderByListFzORDER BY %(expressions)sc                    s$   dd„ |D ƒ}t ƒ j|i |¤Ž d S )Nc                 s   sB   � | ]}t |tƒr|d  dkrt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(  rx   r«  r)  r   r   rx   ü  s   úzOrderByList.__init__c                    s   | j sdS tƒ j|i |¤ŽS )N)Ú r   )rÙ   r(  r   rX  r)  r   r   r     s   zOrderByList.as_sqlc                 C   r¬  rq   r­  )r   r®  Úorder_byr   r   r   rä     r°  zOrderByList.get_group_by_cols)	r!   r"   r#   rú   ru  rx   r   rä   rB  r   r   r)  r   r±  ø  s    r±  z"django.db.models.ExpressionWrapperc                       sX   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	e
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(  rx   r»   )r   r»   r   r)  r   r   rx     s   
zExpressionWrapper.__init__c                 C   ó   |d | _ d S ©Nr   ©r»   r†   r   r   r   rˆ     ó   z(ExpressionWrapper.set_source_expressionsc                 C   r§  rq   r¸  r9   r   r   r   r„   !  rt   z(ExpressionWrapper.get_source_expressionsc                    s0   t | jtƒr| j ¡ }| j|_| ¡ S tƒ  ¡ S rq   )r‹   r»   rý   r{   r   rä   r(  ©r   r»   r)  r   r   rä   $  s
   

z#ExpressionWrapper.get_group_by_colsc                 C   s   |  | j¡S rq   )r2  r»   r”   r   r   r   r   -  r‰   zExpressionWrapper.as_sqlc                 C   rO  rP  )r*  r¶   r!   r»   r9   r   r   r   r+  0  rR  zExpressionWrapper.__repr__c                 C   ó   | j jS rq   )r»   rú   r9   r   r   r   rú   3  ó   z!ExpressionWrapper.allowed_default)r!   r"   r#   r$   rx   rˆ   r„   rä   r   r+  rû   rú   rB  r   r   r)  r   rµ    s    	rµ  c                       sL   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 )rr   z1The logical negation of a conditional expression.c                    s   t ƒ j|t ¡ d� d S r'  )r(  rx   r   r­   rº  r)  r   r   rx   ;  rU  zNegatedExpression.__init__c                 C   ó
   | j  ¡ S rq   )r»   r{   r9   r   r   r   rs   >  rß   zNegatedExpression.__invert__c                    s~   zt ƒ  ||¡\}}W n ty%   |jj}|jsY dS | tdƒ¡ Y S w |jj}| 	| j
¡s8d|› 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   rF  Ú&supports_boolean_expr_in_select_clauser2  r0   r3  Ú0conditional_expression_supported_in_where_clauser»   )r   r   r   r   r   rF  r3  r)  r   r   r   A  s   üzNegatedExpression.as_sqlNTFc                    s.   t ƒ  |||||¡}t|jddƒstdƒ‚|S )NrP   Fz*Cannot negate non-conditional expressions.)r(  r.   rS   r»   rc  )r   r¦   r¥   r§   r¨   r«   Úresolvedr)  r   r   r.   Q  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   r3  r¿  rF  r¾  r»   r*  )r   r   r   r   Ú$expression_supported_in_where_clauser   r   r   ró   [  s   ÿÿý
zNegatedExpression.select_formatrõ   )
r!   r"   r#   r$   rx   rs   r   r.   ró   rB  r   r   r)  r   rr   8  s    ÿ
rr   zdjango.db.models.Whenc                       sx   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edd„ ƒZ‡  ZS )ÚWhenz"WHEN %(condition)s THEN %(result)sFNc                    s¢   |r"|d u rt di |¤Žd }}nt|ddƒr"t |fi |¤Žd }}|d u s.t|ddƒr.|r2tdƒ‚t|t ƒr=|s=tdƒ‚tƒ jd d� || _|  |¡d | _	d S )NrP   FzLWhen() supports a Q object, a boolean expression, or lookups as a condition.z1An empty Q() can't be used as a When() condition.rv   r   r   )
r   rS   rc  r‹   rW  r(  rx   Ú	conditionr“   r  )r   rÄ  ÚthenÚlookupsr)  r   r   rx   q  s   ÿzWhen.__init__c                 C   s   d| j | jf S )NzWHEN %r THEN %r©rÄ  r  r9   r   r   r   r,  ‚  r;   zWhen.__str__c                 C   ó   d| j j| f S ©Nz<%s: %s>©r¶   r!   r9   r   r   r   r+  …  r;   zWhen.__repr__c                 C   r-  rq   rÇ  r9   r   r   r   r„   ˆ  r‰   zWhen.get_source_expressionsc                 C   r/  rq   rÇ  r†   r   r   r   rˆ   ‹  r;   zWhen.set_source_expressionsc                 C   s
   | j jgS rq   )r  r³   r9   r   r   r   rµ   Ž  s   
zWhen.get_source_fieldsTc                 C   sJ   |   ¡ }||_t|jdƒr|j ||||d¡|_|j |||||¡|_|S )Nr.   F)r{   r©   r/   rÄ  r.   r  rª   r   r   r   r.   ’  s   
ÿ
ÿzWhen.resolve_expressionc                 K   sh   |j  | ¡ |}g }| | j¡\}}||d< | | j¡\}	}
|	|d< |p&| j}|| g |¢|¢|
¢R fS )NrÄ  r  )r3  rH  r2  rÄ  r  ru  )r   r   r   ru  r   Útemplate_paramsÚ
sql_paramsÚcondition_sqlÚcondition_paramsÚ
result_sqlÚresult_paramsr   r   r   r      s   
ÿþýzWhen.as_sqlc                 C   r¬  rq   r­  rå   r   r   r   rä   ¯  s   zWhen.get_group_by_colsc                 C   r@  rq   )rÄ  rú   r  r9   r   r   r   rú   ¶  rA  zWhen.allowed_default©NNrõ   rq   )r!   r"   r#   ru  rP   rx   r,  r+  r„   rˆ   rµ   r.   r   rä   r   rú   rB  r   r   r)  r   rÃ  k  s    
ÿ
rÃ  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e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 rq   )r‹   rÃ  )r�   Úcaser   r   r   rš   Í  s   € z Case.__init__.<locals>.<genexpr>z.Positional arguments must all be When objects.r   )	r}  rc  r(  rx   ÚlistÚcasesr“   rÔ  rd  )r   rÔ  r   r×  rd  r)  r   r   rx   Ì  s   

zCase.__init__c                 C   s    dd  dd„ | jD ƒ¡| jf S )NzCASE %s, ELSE %rr0  c                 s   re  rq   rf  )r�   r¬   r   r   r   rš   Ö  rg  zCase.__str__.<locals>.<genexpr>)rm  r×  rÔ  r9   r   r   r   r,  Ô  s   þzCase.__str__c                 C   rÈ  rÉ  rÊ  r9   r   r   r   r+  Ú  r;   zCase.__repr__c                 C   s   | j | jg S rq   ©r×  rÔ  r9   r   r   r   r„   Ý  r¹  zCase.get_source_expressionsc                 C   s   |�^ | _ | _d S rq   rØ  r†   r   r   r   rˆ   à  rR  zCase.set_source_expressionsTFc           	      C   sT   |   ¡ }||_t|jƒD ]\}}| |||||¡|j|< q|j |||||¡|_|S rq   )r{   r©   rr  r×  r.   rÔ  )	r   r¦   r¥   r§   r¨   r«   r¬   rs  rÕ  r   r   r   r.   ã  s   
ÿ
ÿzCase.resolve_expressionc                    s   t ƒ  ¡ }|jd d … |_|S rq   )r(  r{   r×  )r   r¬   r)  r   r   r{   ñ  s   
z	Case.copyc              	   K   s   |j  | ¡ | js| | j¡S i | j¥|¥}g }g }| | j¡\}	}
| jD ]0}z	| |¡\}}W n ty9   Y q% tyJ   | |j¡\}	}
Y  nw | 	|¡ | 
|¡ q%|s\|	|
fS |p`| j}| |¡|d< |	|d< | 
|
¡ |py| d| j¡}|| }| jd urŒ|j  | j¡| }||fS )Nr×  rÔ  ru  )r3  rH  r×  r2  rÔ  rd  r   r	   r  r
  rã   Úcase_joinerrm  r×   ru  r³   Úunification_cast_sqlr   )r   r   r   ru  rÙ  r   rË  Ú
case_partsrÌ  Údefault_sqlÚdefault_paramsrÕ  Úcase_sqlÚcase_paramsr   r   r   r   r   ö  s:   
þ



zCase.as_sqlc                    s   | j s| j ¡ S tƒ  ¡ S rq   )r×  rÔ  rä   r(  r9   r)  r   r   rä     s   

zCase.get_group_by_colsc                 C   s   | j jotdd„ | jD ƒƒS )Nc                 s   r{  rq   r|  )r�   Úcase_r   r   r   rš     s   € 
ÿz'Case.allowed_default.<locals>.<genexpr>)rÔ  rú   r}  r×  r9   r   r   r   rú     s   ÿzCase.allowed_defaultrõ   rÑ  )r!   r"   r#   r$   ru  rÙ  rx   r,  r+  r„   rˆ   r.   r{   r   rä   r   rú   rB  r   r   r)  r   rÒ  »  s"    
ÿ
ÿ rÒ  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)rS   rÓ   r¦   r¢   rd  r(  rx   )r   Úquerysetr   rd  r)  r   r   rx   -  s   zSubquery.__init__c                 C   r§  rq   ©r¦   r9   r   r   r   r„   4  rt   zSubquery.get_source_expressionsc                 C   r¶  r·  rã  r†   r   r   r   rˆ   7  r¹  zSubquery.set_source_expressionsc                 C   r»  rq   )r¦   r   r9   r   r   r   r±   :  rt   zSubquery._resolve_output_fieldc                    s   t ƒ  ¡ }|j ¡ |_|S rq   )r(  r{   r¦   rÓ   )r   rÓ   r)  r   r   r{   =  r   zSubquery.copyc                 C   r»  rq   )r¦   Úexternal_aliasesr9   r   r   r   rä  B  r¼  zSubquery.external_aliasesc                 C   r½  rq   )r¦   Úget_external_colsr9   r   r   r   rå  F  rß   zSubquery.get_external_colsc           	      K   s^   |j  | ¡ i | j¥|¥}| j ||¡\}}|dd… |d< |p&| d| j¡}|| }||fS )Nr_  r6   r¢   ru  )r3  rH  rd  r¦   r   r×   ru  )	r   r   r   ru  r   rË  Úsubquery_sqlrÌ  r   r   r   r   r   I  s   zSubquery.as_sqlc                 C   s   | j j| d�S )N)Úwrapper)r¦   rä   r9   r   r   r   rä   S  r¹  zSubquery.get_group_by_colsrq   )r!   r"   r#   r$   ru  r—   r÷   r¢   rx   r„   rˆ   r±   r{   rû   rä  rå  r   rä   rB  r   r   r)  r   rá  "  s     


rá  c                       s@   e Zd ZdZe ¡ ZdZ‡ fdd„Zdd„ Z	‡ fdd„Z
‡  ZS )	ÚExistszEXISTS(%(subquery)s)Fc                    s$   t ƒ j|fi |¤Ž | j ¡ | _d S rq   )r(  rx   r¦   Úexists)r   râ  rë   r)  r   r   rx   \  s   zExists.__init__c                 C   s   |j jjs
d |¡}||fS rÁ  )r   rF  r¾  r*  rô   r   r   r   ró   `  s   

zExists.select_formatc                    sR   zt ƒ j|g|¢R i |¤ŽW S  ty(   |jj}|jsY dS | tdƒ¡ Y S w )N)z1=0r   F)r(  r   r   r   rF  r¾  r2  r0   )r   r   r  rë   rF  r)  r   r   r   h  s   üzExists.as_sql)r!   r"   r#   ru  r   r­   r   r÷   rx   ró   r   rB  r   r   r)  r   rè  W  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   sV   |r|rt dƒ‚|du s|du rt dƒ‚|| _|| _|| _t|dƒs&t dƒ‚|| _d S )Nz1nulls_first and nulls_last are mutually exclusiveFz7nulls_first and nulls_last values must be True or None.r.   z%expression must be an expression type)rW  Únulls_firstÚ
nulls_lastrï   r/   r»   )r   r»   rï   rê  rë  r   r   r   rx   w  s   

zOrderBy.__init__c                 C   r�  )Nz{}({}, descending={}))r*  r¶   r!   r»   rï   r9   r   r   r   r+  ƒ  s   ÿzOrderBy.__repr__c                 C   r¶  r·  r¸  r†   r   r   r   rˆ   ˆ  r¹  zOrderBy.set_source_expressionsc                 C   r§  rq   r¸  r9   r   r   r   r„   ‹  rt   zOrderBy.get_source_expressionsc                 K   s¾   |p| j }|jjr| jrd| }n%| jrd| }n| jr(| jr#|jjs(d| }n| jr6| js2|jjs6d| }|j | ¡ | 	| j
¡\}}|| jrJdnddœ|¥}|| d¡9 }||  ¡ |fS )	Nz%s NULLS LASTz%s NULLS FIRSTz%%(expression)s IS NULL, %sz%%(expression)s IS NOT NULL, %sÚDESCÚASC)r»   Úorderingz%(expression)s)ru  rF  Ú supports_order_by_nulls_modifierrë  rê  rï   Úorder_by_nulls_firstr3  rH  r2  r»   ÚcountÚrstrip)r   r   r   ru  r   Úexpression_sqlr   Úplaceholdersr   r   r   r   Ž  s8   

€ÿÿ
ÿÿþýzOrderBy.as_sqlc                 C   sN   |j js!|j | j¡r!|  ¡ }tt| jdd�dd�|_| ||¡S |  ||¡S )NT)rÅ  F)rÔ  )	rF  r¾  r3  r¿  r»   r{   rÒ  rÃ  r   )r   r   r   r{   r   r   r   Ú	as_oracle¨  s   ÿÿþþzOrderBy.as_oraclec                 C   r¬  rq   r­  rå   r   r   r   rä   ¹  r°  zOrderBy.get_group_by_colsc                 C   s6   | j  | _ | jrd| _d | _| S | jrd| _d | _| S rc   )rï   rê  rë  r9   r   r   r   rñ   ¿  s   
ýzOrderBy.reverse_orderingc                 C   ó
   d| _ d S r=   r²  r9   r   r   r   rì   É  rß   zOrderBy.ascc                 C   rö  rc   r²  r9   r   r   r   rð   Ì  rß   zOrderBy.desc)FNNrq   )r!   r"   r#   ru  rP   rx   r+  rˆ   r„   r   rõ  rä   rñ   rì   rð   r   r   r   r   ré   r  s    


ré   c                       sx   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 ur/t| j tt	fƒs)| j f| _ t
| j Ž | _ | jd urVt| jt	tfƒrCt| jŽ | _nt| jttfƒrRt| 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.rv   r   )Úpartition_byr´  ÚframerS   rW  r¶   r!   r‹   r  rÖ  rª  r±  ru   rŒ   r(  rx   r“   Úsource_expression)r   r»   rø  r´  rù  r   r)  r   r   rx   Ø  s.   ÿÿ


ÿzWindow.__init__c                 C   r»  rq   )rú  r   r9   r   r   r   r±   ü  rt   zWindow._resolve_output_fieldc                 C   s   | j | j| j| jgS rq   ©rú  rø  r´  rù  r9   r   r   r   r„   ÿ  rÁ   zWindow.get_source_expressionsc                 C   s   |\| _ | _| _| _d S rq   rû  r†   r   r   r   rˆ     rU  zWindow.set_source_expressionsc                 C   sø   |j  | ¡ |jjstdƒ‚| | j¡\}}g d}}| jd ur6| jj||dd�\}}	| 	|¡ |t
|	ƒ7 }| jd urN| | j¡\}
}| 	|
¡ |t
|ƒ7 }| jrd| | j¡\}}| 	|¡ |t
|ƒ7 }|ph| j}||d |¡ ¡ dœ g |¢|¢R fS )Nz1This backend does not support window expressions.r   zPARTITION BY %(expressions)s)r   r   ru  rÓ  )r»   Úwindow)r3  rH  rF  Úsupports_over_clauser   r2  rú  rø  r   r
  r  r´  rù  ru  rm  Ústrip)r   r   r   ru  Úexpr_sqlr   Ú
window_sqlÚwindow_paramsÚsql_exprrÌ  Ú	order_sqlÚorder_paramsÚ	frame_sqlÚframe_paramsr   r   r   r     s2   


ý




þzWindow.as_sqlc                    sT   t | jtjƒr$|  ¡ }| ¡ }t ¡ |d _| |¡ tt	|ƒ 
||¡S |  ||¡S r·  )r‹   r   r   r   r{   r„   r½   rˆ   r(  r÷  r    r   )r   r   r   r{   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pdƒ¡S )Nz{} OVER ({}{}{})zPARTITION BY r³  )r*  rŒ   rú  rø  r´  rù  r9   r   r   r   r,  0  s   üzWindow.__str__c                 C   rÈ  rÉ  rÊ  r9   r   r   r   r+  8  r;   zWindow.__repr__c                 C   s8   g }| j r| | j  ¡ ¡ | jd ur| | j ¡ ¡ |S rq   )rø  rã   rä   r´  )r   r®  r   r   r   rä   ;  s   
zWindow.get_group_by_cols)NNNNrq   )r!   r"   r#   ru  r—   rŸ   rx   r±   r„   rˆ   r   r    r,  r+  rä   rB  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 rq   )r0   ÚstartÚend©r   r  r	  r   r   r   rx   O  s   
zWindowFrame.__init__c                 C   r/  rq   ©r  r	  r†   r   r   r   rˆ   S  r;   z"WindowFrame.set_source_expressionsc                 C   r-  rq   r  r9   r   r   r   r„   V  r‰   z"WindowFrame.get_source_expressionsc                 C   s>   |j  | ¡ |  || jj| jj¡\}}| j| j||dœ g fS )N©Ú
frame_typer  r	  )r3  rH  Úwindow_frame_start_endr  rº   r	  ru  r  )r   r   r   r  r	  r   r   r   r   Y  s   ÿýÿùzWindowFrame.as_sqlc                 C   rÈ  rÉ  rÊ  r9   r   r   r   r+  h  r;   zWindowFrame.__repr__c                 C   rƒ   rq   r   r9   r   r   r   rä   k  r…   zWindowFrame.get_group_by_colsc                 C   sÈ   | j jd ur| j jdk rdt| 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 urE| jjdkrEd| jjtjj	f }n| jjd urV| jjdkrVtjj}ntjj
}| j| j||dœ S )Nr   z%d %sr  )r  rº   Úabsr   r3  Ú	PRECEDINGÚCURRENT_ROWÚUNBOUNDED_PRECEDINGr	  Ú	FOLLOWINGÚUNBOUNDED_FOLLOWINGru  r  r
  r   r   r   r,  n  s   

ýzWindowFrame.__str__c                 C   rj   )Nz3Subclasses must implement window_frame_start_end().rl   ©r   r   r  r	  r   r   r   r  ‚  rt   z"WindowFrame.window_frame_start_endrÑ  )r!   r"   r#   r$   ru  rx   rˆ   r„   r   r+  rä   r,  r  r   r   r   r   r  D  s    
r  c                   @   r   )ÚRowRangeÚROWSc                 C   ó   |j  ||¡S rq   )r3  Úwindow_frame_rows_start_endr  r   r   r   r  ‰  r¹  zRowRange.window_frame_start_endN©r!   r"   r#   r  r  r   r   r   r   r  †  rž  r  c                   @   r   )Ú
ValueRangeÚRANGEc                 C   r  rq   )r3  Úwindow_frame_range_start_endr  r   r   r   r  �  r¹  z!ValueRange.window_frame_start_endNr  r   r   r   r   r  �  rž  r  )Zr{   r‡  Ú	functoolsrþ   Úcollectionsr   Údecimalr   Útypesr   Úuuidr   Údjango.core.exceptionsr   r   r	   Ú	django.dbr
   r   r   Údjango.db.modelsr   Údjango.db.models.constantsr   Údjango.db.models.query_utilsr   Údjango.utils.deconstructr   Údjango.utils.functionalr   Údjango.utils.hashabler   r   r%   ru   rý   r?   r8   rG   rJ   rM   rC   rW   ra   rY   r[   r^   r9  r8  r;  r:  Ú_connector_combinationsrÖ  r  r  Údr  r3   Úfield_typesr  r  r  Ú	lru_cacher&  r1   r<  r=  r�   rV  r]  r^  r0   rŽ  rš  rœ  rŸ  r¦  rª  r±  rµ  rr   rÃ  rÒ  rá  rè  ré   r÷  r  r  r  r   r   r   r   Ú<module>   s      ;*	ûøøúûùûüúûöÿôÿžtÿÿ

	f3'%hP$')$3Of5]tB