o
    ·„j% ã                   @   sX  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# 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'j0e'j,e'j-e'j.e'j/fD ƒdd„ e'j+e'j0e'j,e'j-e'j.fD ƒdd„ e'j1e'j2e'j3e'j4e'j5fD ƒd d„ e'j+e'j0e'j,e'j-e'j.e'j/fD ƒe'j+ej6ej7ej8fej8ej7ej8fej7ej6ej8fej7ej8ej8fej7ej7ej7fej9ej7ej9fej7ej9ej9fgie'j0ej6ej7ej8fej8ej7ej8fej6ej6ej7fej6ej8ej7fej8ej6ej7fej8ej8ej7fej7ej7ej7fej9ej7ej9fej9ej9ej7fg	igZ:ee;ƒZ<d!d"„ Z=e:D ]Z>e> ?¡ D ]\Z@ZAeAD ]\ZBZCZDe=eBe@eCeDƒ �q|�qv�qpejEd#d$�d%d&„ ƒZFG d'd(„ d(e&e*ƒZGG d)d*„ d*eGƒZHG d+d,„ d,eGƒZIed-d.�G d/d0„ d0e'ƒƒZJG d1d2„ d2eJƒZKG d3d4„ d4eJƒZLG d5d6„ d6eJƒZMed7d.�G d8d9„ d9e&e*ƒƒZNed:d.�G d;d<„ d<e&e*ƒƒZOG d=d>„ d>e*ƒZPG d?d@„ d@e*ƒZQG dAdB„ dBe*ƒZRG dCdD„ dDe*ƒZSG dEdF„ dFe*ƒZTG dGdH„ dHe*ƒZUG dIdJ„ dJeNƒZVG dKdL„ dLeVƒZWedMd.�G dNdO„ dOe&e*ƒƒZXG dPdQ„ dQeXƒZYedRd.�G dSdT„ dTe*ƒƒZZedUd.�G dVdW„ dWe&e*ƒƒZ[G dXdY„ dYe)e'ƒZ\G dZd[„ d[e\ƒZ]ed\d.�G d]d^„ d^e*ƒƒZ^G d_d`„ d`e&e*ƒZ_G dadb„ dbeƒZ`G dcdd„ dde*ƒZaG dedf„ dfeaƒZbG dgdh„ dheaƒZcdS )ié    N)Údefaultdict©ÚDecimal)ÚEnum)Úchain©ÚNoneType)ÚUUID)ÚEmptyResultSetÚ
