o
    ˜¨Êhªô  ã                   @   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?ƒ �qX�qR�qLe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                   @   ó   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   úN/var/www/html/env/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?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©r4   ÚMUL©r   r   r   r   Ú__neg__K   ó   zCombinable.__neg__c                 C   ó   |   || jd¡S ©NF©r4   ÚADD©r   r1   r   r   r   Ú__add__N   r:   zCombinable.__add__c                 C   r;   r<   ©r4   ÚSUBr?   r   r   r   Ú__sub__Q   r:   zCombinable.__sub__c                 C   r;   r<   r6   r?   r   r   r   Ú__mul__T   r:   zCombinable.__mul__c                 C   r;   r<   ©r4   ÚDIVr?   r   r   r   Ú__truediv__W   r:   zCombinable.__truediv__c                 C   r;   r<   ©r4   ÚMODr?   r   r   r   Ú__mod__Z   r:   zCombinable.__mod__c                 C   r;   r<   ©r4   Ú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<   )r4   ÚBITANDr?   r   r   r   Úbitandg   r:   zCombinable.bitandc                 C   r;   r<   )r4   ÚBITLEFTSHIFTr?   r   r   r   Úbitleftshiftj   r:   zCombinable.bitleftshiftc                 C   r;   r<   )r4   ÚBITRIGHTSHIFTr?   r   r   r   Úbitrightshiftm   r:   zCombinable.bitrightshiftc                 C   s0   t | ddƒrt |ddƒrt| ƒt|ƒA S tdƒ‚rN   rQ   r?   r   r   r   Ú__xor__p   rU   zCombinable.__xor__c                 C   r;   r<   )r4   ÚBITXORr?   r   r   r   Úbitxorw   r:   zCombinable.bitxorc                 C   s0   t | ddƒrt |ddƒrt| ƒt|ƒB S tdƒ‚rN   rQ   r?   r   r   r   Ú__or__z   rU   zCombinable.__or__c                 C   r;   r<   )r4   ÚBITORr?   r   r   r   Úbitor�   r:   zCombinable.bitorc                 C   r;   ©NTr=   r?   r   r   r   Ú__radd__„   r:   zCombinable.__radd__c                 C   r;   rb   rA   r?   r   r   r   Ú__rsub__‡   r:   zCombinable.__rsub__c                 C   r;   rb   r6   r?   r   r   r   Ú__rmul__Š   r:   zCombinable.__rmul__c                 C   r;   rb   rE   r?   r   r   r   Ú__rtruediv__�   r:   zCombinable.__rtruediv__c                 C   r;   rb   rH   r?   r   r   r   Ú__rmod__�   r:   zCombinable.__rmod__c                 C   r;   rb   rK   r?   r   r   r   Ú__rpow__“   r:   zCombinable.__rpow__c                 C   ó   t dƒ‚©NrP   ©rS   r?   r   r   r   Ú__rand__–   ó   ÿzCombinable.__rand__c                 C   ri   rj   rk   r?   r   r   r   Ú__ror__›   rm   zCombinable.__ror__c                 C   ri   rj   rk   r?   r   r   r   Ú__rxor__    rm   zCombinable.__rxor__N)(r    r!   r"   r#   r>   rB   r7   rF   rL   rI   rV   r`   rX   rZ   r]   r4   r9   r@   rC   rD   rG   rJ   rM   rT   rW   rY   r[   r\   r^   r_   ra   rc   rd   re   rf   rg   rh   rl   rn   ro   r   r   r   r   r$   %   sL    r$   c                   @   sH  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$dCd5d6„Z%d7d8„ Z&d9d:„ Z'd;d<„ Z(d=d>„ Z)d?d@„ Z*dAdB„ Z+dS )EÚBaseExpressionz%Base class for all query expressions.FTNc                 C   s   |d ur	|| _ d S 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__¶   ó   
zBaseExpression.__getstate__c                 C   s$   | j | ju rg n| j g| j |¡ S rq   )ru   Ú_convert_value_noopr   Úget_db_converters©r   r
   r   r   r   r}   »   s
   ÿ
