o
    (S-gu ã                   @   s4  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ƒZ'eG dd„ de'e&ƒƒZ(dd„ e&j)e&j*e&j+e&j,e&j-fD ƒdd„ e&j)e&j.e&j*e&j+e&j,e&j-fD ƒdd„ e&j)e&j.e&j*e&j+e&j,fD ƒdd„ e&j/e&j0e&j1e&j2e&j3fD ƒdd„ e&j)e&j.e&j*e&j+e&j,e&j-fD ƒe&j)ej4ej5ej6fej6ej5ej6fej5ej4ej6fej5ej6ej6fej5ej5ej5fej7ej5ej7fej5ej7ej7fgie&j.ej4ej5ej6fej6ej5ej6fej4ej4ej5fej4ej6ej5fej6ej4ej5fej6ej6ej5fej5ej5ej5fej7ej5ej7fej7ej7ej5fg	igZ8ee9ƒZ:dd„ Z;e8D ]Z<e< =¡ D ]\Z>Z?e?D ]\Z@ZAZBe;e@e>eAeBƒ �qr�ql�qfejCd d!�d"d#„ ƒZDG d$d%„ d%e%e(ƒZEG d&d'„ d'eEƒZFG d(d)„ d)eEƒZGed*d+�G d,d-„ d-e&ƒƒZHG d.d/„ d/eHƒZIG d0d1„ d1eHƒZJG d2d3„ d3eHƒZKed4d+�G d5d6„ d6e%e(ƒƒZLed7d+�G d8d9„ d9e%e(ƒƒZMG d:d;„ d;e(ƒZNG d<d=„ d=e(ƒZOG d>d?„ d?e(ƒZPG d@dA„ dAe(ƒZQG dBdC„ dCe(ƒZRG dDdE„ dEeLƒZSG dFdG„ dGeSƒZTedHd+�G dIdJ„ dJe%e(ƒƒZUG dKdL„ dLeUƒZVedMd+�G dNdO„ dOe(ƒƒZWedPd+�G dQdR„ dRe%e(ƒƒZXG dSdT„ dTe'e&ƒZYG dUdV„ dVeYƒZZedWd+�G dXdY„ dYe(ƒƒZ[G dZd[„ d[e%e(ƒZ\G d\d]„ d]e	ƒZ]G d^d_„ d_e(ƒZ^G d`da„ dae^ƒZ_G dbdc„ dce^ƒZ`dS )dé    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/map_library/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                   @   sj  e Zd ZdZe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„ Z/dGdH„ Z0d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                    s4   |   ¡ }ˆ|_| ‡ ‡‡‡fdd„| ¡ D ƒ¡ |S )a
  
        Provide the chance to do any preprocessing or validation before being
        added to the query.

        Arguments:
         * query: the backend query implementation
         * allow_joins: boolean allowing or denying use of joins
           in this query
         * reuse: a set of reusable joins for multijoins
         * summarize: a terminal aggregate clause
         * for_save: whether this expression about to be used in a save or update

        Return: an Expression to be added to the query.
        c                    s$   g | ]}|r|  ˆˆ ˆˆ¡nd ‘qS ru   rŽ   rœ   ©Úallow_joinsÚqueryÚreuseÚ	summarizer"   r#   r•   $  s    ýÿüz5BaseExpression.resolve_expression.<locals>.<listcomp>)r   Ú
is_summaryrŒ   rˆ   ©r   rª   r©   r«   r¬   Úfor_saveÚcr"   r¨   r#   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   rz   r=   r"   r"   r#   Úfield3  ó   zBaseExpression.fieldc                 C   s"   |   ¡ }|du rd| _tdƒ‚|S )z+Return the output type of this expressions.NTz4Cannot resolve expression type, unknown output_field)Ú_resolve_output_fieldÚ_output_field_resolved_to_noner   r{   r"   r"   r#   r   7  s
   zBaseExpression.output_fieldc                 C   s&   z| j W S  ty   | js‚ Y dS w )z†
        Return the output field of this expression, or None if
        _resolve_output_field() didn't return an output type.
        N)r   r   r¶   r=   r"   r"   r#   Ú_output_field_or_none@  s   ÿÿz$BaseExpression._output_field_or_nonec                 C   sT   dd„ |   ¡ D ƒ}|D ]}|D ]}t||jƒs#td|jj|jjf ƒ‚q|  S dS )a}  
        Attempt to infer the output type of the expression.

        As a guess, if the output fields of all source fields match then simply
        infer the same type here.

        If a source's output field resolves to None, exclude it from this check.
        If all sources are None, then an error is raised higher up the stack in
        the output_field property.
        c                 s   s   � | ]	}|d ur|V  qd S ru   r"   )r“   Úsourcer"   r"   r#   rž   Z  s   € ÿz7BaseExpression._resolve_output_field.<locals>.<genexpr>zCExpression contains mixed types: %s, %s. You must set output_field.N)Úget_source_fieldsr�   Ú	__class__r   r%   )r   Úsources_iterr   r¸   r"   r"   r#   rµ   L  s    ÿþþÿÿ	õz$BaseExpression._resolve_output_fieldc                 C   ó   | S ru   r"   ©ÚvalueÚ
