o
    þÞhç$ ã                   @   sT  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 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!m"Z" d dl#m$Z$ G dd„ dƒZ%G dd„ dƒZ&G dd„ deƒ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&j0e&j1e&j2e&j3e&j4fD ƒdd„ e&j*e&j/e&j+e&j,e&j-e&j.fD ƒe&j*ej5ej6ej7fej7ej6ej7fej6ej5ej7fej6ej7ej7fej6ej6ej6fej8ej6ej8fej6ej8ej8fgie&j/ej5ej6ej7fej7ej6ej7fej5ej5ej6fej5ej7ej6fej7ej5ej6fej7ej7ej6fej6ej6ej6fej8ej6ej8fej8ej8ej6fg	igZ9ee:ƒZ;d d!„ Z<e9D ]Z=e= >¡ D ]\Z?Z@e@D ]\ZAZBZCe<eAe?eBeCƒ �qz�qt�qnejDd"d#�d$d%„ ƒZEG d&d'„ d'e%e)ƒZFG d(d)„ d)eFƒZGG d*d+„ d+eFƒZHed,d-�G d.d/„ d/e&ƒƒZIG d0d1„ d1eIƒZJG d2d3„ d3eIƒZKG d4d5„ d5eIƒZLed6d-�G d7d8„ d8e%e)ƒƒZMed9d-�G d:d;„ d;e%e)ƒƒZNG d<d=„ d=e)ƒZOG d>d?„ d?e)ƒZPG d@dA„ dAe)ƒZQG dBdC„ dCe)ƒZRG dDdE„ dEe)ƒZSG dFdG„ dGe)ƒZTG dHdI„ dIeMƒZUG dJdK„ dKeUƒZVedLd-�G dMdN„ dNe%e)ƒƒZWG dOdP„ dPeWƒZXedQd-�G dRdS„ dSe)ƒƒZYedTd-�G dUdV„ dVe%e)ƒƒZZG dWdX„ dXe(e&ƒZ[G dYdZ„ dZe[ƒZ\ed[d-�G d\d]„ d]e)ƒƒZ]G d^d_„ d_e%e)ƒZ^G d`da„ dae	ƒZ_G dbdc„ dce)ƒZ`G ddde„ dee`ƒZaG dfdg„ dge`ƒZbdS )hé    N)Údefaultdict©ÚDecimal)ÚEnum)Úchain©ÚNoneType)ÚUUID)ÚEmptyResultSetÚ
FieldErrorÚFullResultSet)ÚDatabaseErrorÚNotSupportedErrorÚ
connection)Úfields)Ú
LOOKUP_SEP)ÚQ)Údeconstructible)Úcached_propertyÚclassproperty)Ú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"   ú\/var/www/html/premium_crap/venv/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©r9   ÚMUL©r   r"   r"   r#   Ú__neg__L   ó   zCombinable.__neg__c                 C   ó   |   || jd¡S ©NF©r9   ÚADD©r   r6   r"   r"   r#   Ú__add__O   r?   zCombinable.__add__c                 C   r@   rA   ©r9   ÚSUBrD   r"   r"   r#   Ú__sub__R   r?   zCombinable.__sub__c                 C   r@   rA   r;   rD   r"   r"   r#   Ú__mul__U   r?   zCombinable.__mul__c                 C   r@   rA   ©r9   ÚDIVrD   r"   r"   r#   Ú__truediv__X   r?   zCombinable.__truediv__c                 C   r@   rA   ©r9   ÚMODrD   r"   r"   r#   Ú__mod__[   r?   zCombinable.__mod__c                 C   r@   rA   ©r9   ÚPOWrD   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   ÚNotImplementedErrorrD   r"   r"   r#   Ú__and__a   ó
   ÿzCombinable.__and__c                 C   r@   rA   )r9   ÚBITANDrD   r"   r"   r#   Úbitandh   r?   zCombinable.bitandc                 C   r@   rA   )r9   ÚBITLEFTSHIFTrD   r"   r"   r#   Úbitleftshiftk   r?   zCombinable.bitleftshiftc                 C   r@   rA   )r9   ÚBITRIGHTSHIFTrD   r"   r"   r#   Úbitrightshiftn   r?   zCombinable.bitrightshiftc                 C   s0   t | ddƒrt |ddƒrt| ƒt|ƒA S tdƒ‚rS   rV   rD   r"   r"   r#   Ú__xor__q   rZ   zCombinable.__xor__c                 C   r@   rA   )r9   ÚBITXORrD   r"   r"   r#   Úbitxorx   r?   zCombinable.bitxorc                 C   s0   t | ddƒrt |ddƒrt| ƒt|ƒB S tdƒ‚rS   rV   rD   r"   r"   r#   Ú__or__{   rZ   zCombinable.__or__c                 C   r@   rA   )r9   ÚBITORrD   r"   r"   r#   Úbitor‚   r?   zCombinable.bitorc                 C   r@   ©NTrB   rD   r"   r"   r#   Ú__radd__…   r?   zCombinable.__radd__c                 C   r@   rg   rF   rD   r"   r"   r#   Ú__rsub__ˆ   r?   zCombinable.__rsub__c                 C   r@   rg   r;   rD   r"   r"   r#   Ú__rmul__‹   r?   zCombinable.__rmul__c                 C   r@   rg   rJ   rD   r"   r"   r#   Ú__rtruediv__Ž   r?   zCombinable.__rtruediv__c                 C   r@   rg   rM   rD   r"   r"   r#   Ú__rmod__‘   r?   zCombinable.__rmod__c                 C   r@   rg   rP   rD   r"   r"   r#   Ú__rpow__”   r?   zCombinable.__rpow__c                 C   ó   t dƒ‚©NrU   ©rX   rD   r"   r"   r#   Ú__rand__—   ó   ÿzCombinable.__rand__c                 C   rn   ro   rp   rD   r"   r"   r#   Ú__ror__œ   rr   zCombinable.__ror__c                 C   rn   ro   rp   rD   r"   r"   r#   Ú__rxor__¡   rr   zCombinable.__rxor__c                 C   s   t | ƒS ©N)ÚNegatedExpressionr=   r"   r"   r#   Ú
__invert__¦   ó   zCombinable.__invert__N))r%   r&   r'   r(   rC   rG   r<   rK   rQ   rN   r[   re   r]   r_   rb   r9   r>   rE   rH   rI   rL   rO   rR   rY   r\   r^   r`   ra   rc   rd   rf   rh   ri   rj   rk   rl   rm   rq   rs   rt   rw   r"   r"   r"   r#   r)   &   sN    r)   c                   @   s   e Zd ZdS )ÚOutputFieldIsNoneErrorN)r%   r&   r'   r"   r"   r"   r#   ry   ª   s    ry   c                   @   sn  e Zd ZdZeZdZdZdZdZ	dZ
dZdZdId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	dJd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„ Z0dGdH„ Z1dS )KÚBaseExpressionz%Base class for all query expressions.FTNc                 C   s   |d ur	|| _ d S d S ru   ©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 ru   )r~   Ú_convert_value_noopr   Úget_db_converters©r   r   r"   r"   r#   r†   Ê   s
   ÿ
üz BaseExpression.get_db_convertersc                 C   ó   g S ru   r"   r=   r"   r"   r#   Úget_source_expressionsÑ   ó   z%BaseExpression.get_source_expressionsc                 C   s   |rJ ‚d S ru   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 ©r2   )r3   Ú
isinstanceÚstrÚFr4   ©Ú.0Úargr"   r"   r#   Ú
<listcomp>Ø   s    ýÿüz5BaseExpression._parse_expressions.<locals>.<listcomp>r"   )r   Úexpressionsr"   r"   r#   Ú_parse_expressions×   s   úz!BaseExpression._parse_expressionsc                 C   rn   )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()rp   ©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 ru   )Úcontains_aggregate©r”   Úexprr"   r"   r#   Ú	<genexpr>ÿ   ó   € 