FieldErrorÚFullResultSet)ÚDatabaseErrorÚNotSupportedErrorÚ
connection)Úfields)Ú
LOOKUP_SEP)ÚQ)Údeconstructible)Úcached_propertyÚclassproperty)Úmake_hashable)Ú	signaturec                   @   ó   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#   úZ/var/www/html/django_cbt/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©r:   ÚMUL©r   r#   r#   r$   Ú__neg__L   ó   zCombinable.__neg__c                 C   ó   |   || jd¡S ©NF©r:   ÚADD©r   r7   r#   r#   r$   Ú__add__O   r@   zCombinable.__add__c                 C   rA   rB   ©r:   ÚSUBrE   r#   r#   r$   Ú__sub__R   r@   zCombinable.__sub__c                 C   rA   rB   r<   rE   r#   r#   r$   Ú__mul__U   r@   zCombinable.__mul__c                 C   rA   rB   ©r:   ÚDIVrE   r#   r#   r$   Ú__truediv__X   r@   zCombinable.__truediv__c                 C   rA   rB   ©r:   ÚMODrE   r#   r#   r$   Ú__mod__[   r@   zCombinable.__mod__c                 C   rA   rB   ©r:   ÚPOWrE   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   ÚNotImplementedErrorrE   r#   r#   r$   Ú__and__a   ó
   ÿzCombinable.__and__c                 C   rA   rB   )r:   ÚBITANDrE   r#   r#   r$   Úbitandh   r@   zCombinable.bitandc                 C   rA   rB   )r:   ÚBITLEFTSHIFTrE   r#   r#   r$   Úbitleftshiftk   r@   zCombinable.bitleftshiftc                 C   rA   rB   )r:   ÚBITRIGHTSHIFTrE   r#   r#   r$   Úbitrightshiftn   r@   zCombinable.bitrightshiftc                 C   s0   t | ddƒrt |ddƒrt| ƒt|ƒA S tdƒ‚rT   rW   rE   r#   r#   r$   Ú__xor__q   r[   zCombinable.__xor__c                 C   rA   rB   )r:   ÚBITXORrE   r#   r#   r$   Úbitxorx   r@   zCombinable.bitxorc                 C   s0   t | ddƒrt |ddƒrt| ƒt|ƒB S tdƒ‚rT   rW   rE   r#   r#   r$   Ú__or__{   r[   zCombinable.__or__c                 C   rA   rB   )r:   ÚBITORrE   r#   r#   r$   Úbitor‚   r@   zCombinable.bitorc                 C   rA   ©NTrC   rE   r#   r#   r$   Ú__radd__…   r@   zCombinable.__radd__c                 C   rA   rh   rG   rE   r#   r#   r$   Ú__rsub__ˆ   r@   zCombinable.__rsub__c                 C   rA   rh   r<   rE   r#   r#   r$   Ú__rmul__‹   r@   zCombinable.__rmul__c                 C   rA   rh   rK   rE   r#   r#   r$   Ú__rtruediv__Ž   r@   zCombinable.__rtruediv__c                 C   rA   rh   rN   rE   r#   r#   r$   Ú__rmod__‘   r@   zCombinable.__rmod__c                 C   rA   rh   rQ   rE   r#   r#   r$   Ú__rpow__”   r@   zCombinable.__rpow__c                 C   ó   t dƒ‚©NrV   ©rY   rE   r#   r#   r$   Ú__rand__—   ó   ÿzCombinable.__rand__c                 C   ro   rp   rq   rE   r#   r#   r$   Ú__ror__œ   rs   zCombinable.__ror__c                 C   ro   rp   rq   rE   r#   r#   r$   Ú__rxor__¡   rs   zCombinable.__rxor__c                 C   s   t | ƒS ©N)ÚNegatedExpressionr>   r#   r#   r$   Ú