üz BaseExpression.get_db_convertersc                 C   ó   g S rq   r   r8   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Ú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   ri   )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()rk   ©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€   r8   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˜   r8   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˜   r8   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 rq   r†   r”   ©Úallow_joinsÚqueryÚreuseÚ	summarizer   r   r�     s    þÿýz5BaseExpression.resolve_expression.<locals>.<listcomp>)rw   Ú
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   ÚBooleanFieldr8   r   r   r   rO     s   zBaseExpression.conditionalc                 C   ó   | j S rq   rr   r8   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   rs   r   r   r   r   $  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«   r8   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–   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   Úsources_iterr   r­   r   r   r   rª   9  s    ÿþþÿÿ	õz$BaseExpression._resolve_output_fieldc                 C   ó   | S rq   r   ©ÚvalueÚ
expressionr
   r   r   r   r|   W  ó   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>f  ó   ÿz.BaseExpression.convert_value.<locals>.<lambda>ÚIntegerFieldc                 S   r·   rq   )Úintr²   r   r   r   r¹   l  rº   r   c                 S   r·   rq   r   r²   r   r   r   r¹   r  rº   )r   r   Úendswithr|   )r   r¨   Úinternal_typer   r   r   ru   [  s   ÿ
ÿÿzBaseExpression.convert_valuec                 C   ó   | j  |¡S rq   )r   Ú
get_lookup)r   Úlookupr   r   r   rÀ   x  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>©rw   r„   r€   )r   rÊ   Úcloner   rÉ   r   rÆ   ~  s   
þÿzBaseExpression.relabeled_clonec                    rÅ   )Nc                    s.   g | ]}t |tƒrˆ  |j|¡n| ˆ ¡‘qS r   )r‡   r‰   ÚgetrÄ   Úreplace_referencesr”   ©Úreferences_mapr   r   r�   ‹  s    þÿýz5BaseExpression.replace_references.<locals>.<listcomp>rË   )r   rÐ   rÌ   r   rÏ   r   rÎ   ˆ  ó   
üÿz!BaseExpression.replace_referencesc                 C   s
   t   | ¡S rq   )rw   r8   r   r   r   rw   ”  ó   
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Ó   —  rÑ   z BaseExpression.prefix_referencesc                 C   s0   | j s| gS g }|  ¡ D ]	}| | ¡ ¡ q|S rq   )r“   r€   Ú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�   ­  s    z4BaseExpression.get_source_fields.<locals>.<listcomp>)r€   r8   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²  ó   zBaseExpression.descc                 C   r±   rq   r   r8   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_compatiblert   rz   r}   r€   r„   r�   r   r   r“   r›   rœ   r-   ÚpropertyrO   r¨   r   r¬   rª   Ústaticmethodr|   ru   rÀ   rÂ   rÆ   rÎ   rw   rÓ   r×   r®   rà   rä   ræ   rç   rè   r   r   r   r   rp   ¦   s`    




ÿ







rp   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Ú	signaturert   Ú_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  r8   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   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‹   r2   r   r   r   Ú
<dictcomp>ù  s    ûýÿr  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   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 | ]}t jt jt jfD ]}||t|ft||fg“qqS r   )r   r»   r   r¶   ÚNoneType)r‹   r2   Ú
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þ   )Úlhsr2   ÚrhsÚresultr   r   r   Úregister_combinable_fieldsZ  s   	r  é€   )Úmaxsizec                 C   s<   t  | d¡}|D ]\}}}t||ƒrt||ƒr|  S qd S )Nr   )r  rÍ   Ú
issubclass)r2   Úlhs_typeÚrhs_typeÚcombinatorsÚcombinator_lhs_typeÚcombinator_rhs_typeÚcombined_typer   r   r   Ú_resolve_combined_typel  s   ÿ€ür  c                       sZ   e Zd Zd‡ fdd„	Zdd„ Zdd„ Zdd	„ Zd
d„ Zdd„ Zdd„ Z		ddd„Z
‡  ZS )r0   Nc                    s$   t ƒ j|d� || _|| _|| _d S ©Nrr   )Úsuperrt   r2   r  r  )r   r  r2   r  r   ©r¯   r   r   rt   w  s   
zCombinedExpression.__init__c                 C   s   d  | jj| ¡S )Nz<{}: {}>)Úformatr¯   r    r8   r   r   r   Ú__repr__}  r:   zCombinedExpression.__repr__c                 C   s   d  | j| j| j¡S )Nz{} {} {})r  r  r2   r  r8   r   r   r   Ú__str__€  rå   zCombinedExpression.__str__c                 C   ó   | j | jgS rq   ©r  r  r8   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  r2   rý   r  r¬   r  r   r   r¯   r    )r   r  r   r   r   rª   ‰  s   

ý

ÿ
þÿz(CombinedExpression._resolve_output_fieldc                 C   sp   g }g }|  | j¡\}}| |¡ | |¡ |  | j¡\}}| |¡ | |¡ d}|j | j|¡}|| |fS ©Nz(%s))Úcompiler  rþ   rÖ   r  ÚopsÚcombine_expressionr2   ©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   r2   rB   rw   r¢   )r   rŸ   rž   r    r¡   r¤   r  r  r  r  Údatetime_fieldsr¥   r   r   r   r-   ¨  sZ   
ÿ
ÿÿÿÿûþ	ûz%CombinedExpression.resolve_expressionrq   rê   )r    r!   r"   rt   r  r  r€   r„   rª   r   r-   Ú__classcell__r   r   r  r   r0   v  s    ÿr0   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 )Nr+  )r   r   r   r%  r&  Úformat_for_duration_arithmetic)r   Ú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$  )ÚfeaturesÚhas_native_duration_fieldr  r   r&  Úcheck_expression_supportr%  r  rþ   rÖ   r  Úcombine_duration_expressionr2   r(  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»   r+  zInvalid arguments for operator Ú.)r   r2   r$   r7   rF   r  r   r   r  r1  r   r   )	r   r   r
   r   r   r   r  r  Úallowed_fieldsr   r   r   r   õ  s   óÿzDurationExpression.as_sqlite)r    r!   r"   r%  r   r   r3  r   r   r  r   r/  Ø  s    r/  c                       s,   e Zd Ze ¡ Z‡ fdd„Zdd„ Z‡  ZS )r0  c                    s   t ƒ  || j|¡ d S rq   )r  rt   rB   )r   r  r  r  r   r   rt     ó   zTemporalSubtraction.__init__c                 C   s<   |j  | ¡ | | j¡}| | j¡}|j  | jj ¡ ||¡S rq   )r&  r9  r%  r  r  Úsubtract_temporalsr   r   )r   r   r
   r  r  r   r   r   r     s   ÿzTemporalSubtraction.as_sql)	r    r!   r"   r   r+  r   rt   r   r3  r   r   r  r   r0    s    r0  zdjango.db.models.F)Úpathc                   @   sL   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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   rt     s   
z
F.__init__c                 C   ó   d  | jj| j¡S ©Nú{}({}))r  r¯   r    rÄ   r8   r   r   r   r  %  ó   z
F.__repr__NTFc                 C   s   |  | j|||¡S rq   )Úresolve_refrÄ   ©r   rŸ   rž   r    r¡   r¤   r   r   r   r-   (  s   zF.resolve_expressionc                 K   rÛ   rq   rÜ   rÞ   r   r   r   rà   -  r:   zF.ascc                 K   rá   râ   rÜ   rÞ   r   r   r   rä   0  rå   zF.descc                 C   s   | j |j ko| j|jkS rq   )r¯   rÄ   r?   r   r   r   r  3  ó   zF.__eq__c                 C   r  rq   )r  rÄ   r8   r   r   r   r  6  rÒ   z
F.__hash__rê   )r    r!   r"   r#   rt   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   ri   )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   D  rm   zResolvedOuterRef.as_sqlc                    s"   t ƒ j|i |¤Ž}t| jv |_|S rq   )r  r-   r   rÄ   Úpossibly_multivalued)r   r  rß   Úcolr  r   r   r-   J  s   z#ResolvedOuterRef.resolve_expressionc                 C   r±   rq   r   ©r   Úrelabelsr   r   r   rÆ   R  r�   z ResolvedOuterRef.relabeled_cloneNc                 C   r   rq   r   ©r   rÙ   r   r   r   r×   U  r�   z"ResolvedOuterRef.get_group_by_colsrq   )
r    r!   r"   r#   r“   r   r-   rÆ   r×   r3  r   r   r  r   rG  :  s    rG  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 rq   )r‡   rÄ   r¯   rG  rI  r   r   r   r-   \  s   
zOuterRef.resolve_expressionc                 C   r±   rq   r   rL  r   r   r   rÆ   a  r�   zOuterRef.relabeled_cloneN)r    r!   r"   r“   r-   rÆ   r   r   r   r   rO  Y  s    rO  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‡  ZS )ÚFunczAn SQL function call.Nz%(function)s(%(expressions)s)r#  rr   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÷   rr   )
ÚarityÚlenÚ	TypeErrorr¯   r    r  rt   r�   Úsource_expressionsÚextra)r   r   rŽ   rW  r  r   r   rt   n  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>r#  c                 s   s(   � | ]\}}t |ƒd  t |ƒ V  qdS )ú=NrY  )r‹   ÚkeyÚvalr   r   r   r–   �  s   € 
ÿú
{}({}, {})rB  )
Ú
arg_joinerÚjoinrV  rW  Ú_get_repr_optionsÚsortedrø   r  r¯   r    )r   r  rW  r   r   r   r  }  s   

ÿzFunc.__repr__c                 C   s   i S )zAReturn a dict of extra __init__() options to include in the repr.r   r8   r   r   r   ra  ‡  rµ   zFunc._get_repr_optionsc                 C   r§   rq   ©rV  r8   r   r   r   r€   ‹  ó   zFunc.get_source_expressionsc                 C   s
   || _ d S rq   rc  r‚   r   r   r   r„   Ž  rÒ   zFunc.set_source_expressionsTFc           	      C   s>   |   ¡ }||_t|jƒD ]\}}| |||||¡|j|< q|S rq   )rw   r¢   Ú	enumeraterV  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 ]3}	z	| |	¡\}
}W n ty5   t|	dtƒ}|tu r*‚ | t|ƒ¡\}
}Y nw | |
¡ | 	|¡ qi | j
¥|¥}|d urQ||d< n| d| j¡ |p`| d| j¡}|pi| d| j¡}| |¡ |d< |d< || |fS )Nrì   ÚfunctionÚtemplater_  rŽ   r¨   )r&  r9  rV  r%  r   rR   rë   r/   rþ   rÖ   rW  Ú
setdefaultrg  rÍ   rh  r_  r`  )r   r   r
   rg  rh  r_  r   Ú	sql_partsr   rŒ   Úarg_sqlÚ
arg_paramsrì   Údatar   r   r   r   œ  s0   	
ÿú

zFunc.as_sqlc                    s*   t ƒ  ¡ }| jd d … |_| j ¡ |_|S rq   )r  rw   rV  rW  )r   rw   r  r   r   rw   Á  s   
z	Func.copyrê   )NNN)r    r!   r"   r#   rg  rh  r_  rS  rt   r  ra  r€   r„   r-   r   rw   r3  r   r   r  r   rP  e  s$    

ÿ
ú%rP  zdjango.db.models.Valuec                       sd   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().
        rr   N)r  rt   r³   )r   r³   r   r  r   r   rt   Ð  s   	
zValue.__init__c                 C   s   | j j› d| j›d�S )Nú(ú))r¯   r    r³   r8   r   r   r   r  Ü  r=  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)	r&  r9  r³   r¬   r¤   Úget_db_prep_saveÚget_db_prep_valuer.   rp  )r   r   r
   r]  r   r   r   r   r   ß  s   

zValue.as_sqlTc                    s   t ƒ  |||||¡}||_|S rq   )r  r-   r¤   r£   r  r   r   r-   ñ  s   zValue.resolve_expressionc                 C   r   rq   r   rN  r   r   r   r×   ø  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.  Údater,  Útimer-  Ú	timedeltar+  r   r   ÚbytesÚBinaryFieldr   Ú	UUIDFieldr8   r   r   r   rª   û  s.   ÿzValue._resolve_output_fieldc                 C   r§   rq   )r³   r8   r   r   r   rì     r©   zValue.empty_result_set_valuerq   rê   )r    r!   r"   r#   r¤   rt   r  r   r-   r×   rª   rï   rì   r3  r   r   r  r   r/   È  s    ÿ
r/   c                       sH   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  rt   )r   r   r   r   r  r   r   rt     s   zRawSQL.__init__c                 C   ó   d  | jj| j| j¡S ©Nr^  )r  r¯   r    r   r   r8   r   r   r   r    r=  zRawSQL.__repr__c                 C   s   d| j  | jfS r$  )r   r   r�   r   r   r   r   "  r:   zRawSQL.as_sqlc                 C   ó   | gS rq   r   rN  r   r   r   r×   %  rd  zRawSQL.get_group_by_colsTFc           
         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   rD  rÄ   r  r-   )
r   rŸ   rž   r    r¡   r¤   ÚparentÚparent_fieldÚ_Úcolumn_namer  r   r   r-   (  s   
ÿü€
ÿzRawSQL.resolve_expressionrq   rê   )	r    r!   r"   rt   r  r   r×   r-   r3  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   r8   r   r   r   r  ;  r�   zStar.__repr__c                 C   s   dg fS )Nr'   r   r�   r   r   r   r   >  ó   zStar.as_sqlN)r    r!   r"   r  r   r   r   r   r   r‰  :  s    r‰  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  rt   rÙ   Útarget)r   rÙ   rŒ  r   r  r   r   rt   G  s   zCol.__init__c                 C   s>   | j | j}}|r|t|ƒfnt|ƒf}d | jjd |¡¡S )NrB  r#  )rÙ   rŒ  rˆ   r  r¯   r    r`  )r   rÙ   rŒ  Úidentifiersr   r   r   r  M  s   zCol.__repr__c                 C   s<   | j | jj}}|r||fn|f}d t|j|ƒ¡}|g fS )Nr;  )rÙ   rŒ  Úcolumnr`  ÚmapÚquote_name_unless_alias)r   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   rL  r   r   r   rÆ   X  s
   
ÿzCol.relabeled_clonec                 C   r€  rq   r   rN  r   r   r   r×   _  rd  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}   b  s   ÿ
þzCol.get_db_convertersrq   )r    r!   r"   rœ   rJ  rt   r  r   rÆ   r×   r}   r3  r   r   r  r   r‹  B  s    
r‹  c                       s^   e Zd ZdZ‡ fdd„Zdd„ Zdd„ Zdd	„ Z	ddd„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 rq   )r  rt   Úrefsr­   )r   r’  r­   r  r   r   rt   p  s   
zRef.__init__c                 C   r~  r  )r  r¯   r    r’  r­   r8   r   r   r   r  t  r=  zRef.__repr__c                 C   ó   | j gS rq   ©r­   r8   r   r   r   r€   w  rŠ  zRef.get_source_expressionsc                 C   s   |\| _ d S rq   r”  r‚   r   r   r   r„   z  r…   zRef.set_source_expressionsNTFc                 C   r±   rq   r   rE  r   r   r   r-   }  s   zRef.resolve_expressionc                 C   r±   rq   r   rL  r   r   r   rÆ   „  r�   zRef.relabeled_clonec                 C   s   |j  | j¡g fS rq   )r&  Ú
quote_namer’  r�   r   r   r   r   ‡  rC  z
Ref.as_sqlc                 C   r€  rq   r   rN  r   r   r   r×   Š  rd  zRef.get_group_by_colsrê   rq   )r    r!   r"   r#   rt   r  r€   r„   r-   rÆ   r   r×   r3  r   r   r  r   r‘  j  s    
ÿr‘  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.)rH  r¯   r    r  rt   ©r   rŽ   rW  r  r   r   rt   —  s
   
ÿzExpressionList.__init__c                 C   s   | j  dd„ | jD ƒ¡S )Nc                 s   rX  rq   rY  rŠ   r   r   r   r–   Ÿ  rZ  z)ExpressionList.__str__.<locals>.<genexpr>)r_  r`  rV  r8   r   r   r   r  ž  rF  zExpressionList.__str__c                 K   s   | j ||fi |¤ŽS rq   )r   )r   r   r
   r   r   r   r   r   ¡  s   zExpressionList.as_sqlite)	r    r!   r"   r#   rh  rt   r  r   r3  r   r   r  r   r–  Ž  s    r–  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   sB   � | ]}t |tƒr|d  dkrtt|dd… ƒdd�n|V  qdS )r   r&   rQ  NT©rã   )r‡   rˆ   rÝ   r‰   r”   r   r   r   r–   ª  s   € ýÿÿ