expressionr   r"   r"   r#   r„   j  ó   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>x  ó   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}   n  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Ú   ÚreplacementÚsource_expressionsr×   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   s   g | ]}|j ‘qS r"   )r·   rÒ   r"   r"   r#   r•   È  s    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ˆ   Ú
ValueError)r   r¿   rÓ   r"   r"   r#   Úget_expression_for_validationé  s   úÿý€ÿz,BaseExpression.get_expression_for_validationru   ©NTNFF)1r%   r&   r'   r(   ÚNotImplementedÚempty_result_set_valuer­   r¶   Ú
filterableÚwindow_compatibleÚallowed_defaultrù   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#   ry   ª   sl    






ÿ






	ry   c                   @   sD   e Zd ZdZeejdd�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                 C   sª   | j \}}| jj| g|¢R i |¤Ž}| ¡  t|j ¡ ƒ}t|ƒ | jg}|D ])\}}t	|t
jƒrE|jr@|jr@|jjj|jf}n	t|ƒ}nt|ƒ}| ||f¡ q't|ƒS ru   )Ú_constructor_argsr  Úbind_partialÚapply_defaultsÚiterÚ	argumentsÚitemsÚnextrº   r�   r   ÚFieldrÏ   ÚmodelÚ_metaÚlabelÚtyper   ÚappendÚtuple)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  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    ùýÿÿr%  c                 C   s<   i | ]}|t jt jt jft jt jt jft jt jt jfg“qS r"   )r   rÆ   rÁ   r   r$  r"   r"   r#   r%  9  s    ûýÿc              	   C   sJ   i | ]!}|t jt jt jft jt jt jft jt jt jft jt jt jfg“qS r"   )r   rÆ   r   rÁ   r$  r"   r"   r#   r%  K  s    úüÿc                 C   r"  r"   )r   rÆ   r$  r"   r"   r#   r%  [  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ž   j  s
   € ÿ
ÿz<dictcomp>.<genexpr>)Úlistr   Úfrom_iterabler   rÆ   r   rÁ   r$  r"   r"   r#   r%  h  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"   )r)  rÛ   Ú
issubclass)r7   Úlhs_typeÚrhs_typeÚcombinatorsÚcombinator_lhs_typeÚcombinator_rhs_typeÚcombined_typer"   r"   r#   Ú_resolve_combined_type²  s   ÿ€ür5  c                       sf   e Zd Zd‡ fdd„	Zdd„ Zdd„ Zdd	„ Zd
d„ Zdd„ Zdd„ Z		ddd„Z
edd„ ƒZ‡  ZS )r5   Nc                    s$   t ƒ j|d� || _|| _|| _d S ©Nrz   )Úsuperr|   r7   r*  r+  )r   r*  r7   r+  r   ©rº   r"   r#   r|   ½  s   
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{} {} {})r9  r*  r7   r+  r=   r"   r"   r#   Ú__str__Æ  rÅ   zCombinedExpression.__str__c                 C   ó   | j | jgS ru   ©r*  r+  r=   r"   r"   r#   rˆ   É  r�   z)CombinedExpression.get_source_expressionsc                 C   ó   |\| _ | _d S ru   r=  rŠ   r"   r"   r#   rŒ   Ì  r?   z)CombinedExpression.set_source_expressionsc                 C   sZ   t | jt| jjƒt| jjƒƒ}|d u r*td| j›d| jjjj	› d| jjjj	› d�ƒ‚|ƒ S )NzCannot infer type of z# expression involving these types: ú, z. You must set output_field.)
r5  r7   r  r*  r·   r+  r   r   rº   r%   )r   r4  r"   r"   r#   rµ   Ï  s   

ý

ÿ
þÿz(CombinedExpression._resolve_output_fieldc                 C   sp   g }g }|  | j¡\}}| |¡ | |¡ |  | j¡\}}| |¡ | |¡ d}|j | j|¡}|| |fS ©Nz(%s))Úcompiler*  r  rç   r+  ÚopsÚcombine_expressionr7   ©r   r   r   r–   Úexpression_paramsr    r!   Úexpression_wrapperr"   r"   r#   r   à  s   