__invert__¦   ó   zCombinable.__invert__N))r&   r'   r(   r)   rD   rH   r=   rL   rR   rO   r\   rf   r^   r`   rc   r:   r?   rF   rI   rJ   rM   rP   rS   rZ   r]   r_   ra   rb   rd   re   rg   ri   rj   rk   rl   rm   rn   rr   rt   ru   rx   r#   r#   r#   r$   r*   &   sN    r*   c                   @   s   e Zd ZdS )ÚOutputFieldIsNoneErrorN)r&   r'   r(   r#   r#   r#   r$   rz   ª   s    rz   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 rv   ©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 rv   )r   Ú_convert_value_noopr   Úget_db_converters©r   r   r#   r#   r$   r‡   Ê   s
   ÿ
üz BaseExpression.get_db_convertersc                 C   ó   g S rv   r#   r>   r#   r#   r$   Úget_source_expressionsÑ   ó   z%BaseExpression.get_source_expressionsc                 C   s   |rJ ‚d S rv   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 ©r3   )r4   Ú
isinstanceÚstrÚFr5   ©Ú.0Úargr#   r#   r$   Ú
<listcomp>Ø   s    ýÿüz5BaseExpression._parse_expressions.<locals>.<listcomp>r#   )r   Úexpressionsr#   r#   r$   Ú_parse_expressions×   s   úz!BaseExpression._parse_expressionsc                 C   ro   )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()rq   ©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 rv   )Ú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œ   rv   )Ú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œ   rv   )Ú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)rX   Ú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 rv   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 rv   )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$   r3     s   úÿÿ
z!BaseExpression.resolve_expressionc                 C   s   t | jtjƒS rv   )r‘   r   r   ÚBooleanFieldr>   r#   r#   r$   rU   <  s   zBaseExpression.conditionalc                 C   ó   | j S rv   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_fieldrz   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   rz   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 rv   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 rv   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 rv   )ÚfloatrÂ   r#   r#   r$   Ú<lambda>…  ó   z.BaseExpression.convert_value.<locals>.<lambda>ÚIntegerFieldc                 S   rÇ   rv   )ÚintrÂ   r#   r#   r$   rÉ   ‰  rÊ   r   c                 S   rÇ   rv   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 rv   )r   Ú
get_lookup)r   Úlookupr#   r#   r$   rÐ   ’  r�   zBaseExpression.get_lookupc                 C   rÏ   rv   )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 rv   )Úrelabeled_clone©r•   Úe©Ú
change_mapr#   r$   r—   ›  ó    ÿÿ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 | ]}|d u r
d n|  ˆ ¡‘qS rv   )Úreplace_expressionsrž   ©Úreplacementsr#   r$   r—   «  rÛ   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 rv   )ÚsetrŠ   Úget_refs)r   ÚrefsrŸ   r#   r#   r$   rä   ²  s   zBaseExpression.get_refsc                 C   ó
   t   | ¡S rv   ©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 rv   )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 rv   ©Ú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Á   rv   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Š   r4   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)r4   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.)rX   rŠ   r´   )r   rÄ   rØ   r#   r#   r$   Úget_expression_for_validationö  s   úÿý€ÿz,BaseExpression.get_expression_for_validationrv   ©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©   r3   ÚpropertyrU   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$   r{   ®   sn    






ÿ%


	




	r{   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   ó
   t | jƒS rv   )r   r~   ©Ú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 rv   )Ú	_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 rv   )Ú_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 rv   )r‘   r  r  r(  rE   r#   r#   r$   Ú__eq__*  s   
zExpression.__eq__c                 C   r  rv   )Ú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•   r8   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 rv   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&  )Úlhsr8   Ú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)r8   Ú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 )r6   Nc                    s$   t ƒ j|d� || _|| _|| _d S ©Nr|   )Úsuperr~   r8   r7  r8  )r   r7  r8   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  r8   r8  r>   r#   r#   r$   Ú__str__Ü  rÊ   zCombinedExpression.__str__c                 C   ó   | j | jgS rv   ©r7  r8  r>   r#   r#   r$   rŠ   ß  r�   z)CombinedExpression.get_source_expressionsc                 C   ó   |\| _ | _d S rv   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  r8   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_expressionr8   ©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  r3   r‘   ÚDurationExpressionÚTemporalSubtractionr7  r   r   ÚAttributeErrorr   r8  r8   rH   )
r   r­   r«   r®   r¯   r¬   Úresolvedr<  r=  Údatetime_fieldsrE  r#   r$   r3     s8   ûÿÿÿz%CombinedExpression.resolve_expressionc                 C   ó   | j jo| jjS rv   )r7  r  r8  r>   r#   r#   r$   r  $  ó   z"CombinedExpression.allowed_defaultrv   r  )r&   r'   r(   r~   rH  rI  rŠ   rŽ   r¼   r   r3   r   r  Ú__classcell__r#   r#   rE  r$   r6   Ò  s    ÿ r6   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_expressionr8   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   r8   r*   r=   rL   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 rv   )rD  r~   rH   )r   r7  r8  rE  r#   r$   r~   _  ó   zTemporalSubtraction.__init__c                 C   s<   |j  | ¡ | | j¡}| | j¡}|j  | jj ¡ ||¡S rv   )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 rv   )Ú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&   rE   r#   r#   r$   Ú__contains__~  s   zF.__contains__NTc                 C   s   |  | j|||¡S rv   )Úresolve_refrÔ   ©r   r­   r«   r®   r¯   r¬   r#   r#   r$   r3   ƒ  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 rv   )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ò   rv   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 rv   )rµ   rÔ   rE   r#   r#   r$   r)  ¢  ó   zF.__eq__c                 C   r  rv   )r*  rÔ   r>   r#   r#   r$   r+  ¥  rè   z
F.__hash__c                 C   ræ   rv   rç   r>   r#   r#   r$   r�   ¨  rè   zF.copyr  )r&   r'   r(   r)   r  r~   rH  rs  ru  r3   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   ro   )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   ·  rs   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  r3   r¥   r   rÔ   r   Úpossibly_multivalued)r   r'  rö   ÚcolrE  r#   r$   r3   ½  s   ÿÿz#ResolvedOuterRef.resolve_expressionc                 C   rÁ   rv   r#   ©r   Úrelabelsr#   r#   r$   rÖ   Ê  r‹   z ResolvedOuterRef.relabeled_clonec                 C   r‰   rv   r#   r>   r#   r#   r$   rí   Í  r‹   z"ResolvedOuterRef.get_group_by_cols)r&   r'   r(   r)   r�   r¥   r   r3   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 rv   )r‘   rÔ   rµ   r~  r  r#   r#   r$   r3   Õ  s   
zOuterRef.resolve_expressionc                 C   rÁ   rv   r#   r‚  r#   r#   r$   rÖ   Ú  r‹   zOuterRef.relabeled_cloneN)r&   r'   r(   r�   r¥   r3   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 rv   )rv  rÔ   r‘   r†  r„  rµ   r3   r   Úslice_expressionr‡  rˆ  )r   r­   r«   r®   r¯   r¬   r\  rŸ   r#   r#   r$   r3     s   
ÿzSliced.resolve_expressionr  )r&   r'   r(   r)   r~   rH  r3   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 rv   ©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¹   rv   ©r·   r>   r#   r#   r$   rŠ   =  ó   zFunc.get_source_expressionsc                 C   s
   || _ d S rv   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
   rX   r  r5   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 rv   )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 rv   ©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 )r5   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_valuer4   r«  )r   r   r   r  r   r#   r#   r$   r   �  s   