üz'OrderByList.__init__.<locals>.<genexpr>)r  rt   r—  r  r   r   rt   ©  s   úzOrderByList.__init__c                    s   | j sdS tƒ j|i |¤ŽS )N)Ú r   )rV  r  r   rI  r  r   r   r   ´  s   zOrderByList.as_sql)r    r!   r"   rh  rt   r   r3  r   r   r  r   r˜  ¦  s    r˜  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  rt   r´   )r   r´   r   r  r   r   rt   Á  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ž  r8   r   r   r   r€   È  rŠ  z(ExpressionWrapper.get_source_expressionsNc                    s4   t | jtƒr| j ¡ }| j|_|j|d�S tƒ  ¡ S )N)rÙ   )r‡   r´   rñ   rw   r   r×   r  )r   rÙ   r´   r  r   r   r×   Ë  s
   

z#ExpressionWrapper.get_group_by_colsc                 C   s   |  | j¡S rq   )r%  r´   r�   r   r   r   r   Ô  r…   zExpressionWrapper.as_sqlc                 C   r@  rA  )r  r¯   r    r´   r8   r   r   r   r  ×  rC  zExpressionWrapper.__repr__rq   )r    r!   r"   r#   rt   r„   r€   r×   r   r  r3  r   r   r  r   r›  º  s    	r›  zdjango.db.models.Whenc                       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
	ddd„Zddd„Zd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 )NrO   FzLWhen() supports a Q object, a boolean expression, or lookups as a condition.z1An empty Q() can't be used as a When() condition.rr   r   r   )