ÿz4BaseExpression.contains_aggregate.<locals>.<genexpr>©Úanyr‰   r=   r"   r"   r#   rœ   ý   ó   ÿz!BaseExpression.contains_aggregatec                 C   rš   )Nc                 s   r›   ru   )Úcontains_over_clauser�   r"   r"   r#   rŸ     r    z6BaseExpression.contains_over_clause.<locals>.<genexpr>r¡   r=   r"   r"   r#   r¤     r£   z#BaseExpression.contains_over_clausec                 C   rš   )Nc                 s   r›   ru   )Úcontains_column_referencesr�   r"   r"   r#   rŸ     s
   € ÿ
ÿz<BaseExpression.contains_column_references.<locals>.<genexpr>r¡   r=   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)rW   Úcontains_subqueryr�   r"   r"   r#   rŸ     s
   € ÿ
ÿz3BaseExpression.contains_subquery.<locals>.<genexpr>r¡   r=   r"   r"   r#   r¨     r¦   z BaseExpression.contains_subqueryc                    sd   |   ¡ }ˆ|_‡ ‡‡‡‡fdd„| ¡ D ƒ}| js+tdd„ |D ƒƒr+t| jj› 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 | ]}|d ur|  ˆˆ ˆˆˆ¡nd ‘qS ru   r�   r�   ©Úallow_joinsÚfor_saveÚqueryÚreuseÚ	summarizer"   r#   r–   *  s    ýÿüz5BaseExpression.resolve_expression.<locals>.<listcomp>c                 s   ó   � | ]}t |tƒV  qd S ru   )r�   ÚColPairsr�   r"   r"   r#   rŸ   2  r    z4BaseExpression.resolve_expression.<locals>.<genexpr>z4 expression does not support composite primary keys.)	r€   Ú
is_summaryr‰   Úallows_composite_expressionsr¢   Ú
ValueErrorÚ	__class__r%   r�   )r   r¬   rª   r­   r®   r«   ÚcÚsource_expressionsr"   r©   r#   r2     s   úÿÿ
z!BaseExpression.resolve_expressionc                 C   s   t | jtjƒS ru   )r�   r   r   ÚBooleanFieldr=   r"   r"   r#   rT   <  s   zBaseExpression.conditionalc                 C   ó   | j S ru   r{   r=   r"   r"   r#   Úfield@  ó   zBaseExpression.fieldc                 C   s   |   ¡ }|du rtdƒ‚|S )z+Return the output type of this expressions.Nz4Cannot resolve expression type, unknown output_field)Ú_resolve_output_fieldry   r|   r"   r"   r#   r   D  s   ÿzBaseExpression.output_fieldc                 C   s   z| j W S  ty   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   ry   r=   r"   r"   r#   Ú_output_field_or_noneN  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 ru   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�   r´   r   r%   )r   Úsources_iterr   r½   r"   r"   r#   r»   Y  s    ÿþþÿÿ	õz$BaseExpression._resolve_output_fieldc                 C   ó   | S ru   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 ru   )ÚfloatrÁ   r"   r"   r#   Ú<lambda>…  ó   z.BaseExpression.convert_value.<locals>.<lambda>ÚIntegerFieldc                 S   rÆ   ru   )ÚintrÁ   r"   r"   r#   rÈ   ‰  rÉ   r   c                 S   rÆ   ru   r   rÁ   r"   r"   r#   rÈ   �  rÉ   )r   r   Úendswithr…   )r   r¹   Úinternal_typer"   r"   r#   r~   {  s   
zBaseExpression.convert_valuec                 C   ó   | j  |¡S ru   )r   Ú
get_lookup)r   Úlookupr"   r"   r#   rÏ   ’  rŽ   zBaseExpression.get_lookupc                 C   rÎ   ru   )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 ru   )Ú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                    sN   ˆ s| S ˆ   | ¡ }r|S |  ¡  }s| S |  ¡ }| ‡ fdd„|D ƒ¡ |S )Nc                    s   g | ]}|r|  ˆ ¡nd ‘qS ru   )Úreplace_expressionsr�   ©Úreplacementsr"   r#   r–   «  s    ÿÿz6BaseExpression.replace_expressions.<locals>.<listcomp>)Úgetr‰   r€   r�   )r   rÞ   Úreplacementr¶   rÛ   r"   rÝ   r#   rÜ   ¢  s   
þÿz"BaseExpression.replace_expressionsc                 C   s.   t ƒ }|  ¡ D ]}|d u rq|| ¡ O }q|S ru   )Úsetr‰   Úget_refs)r   Úrefsrž   r"   r"   r#   râ   ²  s   zBaseExpression.get_refsc                 C   ó
   t   | ¡S ru   ©r€   r=   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 ru   )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   ó   g | ]}|j ‘qS r"   )r¼   rÖ   r"   r"   r#   r–   Õ  ó    z4BaseExpression.get_source_fields.<locals>.<listcomp>)r‰   r=   r"   r"   r#   r¾   Ó  s   z BaseExpression.get_source_fieldsc                 K   ó   t | fi |¤ŽS ru   ©Ú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À   ru   r"   r=   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‰   r3   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)r3   r   rü   ©r   r   r    r!   r"   r"   r#   rü   í  s   zBaseExpression.select_formatc              
   C   sD   t | ddƒs z|  ¡ \}W |S  ty } ztdƒ|‚d }~ww | S )NÚ constraint_validation_compatibleTzdExpressions with constraint_validation_compatible set to False must have only one source expression.)rW   r‰   r³   )r   rÃ   r×   r"   r"   r#   Úget_expression_for_validationö  s   úÿý€ÿz,BaseExpression.get_expression_for_validationru   ©NTNFF)2r%   r&   r'   r(   ÚNotImplementedÚempty_result_set_valuer±   Ú
filterableÚwindow_compatibleÚallowed_defaultrþ   Úset_returningr²   r}   rƒ   r†   r‰   r�   r˜   r   r   rœ   r¤   r¥   r¨   r2   ÚpropertyrT   r¹   r   r¼   r»   Ústaticmethodr…   r~   rÏ   rÑ   rÕ   rÜ   râ   r€   rç   rë   r¾   rõ   rù   rú   rû   rü   rÿ   r"   r"   r"   r#   rz   ®   sn    






ÿ%


	




	rz   c                   @   sP   e Zd ZdZeejdd�dd„ ƒƒZedd„ ƒZ	e
dd	„ ƒZd
d„ Zdd„ ZdS )Ú
Expressionz:An expression that can be combined with other expressions.é€   ©Úmaxsizec                 C   s   t  | j¡S ru   )ÚinspectÚ	signaturer}   ©Úclsr"   r"   r#   Ú_constructor_signature	  s   z!Expression._constructor_signaturec                    sv   t |tƒrttˆ j|ƒƒS t |tƒrt‡ fdd„| ¡ D ƒƒS t |tjƒr7|jr3|j	r3|j	j
j|jfS t|ƒS t|ƒS )Nc                 3   s"   � | ]\}}|ˆ   |¡fV  qd S ru   )Ú	_identity©r”   ÚkeyÚvalr  r"   r#   rŸ     s   €  z'Expression._identity.<locals>.<genexpr>)r�   ÚtupleÚmapr  ÚdictÚitemsr   ÚFieldrÓ   ÚmodelÚ_metaÚlabelÚtyper   )r  rÂ   r"   r  r#   r    s   

