o
    ;Of                    @   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"   h/var/www/html/Testing_prj/Navya-Bakers/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 fddZdd Zdd Zd	d
 Z  Z	S )ExpressionListz
    An expression containing multiple expressions. Can be used to provide a
    list of expressions as an argument to another expression, like a partition
    clause.
    z%(expressions)sc                    s*   |s
t d| jj t j|i | d S )Nz$%s requires at least one expression.)r   r   r%   r7  r|   r   r   r  r8  r"   r#   r|   d  s
   
zExpressionList.__init__c                 C   s   | j dd | jD S )Nc                 s   r  ru   r  r   r"   r"   r#   r   l  r  z)ExpressionList.__str__.<locals>.<genexpr>)r  r  r   r=   r"   r"   r#   r;  k  ri  zExpressionList.__str__c                 K   s   | j ||fi |S ru   )r   )r   r   r   r   r"   r"   r#   r$   n  r  zExpressionList.as_sqlitec                 C   $   g }|   D ]	}||  q|S ru   r   r   r   )r   group_by_colsr   r"   r"   r#   r   r     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  r8  r"   r#   r|   }  s   zOrderByList.__init__)r%   r&   r'   r  r  r|   rQ  r"   r"   r8  r#   r  y  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   C  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|   B  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   L  r  zCase.__str__.<locals>.<genexpr>)r  r  r  r=   r"   r"   r#   r;  J  s   zCase.__str__c                 C   r  r  r  r=   r"   r"   r#   r:  P  r?   zCase.__repr__c                 C   s   | j | jg S ru   r  r  r=   r"   r"   r#   r   S  r  zCase.get_source_expressionsc                 C   s   |^ | _ | _d S ru   r  r   r"   r"   r#   r   V  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   Y  s   

zCase.resolve_expressionc                    s   t   }|jd d  |_|S ru   )r7  r   r  )r   r   r8  r"   r#   r   g  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   l  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  1  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   0  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   6  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   C  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|   O  s.   


zWindow.__init__c                 C   r  ru   )r  r   r=   r"   r"   r#   r   s  rx   zWindow._resolve_output_fieldc                 C   s   | j | j| j| jgS ru   r  r  r  r  r=   r"   r"   r#   r   v  r   zWindow.get_source_expressionsc                 C   s   |\| _ | _| _| _d S ru   r  r   r"   r"   r#   r   y  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   |  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  )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  G  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_endr5  r"   r"   r#   r.    r  zRowRange.window_frame_start_endNr%   r&   r'   r,  r.  r"   r"   r"   r#   r6        r6  c                   @   r   )
ValueRangeRANGEc                 C   r8  ru   )rB  window_frame_range_start_endr5  r"   r"   r#   r.  &  r  z!ValueRange.window_frame_start_endNr:  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&  r6  r<  r"   r"   r"   r#   <module>   s      P/	y

	f3/%9hP#'')$3Of5^t
W