r   rR   rU  r‡   rH  r  rt   Ú	conditionr�   r  )r   r¡  ÚthenÚlookupsr  r   r   rt   á  s   ÿzWhen.__init__c                 C   s   d| j | jf S )NzWHEN %r THEN %r©r¡  r  r8   r   r   r   r  ò  r:   zWhen.__str__c                 C   ó   d| j j| f S ©Nz<%s: %s>©r¯   r    r8   r   r   r   r  õ  r:   zWhen.__repr__c                 C   r   rq   r¤  r8   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¬   r8   r   r   r   r®   þ  s   
zWhen.get_source_fieldsTc                 C   sJ   |   ¡ }||_t|jdƒr|j ||||d¡|_|j |||||¡|_|S )Nr-   F)rw   r¢   r.   r¡  r-   r  r£   r   r   r   r-     s   
ÿ
ÿzWhen.resolve_expressionc                 K   sn   |j  | ¡ |}g }| | j¡\}}||d< | |¡ | | j¡\}	}
|	|d< | |
¡ |p0| j}|| |fS )Nr¡  r  )r&  r9  r%  r¡  rÖ   r  rh  )r   r   r
   rh  r   Útemplate_paramsÚ
sql_paramsÚcondition_sqlÚcondition_paramsÚ
result_sqlÚresult_paramsr   r   r   r     s   