zValue.as_sqlc                    s   t ƒ  |||||¡}||_|S rv   )rD  r3   r¬   ©r   r­   r«   r®   r¯   r¬   r¶   rE  r#   r$   r3   Ÿ  s   zValue.resolve_expressionc                 C   r‰   rv   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 rv   )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¹   rv   )rÃ   r>   r#   r#   r$   r  Á  r»   zValue.empty_result_set_valuerv   r  )r&   r'   r(   r)   r¬   r  r~   rH  r   r3   rí   r¼   r	  r  r`  r#   r#   rE  r$   r5   u  s    ÿr5   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 rv   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 rv   )r  r  Úall_parentsÚlocal_fieldsÚcolumnÚlowerr!   rv  rÔ   rD  r3   )r   r­   r«   r®   r¯   r¬   ÚparentÚparent_fieldrE  r#   r$   r3   Ø  s   
ÿü€
ÿzRawSQL.resolve_expressionrv   r  )
r&   r'   r(   r  r~   rH  r   rí   r3   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   í  ry   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 rv   ©rD  r~   rÄ   ©r   rÄ   r   rE  r#   r$   r~   ö  s   
zDatabaseDefault.__init__c                 C   ó   | j gS rv   ©rÄ   r>   r#   r#   r$   rŠ   ú  ry   z&DatabaseDefault.get_source_expressionsc                 C   ó   |\| _ d S rv   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Ä   r3   rÄ  r½   )r   r­   r«   r®   r¯   r¬   Úresolved_expressionr#   r#   r$   r3      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_sqlrv   r  )
r&   r'   r(   r)   r~   rŠ   rŽ   r3   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 rv   )rÎ  rµ   rá   rÏ  r   r‚  r#   r#   r$   rÖ   -  s
   