zExpression._identityc                 C   sx   | j \}}| jj| g|¢R i |¤Ž}| ¡  t|j ¡ ƒ}t|ƒ | jg}|D ]\}}|  	|¡}| 
||f¡ q't|ƒS ru   )Ú_constructor_argsr  Úbind_partialÚapply_defaultsÚiterÚ	argumentsr  Únextr´   r  Úappendr  )r   Úargsrô   r  r#  Úidentityr•   rÂ   r"   r"   r#   r'    s   

zExpression.identityc                 C   s   t |tƒstS |j| jkS ru   )r�   r	  r  r'  rD   r"   r"   r#   Ú__eq__*  s   
zExpression.__eq__c                 C   ó
   t | jƒS ru   )Úhashr'  r=   r"   r"   r#   Ú__hash__/  ræ   zExpression.__hash__N)r%   r&   r'   r(   r   Ú	functoolsÚ	lru_cacher  Úclassmethodr  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”   r7   r"   r"   r#   Ú
<dictcomp>>  s    ùýÿÿr2  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   r1  r"   r"   r#   r2  O  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Å   r1  r"   r"   r#   r2  a  s    úüÿc                 C   r/  r"   )r   rÊ   r1  r"   r"   r#   r2  q  s    ýÿÿc              
   C   s2   i | ]}|t t d d„ tjtjtjfD ƒ¡ƒ“qS )c                 s   s$   � | ]}|t |ft ||fgV  qd S ru   r   )r”   Ú
field_typer"   r"   r#   rŸ   €  s
   € ÿ
ÿz<dictcomp>.<genexpr>)Úlistr   Úfrom_iterabler   rÊ   r   rÅ   r1  r"   r"   r#   r2  ~  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%  )Úlhsr7   ÚrhsÚresultr"   r"   r#   Úregister_combinable_fields¶  s   	r:  r
  r  c                 C   s<   t  | d¡}|D ]\}}}t||ƒrt||ƒr|  S qd S )Nr"   )r6  rß   Ú
issubclass)r7   Úlhs_typeÚrhs_typeÚcombinatorsÚcombinator_lhs_typeÚcombinator_rhs_typeÚcombined_typer"   r"   r#   Ú_resolve_combined_typeÈ  s   ÿ€ürB  c                       sj   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‡ fdd„	Z
edd„ ƒZ‡  ZS )r5   Nc                    s$   t ƒ j|d� || _|| _|| _d S ©Nr{   )Úsuperr}   r7   r7  r8  )r   r7  r7   r8  r   ©r´   r"   r#   r}   Ó  ó   
zCombinedExpression.__init__c                 C   s   d  | jj| ¡S )Nz<{}: {}>)Úformatr´   r%   r=   r"   r"   r#   Ú__repr__Ù  r?   zCombinedExpression.__repr__c                 C   s   d  | j| j| j¡S )Nz{} {} {})rG  r7  r7   r8  r=   r"   r"   r#   Ú__str__Ü  rÉ   zCombinedExpression.__str__c                 C   ó   | j | jgS ru   ©r7  r8  r=   r"   r"   r#   r‰   ß  rŽ   z)CombinedExpression.get_source_expressionsc                 C   ó   |\| _ | _d S ru   rK  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.)
rB  r7   r  r7  r¼   r8  r   r   r´   r%   )r   rA  r"   r"   r#   r»   å  s   

ý

ÿ
þÿz(CombinedExpression._resolve_output_fieldc                 C   sp   g }g }|  | j¡\}}| |¡ | |¡ |  | j¡\}}| |¡ | |¡ d}|j | j|¡}|| |fS ©Nz(%s))Úcompiler7  r%  rê   r8  ÚopsÚcombine_expressionr7   ©r   r   r   r—   Úexpression_paramsr    r!   Úexpression_wrapperr"   r"   r#   r   ö  s   



zCombinedExpression.as_sqlTFc           
   	      sÖ   t ƒ  |||||¡}t| ttfƒsiz|jj ¡ }W n tt	fy&   d }Y nw z|j
j ¡ }W n tt	fy<   d }Y nw d||hv rP||krPt|j|j|j
ƒS h d£}	| j| jkri||	v ri||krit|j|j
ƒS |S )NÚDurationField>   Ú	DateFieldÚ	TimeFieldÚDateTimeField)rD  r2   r�   ÚDurationExpressionÚTemporalSubtractionr7  r   r   ÚAttributeErrorr   r8  r7   rG   )
r   r¬   rª   r­   r®   r«   Úresolvedr<  r=  Údatetime_fieldsrE  r"   r#   r2     s8   ûÿÿÿz%CombinedExpression.resolve_expressionc                 C   ó   | j jo| jjS ru   )r7  r  r8  r=   r"   r"   r#   r  $  ó   z"CombinedExpression.allowed_defaultru   r   )r%   r&   r'   r}   rH  rI  r‰   r�   r»   r   r2   r   r  Ú__classcell__r"   r"   rE  r#   r5   Ò  s    ÿ r5   c                       s,   e Zd Zdd„ Z‡ fdd„Zdd„ Z‡  ZS )rY  c                 C   sR   z|j }W n	 ty   Y nw | ¡ dkr$| |¡\}}|j |¡|fS | |¡S )NrU  )r   r   r   rO  rP  Úformat_for_duration_arithmetic)r   Úsider   r   Úoutputr    r!   r"   r"   r#   rO  *  s   
ÿ
zDurationExpression.compilec                    sš   |j jrtƒ  ||¡S |j | ¡ g }g }|  | j||¡\}}| |¡ | 	|¡ |  | j
||¡\}}| |¡ | 	|¡ d}|j | j|¡}|| |fS rN  )ÚfeaturesÚhas_native_duration_fieldrD  r   rP  Úcheck_expression_supportrO  r7  r%  rê   r8  Úcombine_duration_expressionr7   rR  rE  r"   r#   r   5  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Ê   rU  zInvalid arguments for operator Ú.)r   r7   r)   r<   rK   r7  r   r   r8  r[  r   r   )	r   r   r   r   r    r!   r<  r=  Úallowed_fieldsr"   r"   r#   r$   F  s   óÿzDurationExpression.as_sqlite)r%   r&   r'   rO  r   r$   r`  r"   r"   rE  r#   rY  )  s    rY  c                       s,   e Zd Ze ¡ Z‡ fdd„Zdd„ Z‡  ZS )rZ  c                    s   t ƒ  || j|¡ d S ru   )rD  r}   rG   )r   r7  r8  rE  r"   r#   r}   _  ó   zTemporalSubtraction.__init__c                 C   s<   |j  | ¡ | | j¡}| | j¡}|j  | jj ¡ ||¡S ru   )rP  rf  rO  r7  r8  Úsubtract_temporalsr   r   )r   r   r   r7  r8  r"   r"   r#   r   b  s   ÿzTemporalSubtraction.as_sql)	r%   r&   r'   r   rU  r   r}   r   r`  r"   r"   rE  r#   rZ  \  s    rZ  zdjango.db.models.F)Úpathc                   @   sp   e Zd ZdZ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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#   r}   q  s   
z
F.__init__c                 C   ó   d  | jj| j¡S ©Nú{}({}))rG  r´   r%   rÓ   r=   r"   r"   r#   rH  x  ó   z
F.__repr__c                 C   s
   t | |ƒS ru   )ÚSliced)r   Ú	subscriptr"   r"   r#   Ú__getitem__{  ræ   zF.__getitem__c                 C   s   t d| jj› d�ƒ‚)Nzargument of type 'z' is not iterable)Ú	TypeErrorr´   r%   rD   r"   r"   r#   Ú__contains__~  s   zF.__contains__NTc                 C   s   |  | j|||¡S ru   )Úresolve_refrÓ   ©r   r¬   rª   r­   r®   r«   r"   r"   r#   r2   ƒ  s   zF.resolve_expressionc                 C   s‚   |  | ¡ }d ur|S | j t¡^}}|s| S |  t|ƒ¡ }d u s'|jd u r)| S |D ]}| |¡}|d u r:|   S ||ƒ}q+|S ru   )rß   rÓ   Úsplitr   r’   r¼   rÑ   )r   rÞ   rà   Ú
