o
    <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"   O/var/www/html/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 )NF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conditionalFFUse .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 rd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