zCombinedExpression.as_sqlTFc              	   C   s  | j  |||||¡}| j |||||¡}t| ttfƒsz|j ¡ }W n tt	fy/   d }Y nw z|j ¡ }	W n tt	fyD   d }	Y nw d||	hv r_||	kr_t| j | j
| jƒ |||||¡S h d£}
| j
| jkr||
v r||	krt| j | jƒ |||||¡S |  ¡ }||_||_ ||_|S )NÚDurationField>   Ú	DateFieldÚ	TimeFieldÚDateTimeField)r*  r2   r+  r�   ÚDurationExpressionÚTemporalSubtractionr   r   ÚAttributeErrorr   r7   rG   r   r­   )r   rª   r©   r«   r¬   r¯   r*  r+  r/  r0  Údatetime_fieldsr°   r"   r"   r#   r2   î  sZ   
ÿ
ÿÿÿÿûþ	ûz%CombinedExpression.resolve_expressionc                 C   ó   | j jo| jjS ru   )r*  r  r+  r=   r"   r"   r#   r    ó   z"CombinedExpression.allowed_defaultru   rü   )r%   r&   r'   r|   r:  r;  rˆ   rŒ   rµ   r   r2   r   r  Ú__classcell__r"   r"   r8  r#   r5   ¼  s    
ÿ/r5   c                       s,   e Zd Zdd„ Z‡ fdd„Zdd„ Z‡  ZS )rK  c                 C   sR   z|j }W n	 ty   Y nw | ¡ dkr$| |¡\}}|j |¡|fS | |¡S )NrG  )r   r   r   rA  rB  Úformat_for_duration_arithmetic)r   Úsider   r   Úoutputr    r!   r"   r"   r#   rA  #  s   
ÿ
zDurationExpression.compilec                    sš   |j jrtƒ  ||¡S |j | ¡ g }g }|  | j||¡\}}| |¡ | 	|¡ |  | j
||¡\}}| |¡ | 	|¡ d}|j | j|¡}|| |fS r@  )ÚfeaturesÚhas_native_duration_fieldr7  r   rB  Úcheck_expression_supportrA  r*  r  rç   r+  Úcombine_duration_expressionr7   rD  r8  r"   r#   r   .  s   



zDurationExpression.as_sqlc           	   	   K   s–   | j ||fi |¤Ž\}}| jtjtjhv rGz| jj ¡ }| jj ¡ }W n t	t
fy1   Y ||fS w h d£}||vs>||vrGtd| j› d�ƒ‚||fS )N>   rÁ   r   rÆ   rG  zInvalid arguments for operator Ú.)r   r7   r)   r<   rK   r*  r   r   r+  rM  r   r   )	r   r   r   r   r    r!   r/  r0  Úallowed_fieldsr"   r"   r#   r$   ?  s   óÿzDurationExpression.as_sqlite)r%   r&   r'   rA  r   r$   rQ  r"   r"   r8  r#   rK  "  s    rK  c                       s,   e Zd Ze ¡ Z‡ fdd„Zdd„ Z‡  ZS )rL  c                    s   t ƒ  || j|¡ d S ru   )r7  r|   rG   )r   r*  r+  r8  r"   r#   r|   X  ó   zTemporalSubtraction.__init__c                 C   s<   |j  | ¡ | | j¡}| | j¡}|j  | jj ¡ ||¡S ru   )rB  rW  rA  r*  r+  Úsubtract_temporalsr   r   )r   r   r   r*  r+  r"   r"   r#   r   [  s   ÿzTemporalSubtraction.as_sql)	r%   r&   r'   r   rG  r   r|   r   rQ  r"   r"   r8  r#   rL  U  s    rL  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|   j  s   
z
F.__init__c                 C   ó   d  | jj| j¡S ©Nú{}({}))r9  rº   r%   rÏ   r=   r"   r"   r#   r:  q  ó   z
F.__repr__c                 C   s
   t | |ƒS ru   )ÚSliced)r   Ú	subscriptr"   r"   r#   Ú__getitem__t  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__w  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   |  | | ¡S ru   )rÛ   )r   rÚ   r"   r"   r#   rØ   �  r�   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|   r:  rd  rf  r2   rØ   rð   rô   r  r  r   r"   r"   r"   r#   r‘   d  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: rY  )r7  r2   r£   r   rÏ   r   Úpossibly_multivalued)r   r  rï   Úcolr8  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è   rQ  r"   r"   r8  r#   rj  ”  s    rj  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º   rj  rk  r"   r"   r#   r2   ½  s   
zOuterRef.resolve_expressionc                 C   r¼   ru   r"   rn  r"   r"   r#   rÑ   Â  r‰   zOuterRef.relabeled_cloneN)r%   r&   r'   r›   r£   r2   rÑ   r"   r"   r"   r#   rp  ¹  s
    rp  c                       s<   e Zd ZdZ‡ fdd„Zdd„ Z					dd	d
„Z‡  ZS )rb  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.)r7  r|   rÏ   Úobjr�   rÇ   rú   ÚstartÚlengthÚsliceÚstopÚstepre  )r   rr  rc  r8  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 )Nrq  ú(r?  ú))rs  rt  ru  rº   r'   rr  )r   rs  rv  rc  r"   r"   r#   r:  ç  s   