field_nameÚ
transformsÚ	transformÚtransform_classr"   r"   r#   rÜ   ˆ  s    þ


zF.replace_expressionsc                 K   rð   ru   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 ru   )r´   rÓ   rD   r"   r"   r#   r(  ¢  ó   zF.__eq__c                 C   r)  ru   )r*  rÓ   r=   r"   r"   r#   r+  ¥  ræ   z
F.__hash__c                 C   rä   ru   rå   r=   r"   r"   r#   r€   ¨  ræ   zF.copyr   )r%   r&   r'   r(   r  r}   rH  rs  ru  r2   rÜ   rõ   rù   r(  r+  r€   r"   r"   r"   r#   r’   k  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   rn   )NzXThis queryset contains a reference to an outer query and may only be used in a subquery.)r³   ©r   r&  rô   r"   r"   r#   r   ·  rr   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: rh  )rD  r2   r¤   r   rÓ   r   Úpossibly_multivalued)r   r&  rô   ÚcolrE  r"   r#   r2   ½  s   ÿÿz#ResolvedOuterRef.resolve_expressionc                 C   rÀ   ru   r"   ©r   Úrelabelsr"   r"   r#   rÕ   Ê  rŠ   z ResolvedOuterRef.relabeled_clonec                 C   rˆ   ru   r"   r=   r"   r"   r#   rë   Í  rŠ   z"ResolvedOuterRef.get_group_by_cols)r%   r&   r'   r(   rœ   r¤   r   r2   rÕ   rë   r`  r"   r"   rE  r#   r~  ¬  s    r~  c                   @   s$   e Zd ZdZdZdd„ Zdd„ ZdS )ÚOuterRefFc                 O   s   t | j| jƒr
| jS t| jƒS ru   )r�   rÓ   r´   r~  r  r"   r"   r#   r2   Õ  s   
zOuterRef.resolve_expressionc                 C   rÀ   ru   r"   r‚  r"   r"   r#   rÕ   Ú  rŠ   zOuterRef.relabeled_cloneN)r%   r&   r'   rœ   r¤   r2   rÕ   r"   r"   r"   r#   r„  Ñ  s
    r„  c                       s<   e Zd ZdZ‡ fdd„Zdd„ Z					dd	d
„Z‡  ZS )rq  z¬
    An object that contains a slice of an F expression.

    Object resolves the column on which the slicing is applied, and then
    applies the slicing if possible.
    c                    sú   t ƒ  |j¡ || _t|tƒr!|dk rtdƒ‚|d | _d| _d S t|t	ƒry|jd ur0|jdk s:|j
d ur>|j
dk r>tdƒ‚|jd urGtdƒ‚|j
rW|jrW|j
|jk rWtdƒ‚|jd u r^dn|jd | _|j
d u rnd | _d S |j
|jptd | _d S tdƒ‚)Nr   z#Negative indexing is not supported.é   zStep argument is not supported.z,Slice stop must be greater than slice start.z7Argument to slice must be either int or slice instance.)rD  r}   rÓ   Úobjr�   rË   r³   ÚstartÚlengthÚsliceÚstopÚsteprt  )r   r†  rr  rE  r"   r#   r}   æ  s(   






zSliced.__init__c                 C   sH   | j d }| jd u rd n|| j }t||ƒ}| jj› d| j›d|›d�S )Nr…  ú(rM  ú))r‡  rˆ  r‰  r´   r'   r†  )r   r‡  rŠ  rr  r"   r"   r#   rH  ÿ  s   

zSliced.__repr__NTFc                 C   sR   |  | j|||¡}t| jt| jfƒr| j |||||¡}n|}|j || j	| j
¡S ru   )rv  rÓ   r�   r†  r„  r´   r2   r   Úslice_expressionr‡  rˆ  )r   r¬   rª   r­   r®   r«   r\  rž   r"   r"   r#   r2     s   
ÿzSliced.resolve_expressionr   )r%   r&   r'   r(   r}   rH  r2   r`  r"   r"   rE  r#   rq  Þ  s    úrq  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‡ fdd„Zedd„ ƒZ‡  ZS )ÚFunczAn SQL function call.Nz%(function)s(%(expressions)s)rM  r{   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)r…  Úargumentr#  r{   )
ÚarityÚlenrt  r´   r%   rD  r}   r˜   r¶   Úextra)r   r   r—   r“  rE  r"   r#   r}      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 ru   ©r‘   r“   r"   r"   r#   rŸ   0  ó   € z Func.__repr__.<locals>.<genexpr>rM  c                 s   s(   � | ]\}}t |ƒd  t |ƒ V  qdS )ú=Nr•  r  r"   r"   r#   rŸ   3  s   € 
ÿú
{}({}, {})ro  )
Ú
arg_joinerÚjoinr¶   r“  Ú_get_repr_optionsÚsortedr  rG  r´   r%   )r   r&  r“  r"   r"   r#   rH  /  s   

ÿzFunc.__repr__c                 C   s   i S )zAReturn a dict of extra __init__() options to include in the repr.r"   r=   r"   r"   r#   r›  9  rÄ   zFunc._get_repr_optionsc                 C   r¸   ru   ©r¶   r=   r"   r"   r#   r‰   =  ó   zFunc.get_source_expressionsc                 C   s
   || _ d S ru   r�  r‹   r"   r"   r#   r�   @  ræ   zFunc.set_source_expressionsc              	   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Útemplater™  r—   r¹   )rP  rf  r¶   rO  r
   rW   r  r4   r   r%  rê   r“  Ú
setdefaultrŸ  rß   r   r™  rš  )r   r   r   rŸ  r   r™  r   Ú	sql_partsr!   r•   Úarg_sqlÚ
arg_paramsr  Údatar"   r"   r#   r   C  s4   	
ÿÿ

zFunc.as_sqlc                    s*   t ƒ  ¡ }| jd d … |_| j ¡ |_|S ru   )rD  r€   r¶   r“  )r   r€   rE  r"   r#   r€   j  s   
z	Func.copyc                 C   s   t dd„ | jD ƒƒS )Nc                 s   ó   � | ]}|j V  qd S ru   ©r  )r”   rÃ   r"   r"   r#   rŸ   r  s   € z'Func.allowed_default.<locals>.<genexpr>)Úallr¶   r=   r"   r"   r#   r  p  ó   zFunc.allowed_default©NNN)r%   r&   r'   r(   rŸ  r   r™  r‘  r}   rH  r›  r‰   r�   r   r€   r   r  r`  r"   r"   rE  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 )r4   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().
        r{   N)rD  r}   rÂ   )r   rÂ   r   rE  r"   r#   r}   ~  s   	
zValue.__init__c                 C   s   | j j› d| j›d�S )NrŒ  r�  )r´   r%   rÂ   r=   r"   r"   r#   rH  Š  rj  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)	rP  rf  rÂ   r¼   r«   Úget_db_prep_saveÚget_db_prep_valuer3   r«  )r   r   r   r  r   r"   r"   r#   r   �  s   