zWhen.as_sqlc                 C   ó$   g }|   ¡ D ]	}| | ¡ ¡ q|S rq   ©r€   rÖ   r×   rØ   r   r   r   r×     s   zWhen.get_group_by_cols©NNrê   rq   )r    r!   r"   rh  rO   rt   r  r  r€   r„   r®   r-   r   r×   r3  r   r   r  r   r   Û  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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 rq   )r‡   r   )r‹   Úcaser   r   r   r–   7  s   € z Case.__init__.<locals>.<genexpr>z.Positional arguments must all be When objects.r   )	ÚallrU  r  rt   ÚlistÚcasesr�   r³  rW  )r   r³  r   r·  rW  r  r   r   rt   6  s   

zCase.__init__c                 C   s    dd  dd„ | jD ƒ¡| jf S )NzCASE %s, ELSE %rr#  c                 s   rX  rq   rY  )r‹   r¥   r   r   r   r–   @  rZ  zCase.__str__.<locals>.<genexpr>)r`  r·  r³  r8   r   r   r   r  >  s   þzCase.__str__c                 C   r¥  r¦  r§  r8   r   r   r   r  D  r:   zCase.__repr__c                 C   s   | j | jg S rq   ©r·  r³  r8   r   r   r   r€   G  rŸ  zCase.get_source_expressionsc                 C   s   |�^ | _ | _d S rq   r¸  r‚   r   r   r   r„   J  rC  zCase.set_source_expressionsTFc           	      C   sT   |   ¡ }||_t|jƒD ]\}}| |||||¡|j|< q|j |||||¡|_|S rq   )rw   r¢   re  r·  r-   r³  )	r   rŸ   rž   r    r¡   r¤   r¥   rf  r´  r   r   r   r-   M  s   
ÿ
ÿzCase.resolve_expressionc                    s   t ƒ  ¡ }|jd d … |_|S rq   )r  rw   r·  )r   r¥   r  r   r   rw   [  s   
z	Case.copyc              	   K   sþ   |j  | ¡ | js| | j¡S i | j¥|¥}g }g }| jD ]}	z	| |	¡\}
}W n	 ty1   Y qw | |
¡ | |¡ q| | j¡\}}|sK||fS |pO| j	}| 
|¡|d< ||d< | |¡ |ph| d| j¡}|| }| jd ur{|j  | j¡| }||fS )Nr·  r³  rh  )r&  r9  r·  r%  r³  rW  r   rþ   rÖ   Úcase_joinerr`  rÍ   rh  r¬   Úunification_cast_sqlr   )r   r   r
   rh  r¹  r   r¨  Ú
case_partsr©  r´  Úcase_sqlÚcase_paramsÚdefault_sqlÚdefault_paramsr   r   r   r   r   `  s4   
ÿ