zSliced.__repr__NTFc                 C   sR   |  | j|||¡}t| jt| jfƒr| j |||||¡}n|}|j || j	| j
¡S ru   )rg  rÏ   r�   rr  rp  rº   r2   r   Úslice_expressionrs  rt  )r   rª   r©   r«   r¬   r¯   Úresolvedr�   r"   r"   r#   r2   í  s   
ÿzSliced.resolve_expressionrü   )r%   r&   r'   r(   r|   r:  r2   rQ  r"   r"   r8  r#   rb  Æ  s    úrb  zdjango.db.models.Funcc                       sŠ   e Zd ZdZdZdZdZdZddœ‡ fdd„
Zdd	„ Z	d
d„ Z
dd„ Zdd„ Z	ddd„Z			ddd„Z‡ fdd„Zedd„ ƒZ‡  ZS )ÚFunczAn SQL function call.Nz%(function)s(%(expressions)s)r?  rz   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)rq  Úargumentr  rz   )
ÚarityÚlenre  rº   r%   r7  r|   r—   rÝ   Úextra)r   r   r–   r€  r8  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ž     ó   € z Func.__repr__.<locals>.<genexpr>r?  c                 s   s(   � | ]\}}t |ƒd  t |ƒ V  qdS )ú=Nr‚  )r“   ÚkeyÚvalr"   r"   r#   rž     s   € 
ÿú
{}({}, {})r`  )
Ú
arg_joinerÚjoinrÝ   r€  Ú_get_repr_optionsÚsortedr  r9  rº   r%   )r   r  r€  r"   r"   r#   r:    s   

ÿzFunc.__repr__c                 C   s   i S )zAReturn a dict of extra __init__() options to include in the repr.r"   r=   r"   r"   r#   rŠ  !  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_expressionsTFc           	      C   s>   |   ¡ }||_t|jƒD ]\}}| |||||¡|j|< q|S ru   )r   r­   Ú	enumeraterÝ   r2   )	r   rª   r©   r«   r¬   r¯   r°   Úposr”   r"   r"   r#   r2   +  s   
ÿzFunc.resolve_expressionc              	   K   s  |j  | ¡ g }g }| jD ]D}	z	| |	¡\}
}W n. ty5   t|	dtƒ}|tu r*‚ | t|ƒ¡\}
}Y n tyF   | tdƒ¡\}
}Y nw | 	|
¡ | 
|¡ qi | j¥|¥}|d urb||d< n| d| j¡ |pq| d| j¡}|pz| d| j¡}| |¡ |d< |d< || |fS )Nrþ   TÚfunctionÚtemplaterˆ  r–   r³   )rB  rW  rÝ   rA  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   6  s4   	
ÿÿ

zFunc.as_sqlc                    s*   t ƒ  ¡ }| jd d … |_| j ¡ |_|S ru   )r7  r   rÝ   r€  )r   r   r8  r"   r#   r   ]  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ž   e  s   € z'Func.allowed_default.<locals>.<genexpr>)ÚallrÝ   r=   r"   r"   r#   r  c  ó   zFunc.allowed_defaultrü   ©NNN)r%   r&   r'   r(   r�  r‘  rˆ  r~  r|   r:  rŠ  rˆ   rŒ   r2   r   r   r   r  rQ  r"   r"   r8  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().
        rz   N)r7  r|   r¾   )r   r¾   r   r8  r"   r#   r|   q  s   	
zValue.__init__c                 C   s   | j j› d| j›d�S )Nrx  ry  )rº   r%   r¾   r=   r"   r"   r#   r:  }  r[  zValue.__repr__c                 C   s|   |j  | ¡ | j}| j}|d ur1| jr|j||d�}n|j||d�}t|dƒr1| |||¡|gfS |d u r9dg fS d|gfS )N)r   Úget_placeholderÚNULLz%s)	rB  rW  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   )r7  r2   r¯   r®   r8  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Á   ÚdatetimerJ  ÚdaterH  ÚtimerI  Ú	timedeltarG  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|   r:  r   r2   rè   rµ   r  rþ   rQ  r"   r"   r8  r#   r4   h  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 r6  )r   r  r    r!   r7  r|   )r   r    r!   r   r8  r"   r#   r|   ¼  s   zRawSQL.__init__c                 C   ó   d  | jj| j| j¡S ©Nr‡  )r9  rº   r%   r    r!   r=   r"   r"   r#   r:  Â  r[  zRawSQL.__repr__c                 C   s   d| j  | jfS r@  )r    r!   r˜   r"   r"   r#   r   Å  r?   zRawSQL.as_sqlc                 C   ó   | gS 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    rg  rÏ   r7  r2   )r   rª   r©   r«   r¬   r¯   ÚparentÚparent_fieldr8  r"   r#   r2   Ë  s   
ÿü€
ÿzRawSQL.resolve_expressionru   rü   )
r%   r&   r'   r  r|   r:  r   rè   r2   rQ  r"   r"   r8  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#   r:  Ý  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'   r:  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   ©r7  r|   r¿   ©r   r¿   r   r8  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¯   rz   )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)rU  Ú"supports_default_keyword_in_insertrA  r¿   r˜   r"   r"   r#   r     s   zDatabaseDefault.as_sqlru   rü   )
r%   r&   r'   r(   r|   rˆ   rŒ   r2   r   rQ  r"   r"   r8  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 r6  )r7  r|   ÚaliasÚtarget)r   r¾  r¿  r   r8  r"   r#   r|     s   zCol.__init__c                 C   s>   | j | j}}|r|t|ƒfnt|ƒf}d | jjd |¡¡S )Nr`  r?  )r¾  r¿  r�   r9  rº   r%   r‰  )r   r¾  r¿  Úidentifiersr"   r"   r#   r:    s   zCol.__repr__c                 C   s<   | j | jj}}|r||fn|f}d t|j|ƒ¡}|g fS ©NrY  )r¾  r¿  r¯  r‰  ÚmapÚquote_name_unless_alias)r   r   r   r¾  r¯  rÀ  r    r"   r"   r#   r     s   z
Col.as_sqlc                 C   s,   | j d u r| S |  | | j | j ¡| j| j¡S ru   )r¾  rº   rÛ   r¿  r   rn  r"   r"   r#   rÑ      s
   