zValue.as_sqlc                    s   t ƒ  |||||¡}||_|S ru   )rD  r2   r«   ©r   r¬   rª   r­   r®   r«   rµ   rE  r"   r#   r2   Ÿ  s   zValue.resolve_expressionc                 C   rˆ   ru   r"   r=   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 ru   )r�   rÂ   r‘   r   Ú	CharFieldÚboolr·   rË   rÊ   rÇ   rÅ   ÚdatetimerX  ÚdaterV  ÚtimerW  Ú	timedeltarU  r   r   ÚbytesÚBinaryFieldr	   Ú	UUIDFieldr=   r"   r"   r#   r»   ©  s.   ÿzValue._resolve_output_fieldc                 C   r¸   ru   )rÂ   r=   r"   r"   r#   r  Á  rº   zValue.empty_result_set_valueru   r   )r%   r&   r'   r(   r«   r  r}   rH  r   r2   rë   r»   r  r  r`  r"   r"   rE  r#   r4   u  s    ÿr4   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 rC  )r   r  r    r!   rD  r}   )r   r    r!   r   rE  r"   r#   r}   É  s   zRawSQL.__init__c                 C   ó   d  | jj| j| j¡S ©Nr˜  )rG  r´   r%   r    r!   r=   r"   r"   r#   rH  Ï  rj  zRawSQL.__repr__c                 C   s   d| j  | jfS rN  )r    r!   r™   r"   r"   r#   r   Ò  r?   zRawSQL.as_sqlc                 C   ó   | gS ru   r"   r=   r"   r"   r#   rë   Õ  rž  zRawSQL.get_group_by_colsFc                    sb   |j r'|j jjD ]}|jjD ]}|j ¡ | j ¡ v r%| |j|||¡  nqqt	ƒ  
|||||¡S ru   )r  r  Úall_parentsÚlocal_fieldsÚcolumnÚlowerr    rv  rÓ   rD  r2   )r   r¬   rª   r­   r®   r«   ÚparentÚparent_fieldrE  r"   r#   r2   Ø  s   
ÿü€
ÿzRawSQL.resolve_expressionru   r   )
r%   r&   r'   r  r}   rH  r   rë   r2   r`  r"   r"   rE  r#   r¹  Æ  s    ÿr¹  c                   @   s   e Zd Zdd„ Zdd„ ZdS )ÚStarc                 C   s   dS )Nz'*'r"   r=   r"   r"   r#   rH  ê  rŠ   zStar.__repr__c                 C   s   dg fS )Nr,   r"   r™   r"   r"   r#   r   í  rx   zStar.as_sqlN)r%   r&   r'   rH  r   r"   r"   r"   r#   rÃ  é  s    rÃ  c                       sF   e Zd ZdZd‡ fdd„	Zdd„ Zdd„ Z	
ddd„Zdd„ Z‡  Z	S )ÚDatabaseDefaultz^
    Expression to use DEFAULT keyword during insert otherwise the underlying expression.
    Nc                    s   t ƒ  |¡ || _d S ru   ©rD  r}   rÃ   ©r   rÃ   r   rE  r"   r#   r}   ö  s   
zDatabaseDefault.__init__c                 C   ó   | j gS ru   ©rÃ   r=   r"   r"   r#   r‰   ú  rx   z&DatabaseDefault.get_source_expressionsc                 C   ó   |\| _ d S ru   rÈ  r‹   r"   r"   r#   r�   ý  rŽ   z&DatabaseDefault.set_source_expressionsTFc                 C   s,   | j j|||||d�}|s|S t|| jd�S )N)r¬   rª   r­   r®   r«   r{   )rÃ   r2   rÄ  r¼   )r   r¬   rª   r­   r®   r«   Úresolved_expressionr"   r"   r#   r2      s   û	ÿz"DatabaseDefault.resolve_expressionc                 C   s   |j js
| | j¡S dg fS )NÚDEFAULT)rd  Ú"supports_default_keyword_in_insertrO  rÃ   r™   r"   r"   r#   r     s   zDatabaseDefault.as_sqlru   r   )
r%   r&   r'   r(   r}   r‰   r�   r2   r   r`  r"   r"   rE  r#   rÄ  ñ  s    
ÿ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 rC  )rD  r}   ÚaliasÚtarget)r   rÎ  rÏ  r   rE  r"   r#   r}     s   zCol.__init__c                 C   s>   | j | j}}|r|t|ƒfnt|ƒf}d | jjd |¡¡S )Nro  rM  )rÎ  rÏ  r‘   rG  r´   r%   rš  )r   rÎ  rÏ  Úidentifiersr"   r"   r#   rH  "  s   zCol.__repr__c                 C   s<   | j | jj}}|r||fn|f}d t|j|ƒ¡}|g fS ©Nrh  )rÎ  rÏ  r¿  rš  r  Ú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 ru   )rÎ  r´   rß   rÏ  r   r‚  r"   r"   r#   rÕ   -  s
   
ÿzCol.relabeled_clonec                 C   r¼  ru   r"   r=   r"   r"   r#   rë   4  rž  zCol.get_group_by_colsc                 C   s0   | j | jkr| j |¡S | j |¡| j  |¡ S ru   )rÏ  r   r†   r‡   r"   r"   r#   r†   7  s   ÿ
þzCol.get_db_convertersru   )r%   r&   r'   r¥   r€  r}   rH  r   rÕ   rë   r†   r`  r"   r"   rE  r#   rÍ    s    rÍ  c                       sl   e Zd Z‡ f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‡  ZS )r°   c                    s$   t ƒ j|d� || _|| _|| _d S rC  )rD  r}   rÎ  ÚtargetsÚsources)r   rÎ  rÓ  rÔ  r   rE  r"   r#   r}   @  rF  zColPairs.__init__c                 C   r)  ru   )r’  rÓ  r=   r"   r"   r#   Ú__len__F  ræ   zColPairs.__len__c                 C   s   t |  ¡ ƒS ru   )r"  Úget_colsr=   r"   r"   r#   Ú__iter__I  rŽ   zColPairs.__iter__c              
   C   s.   | j j› d| j›d| j›d| j›d| j›d�
S )NrŒ  rM  r�  )r´   r%   rÎ  rÓ  rÔ  r   r=   r"   r"   r#   rH  L  s   ÿÿÿzColPairs.__repr__c                    s   ‡ fdd„t ˆ jˆ jƒD ƒS )Nc                    s   g | ]\}}t ˆ j||ƒ‘qS r"   )rÍ  rÎ  )r”   rÏ  r½   r=   r"   r#   r–   S  s    ÿÿz%ColPairs.get_cols.<locals>.<listcomp>)ÚziprÓ  rÔ  r=   r"   r=   r#   rÖ  R  s   
þzColPairs.get_colsc                 C   s   |   ¡ S ru   )rÖ  r=   r"   r"   r#   r‰   X  rx   zColPairs.get_source_expressionsc                    s>   t ‡ fdd„|D ƒƒsJ ‚dd„ |D ƒˆ _dd„ |D ƒˆ _d S )Nc                 3   s&   � | ]}t |tƒo|jˆ jkV  qd S ru   )r�   rÍ  rÎ  r�   r=   r"   r#   rŸ   \  s   €$ z2ColPairs.set_source_expressions.<locals>.<genexpr>c                 S   rî   r"   )rÏ  ©r”   r�  r"   r"   r#   r–   ]  rï   z3ColPairs.set_source_expressions.<locals>.<listcomp>c                 S   rî   r"   )r¹   rÙ  r"   r"   r#   r–   ^  rï   )r¨  rÓ  rÔ  r‹   r"   r=   r#   r�   [  s   zColPairs.set_source_expressionsc           	      C   sL   g }g }|   ¡ }|D ]}| ||¡\}}| |¡ | |¡ q
d |¡|fS )NrM  )rÖ  r   r%  rê   rš  )	r   r   r   Úcols_sqlÚcols_paramsrí   r�  r    r!   r"   r"   r#   r   `  s   
zColPairs.as_sqlc                 C   s"   |   | | j| j¡| j| j| j¡S ru   )r´   rß   rÎ  rÓ  rÔ  r¹   r‚  r"   r"   r#   rÕ   l  s   ÿzColPairs.relabeled_clonec                 O   rÀ   ru   r"   r  r"   r"   r#   r2   q  rŠ   zColPairs.resolve_expressionc                 C   s   ||fS ru   r"   rý   r"   r"   r#   rü   t  rx   zColPairs.select_format)r%   r&   r'   r}   rÕ  r×  rH  rÖ  r‰   r�   r   rÕ   r2   rü   r`  r"   r"   rE  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 ru   )rD  r}   rã   r½   )r   rã   r½   rE  r"   r#   r}   ~  s   
zRef.__init__c                 C   rº  r»  )rG  r´   r%   rã   r½   r=   r"   r"   r#   rH  ‚  rj  zRef.__repr__c                 C   rÇ  ru   ©r½   r=   r"   r"   r#   r‰   …  rx   zRef.get_source_expressionsc                 C   rÉ  ru   rÝ  r‹   r"   r"   r#   r�   ˆ  rŽ   zRef.set_source_expressionsNTFc                 C   rÀ   ru   r"   rw  r"   r"   r#   r2   ‹  s   zRef.resolve_expressionc                 C   s   | j hS ru   )rã   r=   r"   r"   r#   râ   ’  rx   zRef.get_refsc                 C   s   |   ¡ }| j |¡|_|S ru   )r€   r½   rÕ   )r   rƒ  rÛ   r"   r"   r#   rÕ   •  s   zRef.relabeled_clonec                 C   s   |j  | j¡g fS ru   )rP  Ú
quote_namerã   r™   r"   r"   r#   r   š  rp  z
Ref.as_sqlc                 C   r¼  ru   r"   r=   r"   r"   r#   rë   �  rž  zRef.get_group_by_colsr   )r%   r&   r'   r(   r}   rH  r‰   r�   r2   râ   rÕ   r   rë   r`  r"   r"   rE  r#   rÜ  x  s    
ÿrÜ  c                       s<   e Zd ZdZdZd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                 C   s   | j  dd„ | jD ƒ¡S )Nc                 s   r”  ru   r•  r“   r"   r"   r#   rŸ   «  r–  z)ExpressionList.__str__.<locals>.<genexpr>)r™  rš  r¶   r=   r"   r"   r#   rI  ª  r}  zExpressionList.__str__c                    s   | j sdS tƒ j|i |¤ŽS )N)Ú r"   )r¶   rD  r   r  rE  r"   r#   r   ­  s   zExpressionList.as_sqlc                 K   s   | j ||fi |¤ŽS ru   )r   )r   r   r   r   r"   r"   r#   r$   ²  r©  zExpressionList.as_sqlitec                 C   ó$   g }|   ¡ D ]	}| | ¡ ¡ q|S ru   ©r‰   rê   rë   )r   Úgroup_by_colsrž   r"   r"   r#   rë   ¶  ó   z ExpressionList.get_group_by_cols)
r%   r&   r'   r(   r   rI  r   r$   rë   r`  r"   r"   rE  r#   rß  ¡  s    rß  c                       s$   e Zd ZdZdZ‡ f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>)rD  r}   )r   r—   r“  rE  r"   r#   r}   Á  s   úzOrderByList.__init__)r%   r&   r'   r  r   r}   r`  r"   r"   rE  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 rC  rÅ  rÆ  rE  r"   r#   r}   Ô  s   
zExpressionWrapper.__init__c                 C   ó   |d | _ d S ©Nr   rÈ  r‹   r"   r"   r#   r�   Ø  ó   z(ExpressionWrapper.set_source_expressionsc                 C   rÇ  ru   rÈ  r=   r"   r"   r#   r‰   Û  rx   z(ExpressionWrapper.get_source_expressionsc                    s0   t | jtƒr| j ¡ }| j|_| ¡ S tƒ  ¡ S ru   )r�   rÃ   r	  r€   r   rë   rD  ©r   rÃ   rE  r"   r#   rë   Þ  s
   

z#ExpressionWrapper.get_group_by_colsc                 C   s   |  | j¡S ru   )rO  rÃ   r™   r"   r"   r#   r   ç  rŽ   zExpressionWrapper.as_sqlc                 C   rm  rn  )rG  r´   r%   rÃ   r=   r"   r"   r#   rH  ê  rp  zExpressionWrapper.__repr__c                 C   ó   | j jS ru   )rÃ   r  r=   r"   r"   r#   r  í  ó   z!ExpressionWrapper.allowed_default)r%   r&   r'   r(   r}   r�   r‰   rë   r   rH  r  r  r`  r"   r"   rE  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 )rv   z1The logical negation of a conditional expression.c                    s   t ƒ j|t ¡ d� d S rC  )rD  r}   r   r·   rë  rE  r"   r#   r}   õ  r}  zNegatedExpression.__init__c                 C   ó
   | j  ¡ S ru   )rÃ   r€   r=   r"   r"   r#   rw   ø  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 )rD  r   r
   r   rd  Ú&supports_boolean_expr_in_select_clauserO  r4   rP  Ú0conditional_expression_supported_in_where_clauserÃ   )r   r   r   r    r!   rd  rP  rE  r"   r#   r   û  s   üzNegatedExpression.as_sqlNTFc                    s.   t ƒ  |||||¡}t|jddƒstdƒ‚|S )NrT   Fz*Cannot negate non-conditional expressions.)rD  r2   rW   rÃ   rt  )r   r¬   rª   r­   r®   r«   r\  rE  r"   r#   r2     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   rP  rð  rd  rï  rÃ   rG  )r   r   r    r!   Ú$expression_supported_in_where_clauser"   r"   r#   rü     s   ÿÿý
zNegatedExpression.select_formatr   )
r%   r&   r'   r(   r}   rw   r   r2   rü   r`  r"   r"   rE  r#   rv   ò  s    ÿ
rv   zdjango.db.models.Whenc                       s|   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‡ fdd„	Z
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 )NrT   FzLWhen() supports a Q object, a boolean expression, or lookups as a condition.z1An empty Q() can't be used as a When() condition.r{   r   r"   )
r   rW   rt  r�   r³   rD  r}   Ú	conditionr˜   r9  )r   rô  ÚthenÚlookupsrE  r"   r#   r}   +  s   ÿzWhen.__init__c                 C   s   d| j | jf S )NzWHEN %r THEN %r©rô  r9  r=   r"   r"   r#   rI  <  r?   zWhen.__str__c                 C   ó   d| j j| f S ©Nz<%s: %s>©r´   r%   r=   r"   r"   r#   rH  ?  r?   zWhen.__repr__c                 C   rJ  ru   r÷  r=   r"   r"   r#   r‰   B  rŽ   zWhen.get_source_expressionsc                 C   rL  ru   r÷  r‹   r"   r"   r#   r�   E  r?   zWhen.set_source_expressionsTc                    s>   t ƒ  |||||¡}|r|jd ur| jj||||dd�|_|S )NF)r«   )rD  r2   rô  r¯  rE  r"   r#   r2   H  s   
ÿzWhen.resolve_expressionc                 C   s
   | j jgS ru   )r9  r¼   r=   r"   r"   r#   r¾   S  s   