zCase.as_sqlc                    s   | j s	| j |¡S tƒ  |¡S rq   )r·  r³  r×   r  rN  r  r   r   r×   }  s   zCase.get_group_by_colsrê   r°  rq   )r    r!   r"   r#   rh  r¹  rt   r  r  r€   r„   r-   rw   r   r×   r3  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)rR   rÌ   rŸ   ÚsubqueryrW  r  rt   )r   Úquerysetr   rW  r  r   r   rt   �  s   zSubquery.__init__c                 C   r“  rq   ©rŸ   r8   r   r   r   r€   ”  rŠ  zSubquery.get_source_expressionsc                 C   rœ  r�  rÃ  r‚   r   r   r   r„   —  rŸ  zSubquery.set_source_expressionsc                 C   ó   | j jS rq   )rŸ   r   r8   r   r   r   rª   š  rŠ  zSubquery._resolve_output_fieldc                    s   t ƒ  ¡ }|j ¡ |_|S rq   )r  rw   rŸ   rÌ   ©r   rÌ   r  r   r   rw   �  r{   zSubquery.copyc                 C   rÄ  rq   )rŸ   Úexternal_aliasesr8   r   r   r   rÆ  ¢  s   zSubquery.external_aliasesc                 C   s
   | j  ¡ S rq   )rŸ   Úget_external_colsr8   r   r   r   rÇ  ¦  rÒ   zSubquery.get_external_colsc           
      K   sf   |j  | ¡ i | j¥|¥}|p| j}| ||¡\}}|dd… |d< |p*| d| j¡}|| }	|	|fS )NrQ  r5   rÁ  rh  )r&  r9  rW  rŸ   r   rÍ   rh  )