ÿzCol.relabeled_clonec                 C   r¬  ru   r"   r=   r"   r"   r#   rè   '  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…   *  s   ÿ
þzCol.get_db_convertersru   )r%   r&   r'   r¤   rl  r|   r:  r   rÑ   rè   r…   rQ  r"   r"   r8  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   )r7  r|   rà   r¸   )r   rà   r¸   r8  r"   r#   r|   8  s   
zRef.__init__c                 C   rª  r«  )r9  rº   r%   rà   r¸   r=   r"   r"   r#   r:  <  r[  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Œ   B  r�   zRef.set_source_expressionsNTFc                 C   r¼   ru   r"   rh  r"   r"   r#   r2   E  s   zRef.resolve_expressionc                 C   s   | j hS ru   )rà   r=   r"   r"   r#   rß   L  rx   zRef.get_refsc                 C   s   |   ¡ }| j |¡|_|S ru   )r   r¸   rÑ   )r   ro  r×   r"   r"   r#   rÑ   O  s   zRef.relabeled_clonec                 C   s   |j  | j¡g fS ru   )rB  Ú
quote_namerà   r˜   r"   r"   r#   r   T  ra  z
Ref.as_sqlc                 C   r¬  ru   r"   r=   r"   r"   r#   rè   W  r�  zRef.get_group_by_colsrü   )r%   r&   r'   r(   r|   r:  rˆ   rŒ   r2   rß   rÑ   r   rè   rQ  r"   r"   r8  r#   rÄ  2  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ž   e  rƒ  z)ExpressionList.__str__.<locals>.<genexpr>)rˆ  r‰  rÝ   r=   r"   r"   r#   r;  d  ri  zExpressionList.__str__c                    s   | j sdS tƒ j|i |¤ŽS )N)Ú r"   )rÝ   r7  r   rk  r8  r"   r#   r   g  s   zExpressionList.as_sqlc                 K   s   | j ||fi |¤ŽS ru   )r   )r   r   r   r   r"   r"   r#   r$   l  rš  zExpressionList.as_sqlitec                 C   ó$   g }|   ¡ D ]	}| | ¡ ¡ q|S ru   ©rˆ   rç   rè   )r   Úgroup_by_colsr�   r"   r"   r#   rè   p  ó   z ExpressionList.get_group_by_cols)
r%   r&   r'   r(   r‘  r;  r   r$   rè   rQ  r"   r"   r8  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+   rq  NT©ró   )r�   r�   rí   r‘   rœ   r"   r"   r#   rž   |  s   € ýÿÿ
üz'OrderByList.__init__.<locals>.<genexpr>)r7  r|   )r   r–   r€  r8  r"   r#   r|   {  s   úzOrderByList.__init__)r%   r&   r'   r  r‘  r|   rQ  r"   r"   r8  r#   rÍ  w  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 r6  rµ  r¶  r8  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è   r7  ©r   r¿   r8  r"   r#   rè   ˜  s
   

z#ExpressionWrapper.get_group_by_colsc                 C   s   |  | j¡S ru   )rA  r¿   r˜   r"   r"   r#   r   ¡  r�   zExpressionWrapper.as_sqlc                 C   r^  r_  )r9  rº   r%   r¿   r=   r"   r"   r#   r:  ¤  ra  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   r:  r  r  rQ  r"   r"   r8  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 r6  )r7  r|   r   r±   rÓ  r8  r"   r#   r|   ¯  ri  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 )r7  r   r
   r   rU  Ú&supports_boolean_expr_in_select_clauserA  r4   rB  Ú0conditional_expression_supported_in_where_clauser¿   )r   r   r   r    r!   rU  rB  r8  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.)r7  r2   rW   r¿   re  )r   rª   r©   r«   r¬   r¯   r{  r8  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   rB  rØ  rU  r×  r¿   r9  )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÷   rQ  r"   r"   r8  r#   rv   ¬  s    ÿ