zWhen.get_source_fieldsc                 K   sh   |j  | ¡ |}g }| | j¡\}}||d< | | j¡\}	}
|	|d< |p&| j}|| g |¢|¢|
¢R fS )Nrô  r9  )rP  rf  rO  rô  r9  r   )r   r   r   r   r   Útemplate_paramsÚ
sql_paramsÚcondition_sqlÚcondition_paramsÚ
result_sqlÚresult_paramsr"   r"   r#   r   W  s   
ÿþýzWhen.as_sqlc                 C   rá  ru   râ  rì   r"   r"   r#   rë   f  s   zWhen.get_group_by_colsc                 C   r^  ru   )rô  r  r9  r=   r"   r"   r#   r  m  r_  zWhen.allowed_default©NNr   ru   )r%   r&   r'   r   rT   r}   rI  rH  r‰   r�   r2   r¾   r   rë   r   r  r`  r"   r"   rE  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
‡ 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   r¯   ru   )r�   ró  )r”   Úcaser"   r"   r#   rŸ   „  s   € z Case.__init__.<locals>.<genexpr>z.Positional arguments must all be When objects.r   )	r¨  rt  rD  r}   r4  Úcasesr˜   r  r“  )r   r  r   r  r“  rE  r"   r#   r}   ƒ  s   

zCase.__init__c                 C   s    dd  dd„ | jD ƒ¡| jf S )NzCASE %s, ELSE %rrM  c                 s   r”  ru   r•  )r”   rµ   r"   r"   r#   rŸ   �  r–  zCase.__str__.<locals>.<genexpr>)rš  r  r  r=   r"   r"   r#   rI  ‹  s   þzCase.__str__c                 C   rø  rù  rú  r=   r"   r"   r#   rH  ‘  r?   zCase.__repr__c                 C   s   | j | jg S ru   ©r  r  r=   r"   r"   r#   r‰   ”  rê  zCase.get_source_expressionsc                 C   s   |�^ | _ | _d S ru   r  r‹   r"   r"   r#   r�   —  rp  zCase.set_source_expressionsc                    s   t ƒ  ¡ }|jd d … |_|S ru   )rD  r€   r  )r   rµ   rE  r"   r#   r€   š  s   
z	Case.copyc              	   K   s   |j  | ¡ | js| | j¡S i | j¥|¥}g }g }| jD ]0}	z	| |	¡\}
}W n ty1   Y q tyB   | |	j¡\}}Y  nw | 	|
¡ | 
|¡ q| | j¡\}}|s\||fS |p`| j}| |¡|d< ||d< | 
|¡ |py| d| j¡}|| }| jd urŒ|j  | j¡| }||fS )Nr  r  r   )rP  rf  r  rO  r  r“  r
   r   r9  r%  rê   Úcase_joinerrš  rß   r   r¼   Úunification_cast_sqlr   )r   r   r   r   r  r   rû  Ú
case_partsrü  r  Úcase_sqlÚcase_paramsÚdefault_sqlÚdefault_paramsr    r"   r"   r#   r   Ÿ  s:   
þ



zCase.as_sqlc                    s   | j s| j ¡ S tƒ  ¡ S ru   )r  r  rë   rD  r=   rE  r"   r#   rë   À  s   

zCase.get_group_by_colsc                 C   s   | j jotdd„ | jD ƒƒS )Nc                 s   r¦  ru   r§  )r”   Úcase_r"   r"   r#   rŸ   Ç  s   € 
ÿz'Case.allowed_default.<locals>.<genexpr>)r  r  r¨  r  r=   r"   r"   r#   r  Å  s   ÿzCase.allowed_defaultr  )r%   r&   r'   r(   r   r  r}   rI  rH  r‰   r�   r€   r   rë   r   r  r`  r"   r"   rE  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)rW   rÛ   r¬   r§   r“  rD  r}   )r   Úquerysetr   r“  rE  r"   r#   r}   ×  s   zSubquery.__init__c                 C   rÇ  ru   ©r¬   r=   r"   r"   r#   r‰   Þ  rx   zSubquery.get_source_expressionsc                 C   rè  ré  r  r‹   r"   r"   r#   r�   á  rê  zSubquery.set_source_expressionsc                 C   rì  ru   )r¬   r   r=   r"   r"   r#   r»   ä  rx   zSubquery._resolve_output_fieldc                    s   t ƒ  ¡ }|j ¡ |_|S ru   )rD  r€   r¬   rÛ   )r   rÛ   rE  r"   r#   r€   ç  r„   zSubquery.copyc                 C   rì  ru   )r¬   Úexternal_aliasesr=   r"   r"   r#   r  ì  rí  zSubquery.external_aliasesc                 C   rî  ru   )r¬   Úget_external_colsr=   r"   r"   r#   r  ð  ræ   zSubquery.get_external_colsc           	      K   s^   |j  | ¡ i | j¥|¥}| j ||¡\}}|dd… |d< |p&| d| j¡}|| }||fS )Nr…  r:   r§   r   )rP  rf  r“  r¬   r   rß   r   )	r   r   r   r   r   rû  Úsubquery_sqlrü  r    r"   r"   r#   r   ó  s   zSubquery.as_sqlc                 C   s   | j j| d�S )N)Úwrapper)r¬   rë   r=   r"   r"   r#   rë   ý  rê  zSubquery.get_group_by_colsru   )r%   r&   r'   r(   r   rœ   r  r§   r}   r‰   r�   r»   r€   r  r  r  r   rë   r`  r"   r"   rE  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 ru   )rD  r}   r¬   Úexists)r   r  rô   rE  r"   r#   r}     s   zExists.__init__c                 C   s   |j jjs
d |¡}||fS rñ  )r   rd  rï  rG  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)rD  r   r
   r   rd  rï  rO  r4   )r   r   r&  rô   rd  rE  r"   r#   r     s   üzExists.as_sql)r%   r&   r'   r   r   r·   r   r  r}   rü   r   r`  r"   r"   rE  r#   r    s    r  zdjango.db.models.OrderByc                   @   sp   e Zd ZdZdZdZdZddd„Zdd„ Zd	d
„ Z	dd„ Z
ddd„Zdd„ Zdd„ Zdd„ Zdd„ Zdd„ ZdS )rò   z%(expression)s %(ordering)sFTNc                 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.r2   z%expression must be an expression type)r³   Únulls_firstÚ
nulls_lastrø   r3   rÃ   )r   rÃ   rø   r  r  r"   r"   r#   r}   #  s   

zOrderBy.__init__c                 C   rº  )Nz{}({}, descending={}))rG  r´   r%   rÃ   rø   r=   r"   r"   r#   rH  /  s   ÿzOrderBy.__repr__c                 C   rè  ré  rÈ  r‹   r"   r"   r#   r�   4  rê  zOrderBy.set_source_expressionsc                 C   rÇ  ru   rÈ  r=   r"   r"   r#   r‰   7  rx   zOrderBy.get_source_expressionsc                 K   s&  t | jtƒr4g }g }| j ¡ D ]}|  ¡ }| |g¡ | |¡\}	}
| |	¡ | |
¡ qd 	|¡|fS |p8| j
}|jjrM| jrEd| }n%| jrLd| }n| jr\| jrW|jjs\d| }n| jrj| jsf|jjsjd| }|j | ¡ | | j¡\}}|| jr~dnddœ|¥}|| d	¡9 }||  ¡ |fS )
NrM  z%s NULLS LASTz%s NULLS FIRSTz%%(expression)s IS NULL, %sz%%(expression)s IS NOT NULL, %sÚDESCÚASC)rÃ   Úorderingz%(expression)s)r�   rÃ   r°   rÖ  r€   r�   rO  r%  rê   rš  r   rd  Ú supports_order_by_nulls_modifierr  r  rø   Úorder_by_nulls_firstrP  rf  ÚcountÚrstrip)r   r   r   r   r   r¢  r!   r�  r€   r    Ú
col_paramsÚexpression_sqlÚplaceholdersr"   r"   r#   r   :  sL   