r   r   r
   rh  rŸ   r   r¨  Úsubquery_sqlr©  r   r   r   r   r   ©  s   
zSubquery.as_sqlc                 C   s   |rt || ƒgS | j ¡ S rq   )r‘  rŸ   r×   rN  r   r   r   r×   ´  s   
zSubquery.get_group_by_colsrq   r°  )r    r!   r"   r#   rh  r“   rì   rt   r€   r„   rª   rw   rï   rÆ  rÇ  r   r×   r3  r   r   r  r   rÀ  ƒ  s    

rÀ  c                       sH   e Zd ZdZe ¡ Zd‡ fdd„	Z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 rq   )Únegatedr  rt   )r   rÂ  rÊ  rß   r  r   r   rt   Â  s   zExists.__init__c                 C   s   |   ¡ }| j |_|S rq   )rw   rÊ  rÅ  r   r   r   Ú
__invert__Æ  s   
zExists.__invert__Nc           	         sŠ   | j j|jd�}ztƒ j||f||dœ|¤Ž\}}W n ty8   | jr7|jj}|j	s.Y dS | 
tdƒ¡ Y S ‚ w | jrAd |¡}||fS )N)Úusing)rh  rŸ   )z1=1r   TzNOT {})rŸ   ÚexistsrÙ   r  r   r   rÊ  r
   r7  Ú&supports_boolean_expr_in_select_clauser%  r/   r  )	r   r   r
   rh  r   rŸ   r   r   r7  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
   r7  rÎ  r  ré   r   r   r   rè   à  s   

zExists.select_format)Frq   )r    r!   r"   rh  r   r¦   r   rt   rË  r   rè   r3  r   r   r  r   rÉ  ¾  s    rÉ  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 rtjdtdd� || _|| _|| _t|dƒs*t 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)	rH  ÚwarningsÚwarnr   Únulls_firstÚ
nulls_lastrã   r.   r´   )r   r´   rã   rÓ  rÔ  r   r   r   rt   î  s   ü

zOrderBy.__init__c                 C   r~  )Nz{}({}, descending={}))r  r¯   r    r´   rã   r8   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ž  r8   r   r   r   r€     rŠ  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)rh  r7  Ú supports_order_by_nulls_modifierrÔ  rÓ  rã   Úorder_by_nulls_firstr&  r9  r%  r´   ÚcountÚrstrip)r   r   r
   rh  r   Úexpression_sqlr   Úplaceholdersr   r   r   r     s8   

€ÿÿ
ÿÿþýzOrderBy.as_sqlc                 C   sF   |j  | j¡r|  ¡ }tt| jdd�dd�|_| ||¡S |  ||¡S )NT)r¢  F)r³  )r&  Ú0conditional_expression_supported_in_where_clauser´   rw   r±  r   r   )r   r   r
   rw   r   r   r   Ú	as_oracle(  s   ÿþzOrderBy.as_oraclec                 C   r®  rq   r¯  rØ   r   r   r   r×   6  s   zOrderBy.get_group_by_colsc                 C   s6   | j  | _ | jrd| _d | _| S | jrd| _d | _| S rb   )rã   rÓ  rÔ  r8   r   r   r   ræ   <  s   
ýzOrderBy.reverse_orderingc                 C   ó
   d| _ d S r<   r™  r8   r   r   r   rà   F  rÒ   zOrderBy.ascc                 C   rà  rb   r™  r8   r   r   r   rä   I  rÒ   zOrderBy.desc)FNNrq   )r    r!   r"   rh  rO   rt   r  r„   r€   r   rß  r×   ræ   rà   rä   r   r   r   r   rÝ   é  s    



rÝ   c                       s~   e Zd ZdZdZd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ƒ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.rr   r   )Úpartition_byÚorder_byÚframerR   rH  r¯   r    r‡   rÿ   r¶  r–  r˜  rp   rˆ   r  rt   r�   Úsource_expression)r   r´   râ  rã  rä  r   r  r   r   rt   V  s.   ÿÿ