rv   zdjango.db.models.Whenc                       sx   e Zd ZdZdZd‡ fdd„	Zdd„ Zdd	„ Zd
d„ Zdd„ Z	dd„ Z
	ddd„Zddd„Zdd„ Zedd„ ƒZ‡  ZS )ÚWhenz"WHEN %(condition)s THEN %(result)sFNc                    s¢   |r"|d u rt di |¤Žd }}nt|ddƒr"t |fi |¤Žd }}|d u s.t|ddƒr.|r2tdƒ‚t|t ƒr=|s=tdƒ‚tƒ jd d� || _|  |¡d | _	d S )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.rz   r   r"   )
r   rW   re  r�   rú   r7  r|   Ú	conditionr—   r,  )r   rÜ  ÚthenÚlookupsr8  r"   r#   r|   å  s   ÿzWhen.__init__c                 C   s   d| j | jf S )NzWHEN %r THEN %r©rÜ  r,  r=   r"   r"   r#   r;  ö  r?   zWhen.__str__c                 C   ó   d| j j| f S ©Nz<%s: %s>©rº   r%   r=   r"   r"   r#   r:  ù  r?   zWhen.__repr__c                 C   r<  ru   rß  r=   r"   r"   r#   rˆ   ü  r�   zWhen.get_source_expressionsc                 C   r>  ru   rß  rŠ   r"   r"   r#   rŒ   ÿ  r?   zWhen.set_source_expressionsc                 C   s
   | j jgS ru   )r,  r·   r=   r"   r"   r#   r¹     s   
zWhen.get_source_fieldsTc                 C   sJ   |   ¡ }||_t|jdƒr|j ||||d¡|_|j |||||¡|_|S )Nr2   F)r   r­   r3   rÜ  r2   r,  r®   r"   r"   r#   r2     s   
ÿ
ÿzWhen.resolve_expressionc                 K   sh   |j  | ¡ |}g }| | j¡\}}||d< | | j¡\}	}
|	|d< |p&| j}|| g |¢|¢|
¢R fS )NrÜ  r,  )rB  rW  rA  rÜ  r,  r‘  )r   r   r   r‘  r   Útemplate_paramsÚ
sql_paramsÚcondition_sqlÚcondition_paramsÚ
result_sqlÚresult_paramsr"   r"   r#   r     s   
ÿþýzWhen.as_sqlc                 C   rÉ  ru   rÊ  ré   r"   r"   r#   rè   #  s   zWhen.get_group_by_colsc                 C   rO  ru   )rÜ  r  r,  r=   r"   r"   r#   r  *  rP  zWhen.allowed_default©NNrü   ru   )r%   r&   r'   r‘  rT   r|   r;  r:  rˆ   rŒ   r¹   r2   r   rè   r   r  rQ  r"   r"   r8  r#   rÛ  ß  s    
ÿ
rÛ  zdjango.db.models.Casec                       sŒ   e Zd ZdZdZdZdddœ‡ fdd„
Zdd	„ Zd
d„ Zdd„ Z	dd„ Z
	ddd„Z‡ fdd„Z	ddd„Z‡ fdd„Zedd„ ƒZ‡  ZS )ÚCasezÊ
    An SQL searched CASE expression:

        CASE
            WHEN n > 0
                THEN 'positive'
            WHEN n < 0
                THEN 'negative'
            ELSE 'zero'
        END
    z#CASE %(cases)s ELSE %(default)s ENDú N)Údefaultr   c                   sJ   t dd„ |D ƒƒstdƒ‚tƒ  |¡ t|ƒ| _|  |¡d | _|| _d S )Nc                 s   s   � | ]}t |tƒV  qd S ru   )r�   rÛ  )r“   Úcaser"   r"   r#   rž   A  s   € z Case.__init__.<locals>.<genexpr>z.Positional arguments must all be When objects.r   )	r™  re  r7  r|   r'  Úcasesr—   rì  r€  )r   rì  r   rî  r€  r8  r"   r#   r|   @  s   