€ÿÿ
ÿÿþý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  )	rd  rï  rP  rð  rÃ   r€   r  ró  r   )r   r   r   r€   r"   r"   r#   Ú	as_oracle^  s   ÿÿþþzOrderBy.as_oraclec                 C   rá  ru   râ  rì   r"   r"   r#   rë   o  rä  zOrderBy.get_group_by_colsc                 C   s6   | j  | _ | jrd| _d | _| S | jrd| _d | _| S rg   )rø   r  r  r=   r"   r"   r#   rú   u  s   
ýzOrderBy.reverse_orderingc                 C   ó
   d| _ d S rA   ræ  r=   r"   r"   r#   rõ     ræ   zOrderBy.ascc                 C   r&  rg   ræ  r=   r"   r"   r#   rù   ‚  ræ   zOrderBy.desc)FNNru   )r%   r&   r'   r   rT   rþ   r²   r}   rH  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.r{   r   )Úpartition_byÚorder_byÚframerW   r³   r´   r%   r�   r  r4  rß  rå  rz   r‘   rD  r}   r˜   Úsource_expression)r   rÃ   r(  r)  r*  r   rE  r"   r#   r}   Ž  s.   ÿÿ


ÿzWindow.__init__c                 C   rì  ru   )r+  r   r=   r"   r"   r#   r»   ²  rx   zWindow._resolve_output_fieldc                 C   s   | j | j| j| jgS ru   ©r+  r(  r)  r*  r=   r"   r"   r#   r‰   µ  rÉ   zWindow.get_source_expressionsc                 C   s   |\| _ | _| _| _d S ru   r,  r‹   r"   r"   r#   r�   ¸  r}  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   r   r  )rÃ   Úwindow)rP  rf  rd  Úsupports_over_clauser   rO  r+  r(  r   r%  r  r)  r*  r   rš  Ústrip)r   r   r   r   Ú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�   rD  r'  r$   r   )r   r   r   r€   r¶   rE  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à  )rG  r‘   r+  r(  r)  r*  r=   r"   r"   r#   rI  æ  s   üzWindow.__str__c                 C   rø  rù  rú  r=   r"   r"   r#   rH  î  r?   zWindow.__repr__c                 C   s8   g }| j r| | j  ¡ ¡ | jd ur| | j ¡ ¡ |S ru   )r(  rê   rë   r)  )r   rã  r"   r"   r#   rë   ñ  s   
zWindow.get_group_by_cols)NNNNru   )r%   r&   r'   r   rœ   r¤   r}   r»   r‰   r�   r   r$   rI  rH  rë   r`  r"   r"   rE  r#   r'  †  s"    ú$
!
r'  c                   @   s$   e Zd ZdZdZdZdZdd„ ZdS )ÚWindowFrameExclusionzCURRENT ROWÚGROUPÚTIESz	NO OTHERSc                 C   s   | j j› d| j› �S rÑ  )r´   r'   Ú_name_r=   r"   r"   r#   rH     rÉ   zWindowFrameExclusion.__repr__N)r%   r&   r'   ÚCURRENT_ROWr9  r:  Ú	NO_OTHERSrH  r"   r"   r"   r#   r8  ú  s    r8  c                   @   s^   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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).
    z7%(frame_type)s BETWEEN %(start)s AND %(end)s%(exclude)sNc                 C   s>   t |ƒ| _t |ƒ| _t|ttfƒst| jj› d�ƒ‚|| _	d S )Nz3.exclusion must be a WindowFrameExclusion instance.)
r4   r‡  Úendr�   r   r8  rt  r´   r'   Ú	exclusion)r   r‡  r?  r@  r"   r"   r#   r}     s   

ÿ
zWindowFrame.__init__c                 C   rL  ru   ©r‡  r?  r‹   r"   r"   r#   r�     r?   z"WindowFrame.set_source_expressionsc                 C   rJ  ru   rA  r=   r"   r"   r#   r‰     rŽ   z"WindowFrame.get_source_expressionsc                 C   s   | j d u rdS d| j j› �S )Nrà  z	 EXCLUDE )r@  rÂ   r=   r"   r"   r#   Úget_exclusion  s   
zWindowFrame.get_exclusionc                 C   sZ   |j  | ¡ |  || jj| jj¡\}}| jr|jjst	dƒ‚| j
| j|||  ¡ dœ g fS )Nz6This backend does not support window frame exclusions.©Ú
frame_typer‡  r?  Úexclude)rP  rf  Úwindow_frame_start_endr‡  rÂ   r?  r@  rd  Úsupports_frame_exclusionr   r   rD  rB  )r   r   r   r‡  r?  r"   r"   r#   r   $  s"   ÿÿüÿøzWindowFrame.as_sqlc                 C   rø  rù  rú  r=   r"   r"   r#   rH  8  r?   zWindowFrame.__repr__c                 C   rˆ   ru   r"   r=   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| j jd urA| j jdkrAd| j jtjjf }ntjj}| j	jd ur\| j	jdkr\d| j	jtjjf }n.| j	jd urm| j	jdkrmtjj}n| j	jd ur†| j	jdk r†dt| j	jƒtjjf }ntjj
}| j| j|||  ¡ dœ S )Nr   z%d %srC  )r‡  rÂ   Úabsr   rP  Ú	PRECEDINGr<  Ú	FOLLOWINGÚUNBOUNDED_PRECEDINGr?  ÚUNBOUNDED_FOLLOWINGr   rD  rB  )r   r‡  r?  r"   r"   r#   rI  >  s(   

üzWindowFrame.__str__c                 C   rn   )Nz3Subclasses must implement window_frame_start_end().rp   ©r   r   r‡  r?  r"   r"   r#   rF  W  rx   z"WindowFrame.window_frame_start_endrª  )r%   r&   r'   r(   r   r}   r�   r‰   rB  r   rH  rë   rI  rF  r"   r"   r"   r#   r>    s    

r>  c                   @   r   )ÚRowRangeÚROWSc                 C   ó   |j  ||¡S ru   )rP  Úwindow_frame_rows_start_endrM  r"   r"   r#   rF  ^  rê  zRowRange.window_frame_start_endN©r%   r&   r'   rD  rF  r"   r"   r"   r#   rN  [  ó    rN  c                   @   r   )Ú
ValueRangeÚRANGEc                 C   rP  ru   )rP  Úwindow_frame_range_start_endrM  r"   r"   r#   rF  e  rê  z!ValueRange.window_frame_start_endNrR  r"   r"   r"   r#   rT  b  rS  rT  )cr€   r²  r,  r  Úcollectionsr   Údecimalr   Úenumr   Ú	itertoolsr   Ú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   r   Údjango.utils.hashabler   r   r)   ry   rz   r	  rC   r<   rK   rN   rQ   rG   r[   re   r]   r_   rb   rV  rU  rX  rW  Ú_connector_combinationsr4  r6  r:  Údr  r7   Úfield_typesr7  r8  r9  r-  rB  r5   rY  rZ  r’   r~  r„  rq  r�  r4   r¹  rÃ  rÄ  rÍ  r°   rÜ  rß  rå  rç  rv   ró  r  r  r  rò   r'  r8  r>  rN  rT  r"   r"   r"   r#   Ú<module>   s      Y8	ûøøúûùûüúõöÿôÿ™yÿÿ

	W3@%9]P#''9)$3LY5it
W