ÿzWindow.__init__c                 C   rÄ  rq   )rå  r   r8   r   r   r   rª   z  rŠ  zWindow._resolve_output_fieldc                 C   s   | j | j| j| jgS rq   ©rå  râ  rã  rä  r8   r   r   r   r€   }  rå   zWindow.get_source_expressionsc                 C   s   |\| _ | _| _| _d S rq   ræ  r‚   r   r   r   r„   €  rF  zWindow.set_source_expressionsc                 C   sò   |j  | ¡ |jjstdƒ‚| | j¡\}}g g }}| jd ur5| jj||dd�\}}	| 	|¡ | 
|	¡ | jd urL| | j¡\}
}| 	|
¡ | 
|¡ | jra| | j¡\}}| 	|¡ | 
|¡ | 
|¡ |pj| j}||d |¡ ¡ dœ |fS )Nz1This backend does not support window expressions.zPARTITION BY %(expressions)s)r   r
   rh  r²  )r´   Úwindow)r&  r9  r7  Úsupports_over_clauser	   r%  rå  râ  r   rþ   rÖ   rã  rä  rh  r`  Ústrip)r   r   r
   rh  Úexpr_sqlr   Ú
window_sqlÚwindow_paramsÚsql_exprr©  Ú	order_sqlÚorder_paramsÚ	frame_sqlÚframe_paramsr   r   r   r   ƒ  s4   


ý








þzWindow.as_sqlc                    sT   t | jtjƒr$|  ¡ }| ¡ }t ¡ |d _| |¡ tt	|ƒ 
||¡S |  ||¡S r�  )r‡   r   r   r   rw   r€   r¶   r„   r  rá  r   r   )r   r   r
   rw   rV  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ä  r8   r   r   r   r  ¯  s   üzWindow.__str__c                 C   r¥  r¦  r§  r8   r   r   r   r  ·  r:   zWindow.__repr__c                 C   r   rq   r   rN  r   r   r   r×   º  r�   zWindow.get_group_by_cols)NNNNrq   )r    r!   r"   rh  r“   r›   rí   rt   rª   r€   r„   r   r   r  r  r×   r3  r   r   r  r   rá  M  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 rq   )r/   ÚstartÚend©r   ró  rô  r   r   r   rt   É  s   
zWindowFrame.__init__c                 C   r"  rq   ©ró  rô  r‚   r   r   r   r„   Í  r:   z"WindowFrame.set_source_expressionsc                 C   r   rq   rö  r8   r   r   r   r€   Ð  r…   z"WindowFrame.get_source_expressionsc                 C   s>   |j  | ¡ |  || jj| jj¡\}}| j| j||dœ g fS )N©Ú
frame_typeró  rô  )r&  r9  Úwindow_frame_start_endró  r³   rô  rh  rø  )r   r   r
   ró  rô  r   r   r   r   Ó  s   ÿýÿùzWindowFrame.as_sqlc                 C   r¥  r¦  r§  r8   r   r   r   r  â  r:   zWindowFrame.__repr__c                 C   r   rq   r   rN  r   r   r   r×   å  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
   r&  Ú	PRECEDINGÚCURRENT_ROWÚUNBOUNDED_PRECEDINGrô  Ú	FOLLOWINGÚUNBOUNDED_FOLLOWINGrh  rø  rõ  r   r   r   r  è  s   

ýzWindowFrame.__str__c                 C   ri   )Nz3Subclasses must implement window_frame_start_end().rk   ©r   r
   ró  rô  r   r   r   rù  ü  rŠ  z"WindowFrame.window_frame_start_endr°  rq   )r    r!   r"   r#   rh  rt   r„   r€   r   r  r×   r  rù  r   r   r   r   rò  ¾  s    

rò  c                   @   r   )ÚRowRangeÚROWSc                 C   ó   |j  ||¡S rq   )r&  Ú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  c                   @   r   )Ú
ValueRangeÚRANGEc                 C   r  rq   )r&  Úwindow_frame_range_start_endr   r   r   r   rù  
  rŸ  z!ValueRange.window_frame_start_endNr  r   r   r   r   r    r  r  )Zrw   rv  Ú	functoolsrò   rÑ  Úcollectionsr   Údecimalr   Úuuidr   Údjango.core.exceptionsr   r   Ú	django.dbr   r	   r
   Údjango.db.modelsr   Údjango.db.models.constantsr   Údjango.db.models.query_utilsr   Údjango.utils.deconstructr   Údjango.utils.deprecationr   Údjango.utils.functionalr   Údjango.utils.hashabler   r   r$   rp   rñ   rý   r	  r>   rB   r7   rF   rI   rL   rV   r`   rX   rZ   r]   r,  r+  r.  r-  Ú_connector_combinationsr¶  r  r  Údrø   r2   Úfield_typesr  r  r  Ú	lru_cacher  r0   r/  r0  r‰   rG  rO  rP  r/   r}  r‰  r‹  r‘  r–  r˜  r›  r   r±  rÀ  rÉ  rÝ   rá  rò  r  r  r   r   r   r   Ú<module>   sö       +%øúüùûüúûöÿôÿ²`ÿÿ

	b3bO"($ I];+cqB