ÿzCol.relabeled_clonec                 C   r¼  rv   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 rv   )rÏ  r   r‡   rˆ   r#   r#   r$   r‡   7  s   ÿ
þzCol.get_db_convertersrv   )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  rv   )r’  rÓ  r>   r#   r#   r$   Ú__len__F  rè   zColPairs.__len__c                 C   s   t |  ¡ ƒS rv   )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 rv   )rÖ  r>   r#   r#   r$   rŠ   X  ry   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 rv   )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 rv   )rµ   rá   rÎ  rÓ  rÔ  rº   r‚  r#   r#   r$   rÖ   l  s   ÿzColPairs.relabeled_clonec                 O   rÁ   rv   r#   r  r#   r#   r$   r3   q  r‹   zColPairs.resolve_expressionc                 C   s   ||fS rv   r#   rÿ   r#   r#   r$   rþ   t  ry   zColPairs.select_format)r&   r'   r(   r~   rÕ  r×  rH  rÖ  rŠ   rŽ   r   rÖ   r3   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 rv   )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Ç  rv   ©r¾   r>   r#   r#   r$   rŠ   …  ry   zRef.get_source_expressionsc                 C   rÉ  rv   rÝ  rŒ   r#   r#   r$   rŽ   ˆ  r�   zRef.set_source_expressionsNTFc                 C   rÁ   rv   r#   rw  r#   r#   r$   r3   ‹  s   zRef.resolve_expressionc                 C   s   | j hS rv   )rå   r>   r#   r#   r$   rä   ’  ry   zRef.get_refsc                 C   s   |   ¡ }| j |¡|_|S rv   )r�   r¾   rÖ   )r   rƒ  rÝ   r#   r#   r$   rÖ   •  s   zRef.relabeled_clonec                 C   s   |j  | j¡g fS rv   )rP  Ú
quote_namerå   rš   r#   r#   r$   r   š  rp  z
Ref.as_sqlc                 C   r¼  rv   r#   r>   r#   r#   r$   rí   �  rž  zRef.get_group_by_colsr  )r&   r'   r(   r)   r~   rH  rŠ   rŽ   r3   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”  rv   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 rv   )r   )r   r   r   r    r#   r#   r$   r%   ²  r©  zExpressionList.as_sqlitec                 C   ó$   g }|   ¡ D ]	}| | ¡ ¡ q|S rv   ©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Ç  rv   rÈ  r>   r#   r#   r$   rŠ   Û  ry   z(ExpressionWrapper.get_source_expressionsc                    s0   t | jtƒr| j ¡ }| j|_| ¡ S tƒ  ¡ S rv   )r‘   rÄ   r  r�   r   rí   rD  ©r   rÄ   rE  r#   r$   rí   Þ  s
   