zCase.__init__c                 C   s    dd  dd„ | jD ƒ¡| jf S )NzCASE %s, ELSE %rr?  c                 s   r�  ru   r‚  )r“   r°   r"   r"   r#   rž   J  rƒ  zCase.__str__.<locals>.<genexpr>)r‰  rî  rì  r=   r"   r"   r#   r;  H  s   þzCase.__str__c                 C   rà  rá  râ  r=   r"   r"   r#   r:  N  r?   zCase.__repr__c                 C   s   | j | jg S ru   ©rî  rì  r=   r"   r"   r#   rˆ   Q  rÒ  zCase.get_source_expressionsc                 C   s   |�^ | _ | _d S ru   rï  rŠ   r"   r"   r#   rŒ   T  ra  zCase.set_source_expressionsTFc           	      C   sT   |   ¡ }||_t|jƒD ]\}}| |||||¡|j|< q|j |||||¡|_|S ru   )r   r­   rŽ  rî  r2   rì  )	r   rª   r©   r«   r¬   r¯   r°   r�  rí  r"   r"   r#   r2   W  s   
ÿ
ÿzCase.resolve_expressionc                    s   t ƒ  ¡ }|jd d … |_|S ru   )r7  r   rî  )r   r°   r8  r"   r#   r   e  s   
z	Case.copyc              	   K   s   |j  | ¡ | js| | j¡S i | j¥|¥}g }g }| | j¡\}	}
| jD ]0}z	| |¡\}}W n ty9   Y q% tyJ   | |j¡\}	}
Y  nw | 	|¡ | 
|¡ q%|s\|	|
fS |p`| j}| |¡|d< |	|d< | 
|
¡ |py| d| j¡}|| }| jd urŒ|j  | j¡| }||fS )Nrî  rì  r‘  )rB  rW  rî  rA  rì  r€  r
   r   r,  r  rç   Úcase_joinerr‰  rÛ   r‘  r·   Úunification_cast_sqlr   )r   r   r   r‘  rð  r   rã  Ú
case_partsrä  Údefault_sqlÚdefault_paramsrí  Úcase_sqlÚcase_paramsr    r"   r"   r#   r   j  s:   
þ



zCase.as_sqlc                    s   | j s| j ¡ S tƒ  ¡ S ru   )rî  rì  rè   r7  r=   r8  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ð  r|   r;  r:  rˆ   rŒ   r2   r   r   rè   r   r  rQ  r"   r"   r8  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€  r7  r|   )r   Úquerysetr   r€  r8  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   )r7  r   rª   r×   )r   r×   r8  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 )Nrq  r:   r¦   r‘  )rB  rW  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è   rQ  r"   r"   r8  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   )r7  r|   rª   Úexists)r   rù  rï   r8  r"   r#   r|   Ð  s   zExists.__init__c                 C   s   |j jjs
d |¡}||fS rÙ  )r   rU  r×  r9  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)r7  r   r
   r   rU  r×  rA  r4   )r   r   r  rï   rU  r8  r"   r#   r   Ü  s   üzExists.as_sql)r%   r&   r'   r‘  r   r±   r   rþ   r|   r÷   r   rQ  r"   r"   r8  r#   rÿ  Ë  s    rÿ  zdjango.db.models.OrderByc                   @   sl   e 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)sFNc                 C   sV   |r|rt dƒ‚|du s|du rt dƒ‚|| _|| _|| _t|dƒs&t dƒ‚|| _d S )Nz1nulls_first and nulls_last are mutually exclusiveFz7nulls_first and nulls_last values must be True or None.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={}))r9  rº   r%   r¿   ró   r=   r"   r"   r#   r:  ø  s   ÿzOrderBy.__repr__c                 C   rÐ  rÑ  r¸  rŠ   r"   r"   r#   rŒ   ý  rÒ  zOrderBy.set_source_expressionsc                 C   r·  ru   r¸  r=   r"   r"   r#   rˆ      rx   zOrderBy.get_source_expressionsc                 K   s¾   |p| j }|jjr| jrd| }n%| jrd| }n| jr(| jr#|jjs(d| }n| jr6| js2|jjs6d| }|j | ¡ | 	| j
¡\}}|| jrJdnddœ|¥}|| d¡9 }||  ¡ |fS )	Nz%s NULLS LASTz%s NULLS FIRSTz%%(expression)s IS NULL, %sz%%(expression)s IS NOT NULL, %sÚDESCÚASC)r¿   Úorderingz%(expression)s)r‘  rU  Ú supports_order_by_nulls_modifierr  r  ró   Úorder_by_nulls_firstrB  rW  rA  r¿   ÚcountÚrstrip)r   r   r   r‘  r   Úexpression_sqlr!   Úplaceholdersr"   r"   r#   r     s8   

€ÿÿ
ÿÿþýzOrderBy.as_sqlc                 C   sN   |j js!|j | j¡r!|  ¡ }tt| jdd�dd�|_| ||¡S |  ||¡S )NT)rÝ  F)rì  )	rU  r×  rB  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è   .  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õ   4  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ô   A  rã   zOrderBy.desc)FNNru   )r%   r&   r'   r‘  rT   rù   r|   r:  rŒ   rˆ   r   r  rè   rõ   rð   rô   r"   r"   r"   r#   rí   æ  s    


rí   c                       sx   e Zd ZdZdZdZ				d‡ fdd„	Zdd„ Zd	d
„ Zdd„ Z	ddd„Z
‡ fdd„Zdd„ Zdd„ Zdd„ Z‡  ZS )ÚWindowz %(expression)s OVER (%(window)s)FTNc                    sÎ   || _ || _|| _t|ddƒstd|jj ƒ‚| j d ur/t| j tt	fƒs)| j f| _ t
| j Ž | _ | jd urVt| jt	tfƒrCt| jŽ | _nt| jttfƒrRt| jƒ| _ntdƒ‚tƒ j|d� |  |¡d | _d S )Nr   Fz3Expression '%s' isn't compatible with OVER clauses.zhWindow.order_by must be either a string reference to a field, an expression, or a list or tuple of them.rz   r   )Úpartition_byÚorder_byÚframerW   rú   rº   r%   r�   r  r'  rÇ  rÍ  ry   r�   r7  r|   r—   Úsource_expression)r   r¿   r  r  r  r   r8  r"   r#   r|   M  s.   ÿÿ


ÿzWindow.__init__c                 C   rÔ  ru   )r  r   r=   r"   r"   r#   rµ   q  rx   zWindow._resolve_output_fieldc                 C   s   | j | j| j| jgS ru   ©r  r  r  r  r=   r"   r"   r#   rˆ   t  rÅ   zWindow.get_source_expressionsc                 C   s   |\| _ | _| _| _d S ru   r  rŠ   r"   r"   r#   rŒ   w  ri  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)rB  rW  rU  Úsupports_over_clauser   rA  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   z  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Œ   r7  r  r$   r   )r   r   r   r   rÝ   r8  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È  )r9  r�   r  r  r  r  r=   r"   r"   r#   r;  ¥  s   üzWindow.__str__c                 C   rà  rá  râ  r=   r"   r"   r#   r:  ­  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$   r;  r:  rè   rQ  r"   r"   r8  r#   r  E  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#   r:  ¿  rÅ   zWindowFrameExclusion.__repr__N)r%   r&   r'   ÚCURRENT_ROWr   r!  Ú	NO_OTHERSr:  r"   r"   r"   r#   r  ¹  s    r  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   rs  Úendr�   r   r  re  rº   r'   Ú	exclusion)r   rs  r&  r'  r"   r"   r#   r|   Î  s   

ÿ
zWindowFrame.__init__c                 C   r>  ru   ©rs  r&  rŠ   r"   r"   r#   rŒ   Ø  r?   z"WindowFrame.set_source_expressionsc                 C   r<  ru   r(  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_typers  r&  Úexclude)rB  rW  Úwindow_frame_start_endrs  r¾   r&  r'  rU  Úsupports_frame_exclusionr   r‘  r+  r)  )r   r   r   rs  r&  r"   r"   r#   r   ã  s"   ÿÿüÿøzWindowFrame.as_sqlc                 C   rà  rá  râ  r=   r"   r"   r#   r:  ÷  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 %sr*  )rs  r¾   Úabsr   rB  Ú	PRECEDINGr#  Ú	FOLLOWINGÚUNBOUNDED_PRECEDINGr&  ÚUNBOUNDED_FOLLOWINGr‘  r+  r)  )r   rs  r&  r"   r"   r#   r;  ý  s(   

üzWindowFrame.__str__c                 C   rn   )Nz3Subclasses must implement window_frame_start_end().rp   ©r   r   rs  r&  r"   r"   r#   r-    rx   z"WindowFrame.window_frame_start_endr›  )r%   r&   r'   r(   r‘  r|   rŒ   rˆ   r)  r   r:  rè   r;  r-  r"   r"   r"   r#   r%  Ã  s    

r%  c                   @   r   )ÚRowRangeÚROWSc                 C   ó   |j  ||¡S ru   )rB  Úwindow_frame_rows_start_endr4  r"   r"   r#   r-    rÒ  zRowRange.window_frame_start_endN©r%   r&   r'   r+  r-  r"   r"   r"   r#   r5    ó    r5  c                   @   r   )Ú
ValueRangeÚRANGEc                 C   r7  ru   )rB  Úwindow_frame_range_start_endr4  r"   r"   r#   r-  $  rÒ  z!ValueRange.window_frame_start_endNr9  r"   r"   r"   r#   r;  !  r:  r;  )ar   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   r  rC   r<   rK   rN   rQ   rG   r[   re   r]   r_   rb   rH  rG  rJ  rI  Ú_connector_combinationsr'  r)  r-  Údr  r7   Úfield_typesr*  r+  r,  r!  r5  r5   rK  rL  r‘   rj  rp  rb  r|  r4   r©  r³  r´  r½  rÄ  rÇ  rÍ  rÏ  rv   rÛ  rê  rø  rÿ  rí   r  r  r%  r5  r;  r"   r"   r"   r#   Ú<module>   s      P/	ûøøúûùûüúõöÿôÿ™yÿÿ

	f3/%9hP#'')$3Of5^t
W