z#ExpressionWrapper.get_group_by_colsc                 C   s   |  | j¡S rv   )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 rv   )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 )rw   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 rv   )rÄ   r�   r>   r#   r#   r$   rx   ø  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  r5   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 )NrU   Fz*Cannot negate non-conditional expressions.)rD  r3   rX   rÄ   rt  )r   r­   r«   r®   r¯   r¬   r\  rE  r#   r$   r3     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~   rx   r   r3   rþ   r`  r#   r#   rE  r$   rw   ò  s    ÿ
rw   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 )NrU   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   rX   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  rv   r÷  r>   r#   r#   r$   rŠ   B  r�   zWhen.get_source_expressionsc                 C   rL  rv   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  r3   rô  r¯  rE  r#   r$   r3   H  s   
ÿzWhen.resolve_expressionc                 C   s
   | j jgS rv   )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á  rv   râ  rî   r#   r#   r$   rí   f  s   zWhen.get_group_by_colsc                 C   r^  rv   )rô  r  r9  r>   r#   r#   r$   r  m  r_  zWhen.allowed_default©NNr  rv   )r&   r'   r(   r   rU   r~   rI  rH  rŠ   rŽ   r3   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°   rv   )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”  rv   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 rv   ©r  r  r>   r#   r#   r$   rŠ   ”  rê  zCase.get_source_expressionsc                 C   s   |�^ | _ | _d S rv   r  rŒ   r#   r#   r$   rŽ   —  rp  zCase.set_source_expressionsc                    s   t ƒ  ¡ }|jd d … |_|S rv   )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 rv   )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¦  rv   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)rX   rÝ   r­   r¨   r“  rD  r~   )r   Úquerysetr   r“  rE  r#   r$   r~   ×  s   zSubquery.__init__c                 C   rÇ  rv   ©r­   r>   r#   r#   r$   rŠ   Þ  ry   zSubquery.get_source_expressionsc                 C   rè  ré  r  rŒ   r#   r#   r$   rŽ   á  rê  zSubquery.set_source_expressionsc                 C   rì  rv   )r­   r   r>   r#   r#   r$   r¼   ä  ry   zSubquery._resolve_output_fieldc                    s   t ƒ  ¡ }|j ¡ |_|S rv   )rD  r�   r­   rÝ   )r   rÝ   rE  r#   r$   r�   ç  r…   zSubquery.copyc                 C   rì  rv   )r­   Úexternal_aliasesr>   r#   r#   r$   r  ì  rí  zSubquery.external_aliasesc                 C   rî  rv   )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_colsrv   )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 rv   )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  r5   )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.r3   z%expression must be an expression type)r´   Únulls_firstÚ
nulls_lastrú   r4   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Ç  rv   rÈ  r>   r#   r#   r$   rŠ   7  ry   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á  rv   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 rh   )rú   r  r  r>   r#   r#   r$   rü   u  s   
ýzOrderBy.reverse_orderingc                 C   ó
   d| _ d S rB   ræ  r>   r#   r#   r$   r÷     rè   zOrderBy.ascc                 C   r&  rh   ræ  r>   r#   r#   r$   rû   ‚  rè   zOrderBy.desc)FNNrv   )r&   r'   r(   r   rU   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ÚframerX   r´   rµ   r&   r‘   r  r4  rß  rå  r{   r’   rD  r~   r™   Úsource_expression)r   rÄ   r(  r)  r*  r   rE  r#   r$   r~   Ž  s.   ÿÿ


ÿzWindow.__init__c                 C   rì  rv   )r+  r   r>   r#   r#   r$   r¼   ²  ry   zWindow._resolve_output_fieldc                 C   s   | j | j| j| jgS rv   ©r+  r(  r)  r*  r>   r#   r#   r$   rŠ   µ  rÊ   zWindow.get_source_expressionsc                 C   s   |\| _ | _| _| _d S rv   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 rv   )r(  rì   rí   r)  )r   rã  r#   r#   r$   rí   ñ  s   
zWindow.get_group_by_cols)NNNNrv   )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.)
r5   r‡  Úendr‘   r   r8  rt  rµ   r(   Ú	exclusion)r   r‡  r?  r@  r#   r#   r$   r~     s   

ÿ
zWindowFrame.__init__c                 C   rL  rv   ©r‡  r?  rŒ   r#   r#   r$   rŽ     r@   z"WindowFrame.set_source_expressionsc                 C   rJ  rv   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‰   rv   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   ro   )Nz3Subclasses must implement window_frame_start_end().rq   ©r   r   r‡  r?  r#   r#   r$   rF  W  ry   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 rv   )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  rv   )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  )dr�   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   Údjango.utils.inspectr   r   r*   rz   r{   r  rD   r=   rL   rO   rR   rH   r\   rf   r^   r`   rc   rV  rU  rX  rW  Ú_connector_combinationsr4  r6  r:  Údr  r8   Úfield_typesr7  r8  r9  r-  rB  r6   rY  rZ  r“   r~  r„  rq  r�  r5   r¹  rÃ  rÄ  rÍ  r±   rÜ  rß  rå  rç  rw   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