o
    {,h                    @   sT  d dl Z d dlZd dlZd dlZd dlmZ d dlmZ d dlm	Z	 d dl
mZ d dlmZ d dlmZ d dlmZmZmZ d d	lmZmZmZ d d
lmZ d dlmZ d dlmZ d dlmZ d dl m!Z!m"Z" d dl#m$Z$ G dd dZ%G dd dZ&G dd deZ'G dd dZ(eG dd de(e&Z)dd e&j*e&j+e&j,e&j-e&j.fD dd e&j*e&j/e&j+e&j,e&j-e&j.fD dd e&j*e&j/e&j+e&j,e&j-fD dd e&j0e&j1e&j2e&j3e&j4fD dd e&j*e&j/e&j+e&j,e&j-e&j.fD e&j*ej5ej6ej7fej7ej6ej7fej6ej5ej7fej6ej7ej7fej6ej6ej6fej8ej6ej8fej6ej8ej8fgie&j/ej5ej6ej7fej7ej6ej7fej5ej5ej6fej5ej7ej6fej7ej5ej6fej7ej7ej6fej6ej6ej6fej8ej6ej8fej8ej8ej6fg	igZ9ee:Z;d d! Z<e9D ]Z=e=> D ]\Z?Z@e@D ]\ZAZBZCe<eAe?eBeC qzqtqnejDd"d#d$d% ZEG d&d' d'e%e)ZFG d(d) d)eFZGG d*d+ d+eFZHed,d-G d.d/ d/e&ZIG d0d1 d1eIZJG d2d3 d3eIZKG d4d5 d5eIZLed6d-G d7d8 d8e%e)ZMed9d-G d:d; d;e%e)ZNG d<d= d=e)ZOG d>d? d?e)ZPG d@dA dAe)ZQG dBdC dCe)ZRG dDdE dEe)ZSG dFdG dGe)ZTG dHdI dIeMZUG dJdK dKeUZVedLd-G dMdN dNe%e)ZWG dOdP dPeWZXedQd-G dRdS dSe)ZYedTd-G dUdV dVe%e)ZZG dWdX dXe(e&Z[G dYdZ dZe[Z\ed[d-G d\d] d]e)Z]G d^d_ d_e%e)Z^G d`da dae	Z_G dbdc dce)Z`G ddde dee`ZaG dfdg dge`ZbdS )h    N)defaultdictDecimal)Enum)chainNoneType)UUID)EmptyResultSet
FieldErrorFullResultSet)DatabaseErrorNotSupportedError
connection)fields)
LOOKUP_SEP)Q)deconstructible)cached_propertyclassproperty)make_hashablec                   @      e Zd ZdZdd ZdS )SQLiteNumericMixinzp
    Some expressions with output_field=DecimalField() must be cast to
    numeric to be properly filtered.
    c                 K   s\   | j ||fi |\}}z| j dkrd| }W ||fS W ||fS  ty-   Y ||fS w )NDecimalFieldz(CAST(%s AS NUMERIC)))as_sqloutput_fieldget_internal_typer   )selfcompilerr   extra_contextsqlparams r"   R/var/www/html/rh/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                   @   s   e Zd ZdS )OutputFieldIsNoneErrorN)r%   r&   r'   r"   r"   r"   r#   ry      s    ry   c                   @   sn  e Zd ZdZeZdZdZdZdZ	dZ
dZdZdIddZdd Zd	d
 Zdd Zdd Zdd Zdd Zedd Zedd Zedd Zedd Z	dJddZedd Zedd  Zed!d" Zed#d$ Zd%d& Ze d'd( Z!ed)d* Z"d+d, Z#d-d. Z$d/d0 Z%d1d2 Z&d3d4 Z'd5d6 Z(d7d8 Z)d9d: Z*d;d< Z+d=d> Z,d?d@ Z-dAdB Z.dCdD Z/dEdF Z0dGdH Z1dS )KBaseExpressionz%Base class for all query expressions.FTNc                 C   s   |d ur	|| _ d S d S ru   r   r   r   r"   r"   r#   __init__   s   
zBaseExpression.__init__c                 C   s   | j  }|dd  |S )Nconvert_value)__dict__copypop)r   stater"   r"   r#   __getstate__      
zBaseExpression.__getstate__c                 C   s$   | j | ju rg n| j g| j| S ru   )r~   _convert_value_noopr   get_db_convertersr   r   r"   r"   r#   r      s
   
z BaseExpression.get_db_convertersc                 C      g S ru   r"   r=   r"   r"   r#   get_source_expressions      z%BaseExpression.get_source_expressionsc                 C   s   |rJ d S ru   r"   r   exprsr"   r"   r#   set_source_expressions      z%BaseExpression.set_source_expressionsc                 G   s   dd |D S )Nc                 S   s4   g | ]}t |d r|nt|trt|nt|qS r2   )r3   
isinstancestrFr4   .0argr"   r"   r#   
<listcomp>   s    z5BaseExpression._parse_expressions.<locals>.<listcomp>r"   )r   expressionsr"   r"   r#   _parse_expressions   s   z!BaseExpression._parse_expressionsc                 C   rn   )a  
        Responsible for returning a (sql, [params]) tuple to be included
        in the current query.

        Different backends can provide their own implementation, by
        providing an `as_{vendor}` method and patching the Expression:

        ```
        def override_as_sql(self, compiler, connection):
            # custom logic
            return super().as_sql(compiler, connection)
        setattr(Expression, 'as_' + connection.vendor, override_as_sql)
        ```

        Arguments:
         * compiler: the query compiler responsible for generating the query.
           Must have a compile method, returning a (sql, [params]) tuple.
           Calling compiler(value) will return a quoted `value`.

         * connection: the database connection used for the current query.

        Return: (sql, params)
          Where `sql` is a string containing ordered sql parameters to be
          replaced with the elements of the list `params`.
        z"Subclasses must implement as_sql()rp   r   r   r   r"   r"   r#   r      s   zBaseExpression.as_sqlc                 C      t dd |  D S )Nc                 s       | ]}|o|j V  qd S ru   )contains_aggregater   exprr"   r"   r#   	<genexpr>       

z4BaseExpression.contains_aggregate.<locals>.<genexpr>anyr   r=   r"   r"   r#   r         z!BaseExpression.contains_aggregatec                 C   r   )Nc                 s   r   ru   )contains_over_clauser   r"   r"   r#   r     r   z6BaseExpression.contains_over_clause.<locals>.<genexpr>r   r=   r"   r"   r#   r     r   z#BaseExpression.contains_over_clausec                 C   r   )Nc                 s   r   ru   )contains_column_referencesr   r"   r"   r#   r     s
    
z<BaseExpression.contains_column_references.<locals>.<genexpr>r   r=   r"   r"   r#   r   	     z)BaseExpression.contains_column_referencesc                 C   r   )Nc                 s   s&    | ]}|ot |d dp|jV  qdS )subqueryFN)rW   contains_subqueryr   r"   r"   r#   r     s
    
z3BaseExpression.contains_subquery.<locals>.<genexpr>r   r=   r"   r"   r#   r     r   z BaseExpression.contains_subqueryc                    sb   |   }|_ fdd| D }| js*tdd |D r*t| jj d|| |S )a
  
        Provide the chance to do any preprocessing or validation before being
        added to the query.

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

        Return: an Expression to be added to the query.
        c                    s(   g | ]}|d ur|  nd qS ru   r   r   allow_joinsqueryreuse	summarizer"   r#   r   *  s    z5BaseExpression.resolve_expression.<locals>.<listcomp>c                 s       | ]}t |tV  qd S ru   )r   ColPairsr   r"   r"   r#   r   2  r   z4BaseExpression.resolve_expression.<locals>.<genexpr>z4 expression does not support composite primary keys.)	r   
is_summaryr   allows_composite_expressionsr   
ValueError	__class__r%   r   )r   r   r   r   r   for_savecsource_expressionsr"   r   r#   r2     s   
z!BaseExpression.resolve_expressionc                 C   s   t | jtjS ru   )r   r   r   BooleanFieldr=   r"   r"   r#   rT   <  s   zBaseExpression.conditionalc                 C      | j S ru   r{   r=   r"   r"   r#   field@     zBaseExpression.fieldc                 C   s   |   }|du rtd|S )z+Return the output type of this expressions.Nz4Cannot resolve expression type, unknown output_field)_resolve_output_fieldry   r|   r"   r"   r#   r   D  s   zBaseExpression.output_fieldc                 C   s   z| j W S  ty   Y dS w )z
        Return the output field of this expression, or None if
        _resolve_output_field() didn't return an output type.
        N)r   ry   r=   r"   r"   r#   _output_field_or_noneN  s
   z$BaseExpression._output_field_or_nonec                 C   sT   dd |   D }|D ]}|D ]}t||js#td|jj|jjf q|  S dS )a}  
        Attempt to infer the output type of the expression.

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

        If a source's output field resolves to None, exclude it from this check.
        If all sources are None, then an error is raised higher up the stack in
        the output_field property.
        c                 s   s    | ]	}|d ur|V  qd S ru   r"   )r   sourcer"   r"   r#   r   g  s    z7BaseExpression._resolve_output_field.<locals>.<genexpr>zCExpression contains mixed types: %s, %s. You must set output_field.N)get_source_fieldsr   r   r   r%   )r   sources_iterr   r   r"   r"   r#   r   Y  s    	z$BaseExpression._resolve_output_fieldc                 C      | S ru   r"   value
expressionr   r"   r"   r#   r   w     z"BaseExpression._convert_value_noopc                 C   sF   | j }| }|dkrdd S |drdd S |dkr dd S | jS )z
        Expressions provide their own converters because users have the option
        of manually specifying the output_field which may be a different type
        from the one the database returns.
        
FloatFieldc                 S      | d u rd S t | S ru   )floatr   r"   r"   r#   <lambda>     z.BaseExpression.convert_value.<locals>.<lambda>IntegerFieldc                 S   r   ru   )intr   r"   r"   r#   r     r   r   c                 S   r   ru   r   r   r"   r"   r#   r     r   )r   r   endswithr   )r   r   internal_typer"   r"   r#   r~   {  s   
zBaseExpression.convert_valuec                 C      | j |S ru   )r   
get_lookup)r   lookupr"   r"   r#   r     r   zBaseExpression.get_lookupc                 C   r   ru   )r   get_transformr   namer"   r"   r#   r     r   zBaseExpression.get_transformc                    (   |   }| fdd|  D  |S )Nc                    s"   g | ]}|d ur|  nd qS ru   )relabeled_cloner   e
change_mapr"   r#   r     s    z2BaseExpression.relabeled_clone.<locals>.<listcomp>r   r   r   )r   r   cloner"   r   r#   r     s   
zBaseExpression.relabeled_clonec                    sN    s| S   |  }r|S |   }s| S |  }| fdd|D  |S )Nc                    s   g | ]}|r|  nd qS ru   )replace_expressionsr   replacementsr"   r#   r     s    z6BaseExpression.replace_expressions.<locals>.<listcomp>)getr   r   r   )r   r   replacementr   r   r"   r   r#   r     s   
z"BaseExpression.replace_expressionsc                 C   s.   t  }|  D ]}|d u rq|| O }q|S ru   )setr   get_refs)r   refsr   r"   r"   r#   r     s   zBaseExpression.get_refsc                 C   
   t  | S ru   r   r=   r"   r"   r#   r        
zBaseExpression.copyc                    r   )Nc                    s2   g | ]}t |trt  |j n| qS r"   )r   r   r   prefix_referencesr   prefixr"   r#   r     s    z4BaseExpression.prefix_references.<locals>.<listcomp>r   )r   r   r   r"   r   r#   r     s   

z BaseExpression.prefix_referencesc                 C   s0   | j s| gS g }|  D ]	}||  q|S ru   )r   r   extendget_group_by_colsr   colsr   r"   r"   r#   r     s   z BaseExpression.get_group_by_colsc                 C   s   dd |   D S )z9Return the underlying field types used by this aggregate.c                 S      g | ]}|j qS r"   )r   r   r"   r"   r#   r         z4BaseExpression.get_source_fields.<locals>.<listcomp>)r   r=   r"   r"   r#   r     s   z BaseExpression.get_source_fieldsc                 K      t | fi |S ru   OrderByr   kwargsr"   r"   r#   asc  r?   zBaseExpression.ascc                 K      t | fddi|S N
descendingTr   r   r"   r"   r#   desc  r   zBaseExpression.descc                 C   r   ru   r"   r=   r"   r"   r#   reverse_ordering  r   zBaseExpression.reverse_orderingc                 c   s>    | V  |   D ]}|rt|dr| E dH  q|V  qdS )zi
        Recursively yield this expression and all subexpressions, in
        depth-first order.
        flattenN)r   r3   r   )r   r   r"   r"   r#   r     s   
zBaseExpression.flattenc                 C   s$   t | jdr| j|||S ||fS )z
        Custom format for select clauses. For example, EXISTS expressions need
        to be wrapped in CASE WHEN on Oracle.
        select_format)r3   r   r   r   r   r    r!   r"   r"   r#   r     s   zBaseExpression.select_formatc              
   C   sD   t | dds z|  \}W |S  ty } ztd|d }~ww | S )N constraint_validation_compatibleTzdExpressions with constraint_validation_compatible set to False must have only one source expression.)rW   r   r   )r   r   r   r"   r"   r#   get_expression_for_validation  s   z,BaseExpression.get_expression_for_validationru   NTNFF)2r%   r&   r'   r(   NotImplementedempty_result_set_valuer   
filterablewindow_compatibleallowed_defaultr   set_returningr   r}   r   r   r   r   r   r   r   r   r   r   r   r2   propertyrT   r   r   r   r   staticmethodr   r~   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r"   r"   r"   r#   rz      sn    






%


	




	rz   c                   @   sP   e Zd ZdZeejdddd Zedd Z	e
dd	 Zd
d Zdd ZdS )
Expressionz:An expression that can be combined with other expressions.   maxsizec                 C   s   t | jS ru   )inspect	signaturer}   clsr"   r"   r#   _constructor_signature	  s   z!Expression._constructor_signaturec                    sv   t |trtt j|S t |trt fdd| D S t |tjr7|jr3|j	r3|j	j
j|jfS t|S t|S )Nc                 3   s"    | ]\}}|  |fV  qd S ru   )	_identityr   keyvalr  r"   r#   r     s     z'Expression._identity.<locals>.<genexpr>)r   tuplemapr  dictitemsr   Fieldr   model_metalabeltyper   )r  r   r"   r  r#   r    s   

zExpression._identityc                 C   sx   | j \}}| jj| g|R i |}|  t|j }t| | jg}|D ]\}}| 	|}|
||f q't|S ru   )_constructor_argsr  bind_partialapply_defaultsiter	argumentsr  nextr   r  appendr  )r   argsr   r  r#  identityr   r   r"   r"   r#   r'    s   

zExpression.identityc                 C   s   t |tstS |j| jkS ru   )r   r	  r  r'  rD   r"   r"   r#   __eq__*  s   
zExpression.__eq__c                 C   
   t | jS ru   )hashr'  r=   r"   r"   r#   __hash__/  r   zExpression.__hash__N)r%   r&   r'   r(   r   	functools	lru_cacher  classmethodr  r   r'  r(  r+  r"   r"   r"   r#   r	    s    


r	  c                 C       i | ]}|t jt jt jfgqS r"   )r   PositiveIntegerFieldr   r7   r"   r"   r#   
<dictcomp>>  s    r2  c                 C   s<   i | ]}|t jt jt jft jt jt jft jt jt jfgqS r"   )r   r   r   r   r1  r"   r"   r#   r2  O  s    c              	   C   sJ   i | ]!}|t jt jt jft jt jt jft jt jt jft jt jt jfgqS r"   )r   r   r   r   r1  r"   r"   r#   r2  a  s    c                 C   r/  r"   )r   r   r1  r"   r"   r#   r2  q  s    c              
   C   s2   i | ]}|t td d tjtjtjfD qS )c                 s   s$    | ]}|t |ft ||fgV  qd S ru   r   )r   
field_typer"   r"   r#   r     s
    
z<dictcomp>.<genexpr>)listr   from_iterabler   r   r   r   r1  r"   r"   r#   r2  ~  s    
c                 C   s   t | | ||f dS )z
    Register combinable types:
        lhs <connector> rhs -> result
    e.g.
        register_combinable_fields(
            IntegerField, Combinable.ADD, FloatField, FloatField
        )
    N)_connector_combinatorsr%  )lhsr7   rhsresultr"   r"   r#   register_combinable_fields  s   	r:  r
  r  c                 C   s<   t | d}|D ]\}}}t||rt||r|  S qd S )Nr"   )r6  r   
issubclass)r7   lhs_typerhs_typecombinatorscombinator_lhs_typecombinator_rhs_typecombined_typer"   r"   r#   _resolve_combined_type  s   rB  c                       sj   e Zd Zd fdd	Zdd Zdd Zdd	 Zd
d Zdd Zdd Z		d fdd	Z
edd Z  ZS )r5   Nc                    s$   t  j|d || _|| _|| _d S Nr{   )superr}   r7   r7  r8  )r   r7  r7   r8  r   r   r"   r#   r}        
zCombinedExpression.__init__c                 C   s   d | jj| S )Nz<{}: {}>)formatr   r%   r=   r"   r"   r#   __repr__  r?   zCombinedExpression.__repr__c                 C   s   d | j| j| jS )Nz{} {} {})rG  r7  r7   r8  r=   r"   r"   r#   __str__  r   zCombinedExpression.__str__c                 C      | j | jgS ru   r7  r8  r=   r"   r"   r#   r     r   z)CombinedExpression.get_source_expressionsc                 C      |\| _ | _d S ru   rK  r   r"   r"   r#   r     r?   z)CombinedExpression.set_source_expressionsc                 C   sZ   t | jt| jjt| jj}|d u r*td| jd| jjjj	 d| jjjj	 d| S )NzCannot infer type of z# expression involving these types: , z. You must set output_field.)
rB  r7   r  r7  r   r8  r   r   r   r%   )r   rA  r"   r"   r#   r     s   




z(CombinedExpression._resolve_output_fieldc                 C   sp   g }g }| | j\}}|| || | | j\}}|| || d}|j| j|}|| |fS Nz(%s))compiler7  r%  r   r8  opscombine_expressionr7   r   r   r   r   expression_paramsr    r!   expression_wrapperr"   r"   r#   r     s   



zCombinedExpression.as_sqlTFc           
   	      s   t  |||||}t| ttfsiz|jj }W n tt	fy&   d }Y nw z|j
j }W n tt	fy<   d }Y nw d||hv rP||krPt|j|j|j
S h d}	| j| jkri||	v ri||krit|j|j
S |S )NDurationField>   	DateField	TimeFieldDateTimeField)rD  r2   r   DurationExpressionTemporalSubtractionr7  r   r   AttributeErrorr   r8  r7   rG   )
r   r   r   r   r   r   resolvedr<  r=  datetime_fieldsrE  r"   r#   r2     s8   z%CombinedExpression.resolve_expressionc                 C      | j jo| jjS ru   )r7  r  r8  r=   r"   r"   r#   r  $     z"CombinedExpression.allowed_defaultru   r   )r%   r&   r'   r}   rH  rI  r   r   r   r   r2   r   r  __classcell__r"   r"   rE  r#   r5     s     r5   c                       s,   e Zd Zdd Z fddZdd Z  ZS )rY  c                 C   sR   z|j }W n	 ty   Y nw | dkr$||\}}|j||fS ||S )NrU  )r   r   r   rO  rP  format_for_duration_arithmetic)r   sider   r   outputr    r!   r"   r"   r#   rO  *  s   

zDurationExpression.compilec                    s   |j jrt ||S |j|  g }g }| | j||\}}|| |	| | | j
||\}}|| |	| d}|j| j|}|| |fS rN  )featureshas_native_duration_fieldrD  r   rP  check_expression_supportrO  r7  r%  r   r8  combine_duration_expressionr7   rR  rE  r"   r#   r   5  s   



zDurationExpression.as_sqlc           	   	   K   s   | j ||fi |\}}| jtjtjhv rGz| jj }| jj }W n t	t
fy1   Y ||fS w h d}||vs>||vrGtd| j d||fS )N>   r   r   r   rU  zInvalid arguments for operator .)r   r7   r)   r<   rK   r7  r   r   r8  r[  r   r   )	r   r   r   r   r    r!   r<  r=  allowed_fieldsr"   r"   r#   r$   F  s   zDurationExpression.as_sqlite)r%   r&   r'   rO  r   r$   r`  r"   r"   rE  r#   rY  )  s    rY  c                       s,   e Zd Ze Z fddZdd Z  ZS )rZ  c                    s   t  || j| d S ru   )rD  r}   rG   )r   r7  r8  rE  r"   r#   r}   _     zTemporalSubtraction.__init__c                 C   s<   |j |  || j}|| j}|j | jj ||S ru   )rP  rf  rO  r7  r8  subtract_temporalsr   r   )r   r   r   r7  r8  r"   r"   r#   r   b  s   zTemporalSubtraction.as_sql)	r%   r&   r'   r   rU  r   r}   r   r`  r"   r"   rE  r#   rZ  \  s    rZ  zdjango.db.models.F)pathc                   @   sp   e Zd ZdZdZdd Zdd Zdd Zd	d
 Z	dddZ	dd Z
dd Zdd Zdd Zdd Zdd ZdS )r   zDAn object capable of resolving references to existing query objects.Fc                 C   s
   || _ dS )z^
        Arguments:
         * name: the name of the field this expression references
        N)r   r   r"   r"   r#   r}   q  s   
z
F.__init__c                 C      d | jj| jS N{}({}))rG  r   r%   r   r=   r"   r"   r#   rH  x     z
F.__repr__c                 C   s
   t | |S ru   )Sliced)r   	subscriptr"   r"   r#   __getitem__{  r   zF.__getitem__c                 C   s   t d| jj d)Nzargument of type 'z' is not iterable)	TypeErrorr   r%   rD   r"   r"   r#   __contains__~  s   zF.__contains__NTc                 C   s   | | j|||S ru   )resolve_refr   r   r   r   r   r   r   r"   r"   r#   r2     s   zF.resolve_expressionc                 C   s   | | | 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}   rH  rs  ru  r2   r   r   r   r(  r+  r   r"   r"   r"   r#   r   k  s    
r   c                       s@   e Zd ZdZdZdZdd Z fddZdd Zd	d
 Z	  Z
S )ResolvedOuterRefz
    An object that contains a reference to an outer query.

    In this case, the reference to the outer query has been resolved because
    the inner query has been used as a subquery.
    Fc                 O   rn   )NzXThis queryset contains a reference to an outer query and may only be used in a subquery.)r   r   r&  r   r"   r"   r#   r     rr   zResolvedOuterRef.as_sqlc                    s:   t  j|i |}|jrtd| j dt| jv |_|S )Nz<Referencing outer query window expression is not supported: rh  )rD  r2   r   r   r   r   possibly_multivalued)r   r&  r   colrE  r"   r#   r2     s   z#ResolvedOuterRef.resolve_expressionc                 C   r   ru   r"   r   relabelsr"   r"   r#   r     r   z ResolvedOuterRef.relabeled_clonec                 C   r   ru   r"   r=   r"   r"   r#   r     r   z"ResolvedOuterRef.get_group_by_cols)r%   r&   r'   r(   r   r   r   r2   r   r   r`  r"   r"   rE  r#   ry    s    ry  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   ry  rz  r"   r"   r#   r2     s   
zOuterRef.resolve_expressionc                 C   r   ru   r"   r}  r"   r"   r#   r     r   zOuterRef.relabeled_cloneN)r%   r&   r'   r   r   r2   r   r"   r"   r"   r#   r    s
    r  c                       s<   e Zd ZdZ fddZdd Z					dd	d
Z  ZS )rq  z
    An object that contains a slice of an F expression.

    Object resolves the column on which the slicing is applied, and then
    applies the slicing if possible.
    c                    s   t  |j || _t|tr!|dk rtd|d | _d| _d S t|t	ry|jd ur0|jdk s:|j
d ur>|j
dk r>td|jd urGtd|j
rW|jrW|j
|jk rWtd|jd u r^dn|jd | _|j
d u rnd | _d S |j
|jptd | _d S td)Nr   z#Negative indexing is not supported.   zStep argument is not supported.z,Slice stop must be greater than slice start.z7Argument to slice must be either int or slice instance.)rD  r}   r   objr   r   r   startlengthslicestopsteprt  )r   r  rr  rE  r"   r#   r}     s(   






zSliced.__init__c                 C   sH   | j d }| jd u rd n|| j }t||}| jj d| jd|dS )Nr  (rM  ))r  r  r  r   r'   r  )r   r  r  rr  r"   r"   r#   rH    s   

zSliced.__repr__NTFc                 C   sR   | | j|||}t| jt| jfr| j|||||}n|}|j|| j	| j
S ru   )rv  r   r   r  r  r   r2   r   slice_expressionr  r  )r   r   r   r   r   r   r\  r   r"   r"   r#   r2     s   
zSliced.resolve_expressionr   )r%   r&   r'   r(   r}   rH  r2   r`  r"   r"   rE  r#   rq    s    rq  zdjango.db.models.Funcc                       s~   e Zd ZdZdZdZdZdZdd fdd
Zdd	 Z	d
d Z
dd Zdd Z			dddZ fddZedd Z  ZS )FunczAn SQL function call.Nz%(function)s(%(expressions)s)rM  r{   c                   sh   | j d ur"t|| j kr"td| jj| j | j dkrdndt|f t j|d | j| | _|| _	d S )Nz#'%s' takes exactly %s %s (%s given)r  argumentr#  r{   )
aritylenrt  r   r%   rD  r}   r   r   extra)r   r   r   r  rE  r"   r#   r}     s   	
zFunc.__init__c                 C   sl   | j dd | jD }i | j|  }|r.ddd t| D }d| jj	||S d| jj	|S )Nc                 s       | ]}t |V  qd S ru   r   r   r"   r"   r#   r         z Func.__repr__.<locals>.<genexpr>rM  c                 s   s(    | ]\}}t |d  t | V  qdS )=Nr  r  r"   r"   r#   r   "  s    

{}({}, {})ro  )

arg_joinerjoinr   r  _get_repr_optionssortedr  rG  r   r%   )r   r&  r  r"   r"   r#   rH    s   

zFunc.__repr__c                 C   s   i S )zAReturn a dict of extra __init__() options to include in the repr.r"   r=   r"   r"   r#   r  (  r   zFunc._get_repr_optionsc                 C   r   ru   r   r=   r"   r"   r#   r   ,     zFunc.get_source_expressionsc                 C   s
   || _ d S ru   r  r   r"   r"   r#   r   /  r   zFunc.set_source_expressionsc              	   K   s  |j |  g }g }| jD ]D}	z	||	\}
}W n. ty5   t|	dt}|tu r* |t|\}
}Y n tyF   |td\}
}Y nw |	|
 |
| qi | j|}|d urb||d< n|d| j |pq|d| j}|pz|d| j}|| |d< |d< || |fS )Nr  Tfunctiontemplater  r   r   )rP  rf  r   rO  r
   rW   r  r4   r   r%  r   r  
setdefaultr  r   r  r  r  )r   r   r   r  r  r  r   	sql_partsr!   r   arg_sql
arg_paramsr  datar"   r"   r#   r   2  s4   	


zFunc.as_sqlc                    s*   t   }| jd d  |_| j |_|S ru   )rD  r   r   r  )r   r   rE  r"   r#   r   Y  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   a  s    z'Func.allowed_default.<locals>.<genexpr>)allr   r=   r"   r"   r#   r  _     zFunc.allowed_defaultNNN)r%   r&   r'   r(   r  r  r  r  r}   rH  r  r   r   r   r   r   r  r`  r"   r"   rE  r#   r    s$    

'r  zdjango.db.models.Valuec                       sf   e Zd ZdZdZdZd fdd	Zdd Zd	d
 Z	d fdd	Z	dd Z
dd Zedd Z  ZS )r4   z9Represent a wrapped value as a node within an expression.FTNc                    s   t  j|d || _dS )a:  
        Arguments:
         * value: the value this expression represents. The value will be
           added into the sql parameter list and properly quoted.

         * output_field: an instance of the model field type that this
           expression will return, such as IntegerField() or CharField().
        r{   N)rD  r}   r   )r   r   r   rE  r"   r#   r}   m  s   	
zValue.__init__c                 C   s   | j j d| jdS )Nr  r  )r   r%   r   r=   r"   r"   r#   rH  y  rj  zValue.__repr__c                 C   s|   |j |  | j}| j}|d ur1| jr|j||d}n|j||d}t|dr1|||||gfS |d u r9dg fS d|gfS )N)r   get_placeholderNULLz%s)	rP  rf  r   r   r   get_db_prep_saveget_db_prep_valuer3   r  )r   r   r   r  r   r"   r"   r#   r   |  s   

zValue.as_sqlc                    s   t  |||||}||_|S ru   )rD  r2   r   )r   r   r   r   r   r   r   rE  r"   r#   r2     s   zValue.resolve_expressionc                 C   r   ru   r"   r=   r"   r"   r#   r     r   zValue.get_group_by_colsc                 C   s   t | jtr
t S t | jtrt S t | jtrt S t | jt	r(t
 S t | jtjr3t S t | jtjr>t S t | jtjrIt S t | jtjrTt S t | jtr^t S t | jtrht S t | jtrrt S d S ru   )r   r   r   r   	CharFieldboolr   r   r   r   r   datetimerX  daterV  timerW  	timedeltarU  r   r   bytesBinaryFieldr	   	UUIDFieldr=   r"   r"   r#   r     s.   zValue._resolve_output_fieldc                 C   r   ru   )r   r=   r"   r"   r#   r    r   zValue.empty_result_set_valueru   r   )r%   r&   r'   r(   r   r  r}   rH  r   r2   r   r   r  r  r`  r"   r"   rE  r#   r4   d  s    r4   c                       sJ   e Zd ZdZd fdd	Zdd Zdd Zd	d
 Z	d fdd	Z  Z	S )RawSQLTNc                    s0   |d u rt  }||| _| _t j|d d S rC  )r   r  r    r!   rD  r}   )r   r    r!   r   rE  r"   r#   r}     s   zRawSQL.__init__c                 C      d | jj| j| jS Nr  )rG  r   r%   r    r!   r=   r"   r"   r#   rH    rj  zRawSQL.__repr__c                 C   s   d| j  | jfS rN  )r    r!   r   r"   r"   r#   r     r?   zRawSQL.as_sqlc                 C      | gS ru   r"   r=   r"   r"   r#   r     r  zRawSQL.get_group_by_colsFc                    sb   |j r'|j jjD ]}|jjD ]}|j | j v r%||j|||  nqqt	 
|||||S ru   )r  r  all_parentslocal_fieldscolumnlowerr    rv  r   rD  r2   )r   r   r   r   r   r   parentparent_fieldrE  r"   r#   r2     s   

zRawSQL.resolve_expressionru   r   )
r%   r&   r'   r  r}   rH  r   r   r2   r`  r"   r"   rE  r#   r    s    r  c                   @   s   e Zd Zdd Zdd ZdS )Starc                 C   s   dS )Nz'*'r"   r=   r"   r"   r#   rH    r   zStar.__repr__c                 C   s   dg fS )Nr,   r"   r   r"   r"   r#   r     rx   zStar.as_sqlN)r%   r&   r'   rH  r   r"   r"   r"   r#   r    s    r  c                       sF   e Zd ZdZd fdd	Zdd Zdd Z	
dddZdd Z  Z	S )DatabaseDefaultz^
    Expression to use DEFAULT keyword during insert otherwise the underlying expression.
    Nc                    s   t  | || _d S ru   rD  r}   r   r   r   r   rE  r"   r#   r}     s   
zDatabaseDefault.__init__c                 C      | j gS ru   r   r=   r"   r"   r#   r     rx   z&DatabaseDefault.get_source_expressionsc                 C      |\| _ d S ru   r  r   r"   r"   r#   r     r   z&DatabaseDefault.set_source_expressionsTFc                 C   s,   | j j|||||d}|s|S t|| jdS )N)r   r   r   r   r   r{   )r   r2   r  r   )r   r   r   r   r   r   resolved_expressionr"   r"   r#   r2     s   	z"DatabaseDefault.resolve_expressionc                 C   s   |j js
|| jS dg fS )NDEFAULT)rd  "supports_default_keyword_in_insertrO  r   r   r"   r"   r#   r     s   zDatabaseDefault.as_sqlru   r   )
r%   r&   r'   r(   r}   r   r   r2   r   r`  r"   r"   rE  r#   r    s    
r  c                       sN   e Zd ZdZdZd fdd	Zdd Zdd	 Zd
d Zdd Z	dd Z
  ZS )ColTFNc                    s,   |d u r|}t  j|d ||| _| _d S rC  )rD  r}   aliastarget)r   r  r  r   rE  r"   r#   r}     s   zCol.__init__c                 C   s>   | j | j}}|r|t|fnt|f}d| jjd|S )Nro  rM  )r  r  r   rG  r   r%   r  )r   r  r  identifiersr"   r"   r#   rH    s   zCol.__repr__c                 C   s<   | j | jj}}|r||fn|f}dt|j|}|g fS Nrh  )r  r  r  r  r  quote_name_unless_alias)r   r   r   r  r  r  r    r"   r"   r#   r     s   z
Col.as_sqlc                 C   s,   | j d u r| S | || j | j | j| jS ru   )r  r   r   r  r   r}  r"   r"   r#   r     s
   
zCol.relabeled_clonec                 C   r  ru   r"   r=   r"   r"   r#   r   #  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   r{  r}   rH  r   r   r   r   r`  r"   r"   rE  r#   r    s    r  c                       sl   e Zd Z fddZdd Zdd Zdd Zd	d
 Zdd Zdd Z	dd Z
dd Zdd Zdd Z  ZS )r   c                    s$   t  j|d || _|| _|| _d S rC  )rD  r}   r  targetssources)r   r  r  r  r   rE  r"   r#   r}   /  rF  zColPairs.__init__c                 C   r)  ru   )r  r  r=   r"   r"   r#   __len__5  r   zColPairs.__len__c                 C   s   t |  S ru   )r"  get_colsr=   r"   r"   r#   __iter__8  r   zColPairs.__iter__c              
   C   s.   | j j d| jd| jd| jd| jd
S )Nr  rM  r  )r   r%   r  r  r  r   r=   r"   r"   r#   rH  ;  s   zColPairs.__repr__c                    s    fddt  j jD S )Nc                    s   g | ]\}}t  j||qS r"   )r  r  )r   r  r   r=   r"   r#   r   B  s    z%ColPairs.get_cols.<locals>.<listcomp>)zipr  r  r=   r"   r=   r#   r  A  s   
zColPairs.get_colsc                 C   s   |   S ru   )r  r=   r"   r"   r#   r   G  rx   zColPairs.get_source_expressionsc                    s>   t  fdd|D sJ dd |D  _dd |D  _d S )Nc                 3   s&    | ]}t |to|j jkV  qd S ru   )r   r  r  r   r=   r"   r#   r   K  s   $ z2ColPairs.set_source_expressions.<locals>.<genexpr>c                 S   r   r"   )r  r   r|  r"   r"   r#   r   L  r   z3ColPairs.set_source_expressions.<locals>.<listcomp>c                 S   r   r"   )r   r  r"   r"   r#   r   M  r   )r  r  r  r   r"   r=   r#   r   J  s   zColPairs.set_source_expressionsc           	      C   sL   g }g }|   }|D ]}|||\}}|| || q
d||fS )NrM  )r  r   r%  r   r  )	r   r   r   cols_sqlcols_paramsr   r|  r    r!   r"   r"   r#   r   O  s   
zColPairs.as_sqlc                 C   s"   |  || j| j| j| j| jS ru   )r   r   r  r  r  r   r}  r"   r"   r#   r   [  s   zColPairs.relabeled_clonec                 O   r   ru   r"   rz  r"   r"   r#   r2   `  r   zColPairs.resolve_expressionc                 C   s   ||fS ru   r"   r   r"   r"   r#   r   c  rx   zColPairs.select_format)r%   r&   r'   r}   r  r  rH  r  r   r   r   r   r2   r   r`  r"   r"   rE  r#   r   .  s    r   c                       sd   e Zd ZdZ fddZdd Zdd Zdd	 Z	dddZdd Z	dd Z
dd Zdd Z  ZS )Refz~
    Reference to column alias of the query. For example, Ref('sum_cost') in
    qs.annotate(sum_cost=Sum('cost')) query.
    c                    s   t    ||| _| _d S ru   )rD  r}   r   r   )r   r   r   rE  r"   r#   r}   m  s   
zRef.__init__c                 C   r  r  )rG  r   r%   r   r   r=   r"   r"   r#   rH  q  rj  zRef.__repr__c                 C   r  ru   r   r=   r"   r"   r#   r   t  rx   zRef.get_source_expressionsc                 C   r  ru   r  r   r"   r"   r#   r   w  r   zRef.set_source_expressionsNTFc                 C   r   ru   r"   rw  r"   r"   r#   r2   z  s   zRef.resolve_expressionc                 C   s   | j hS ru   )r   r=   r"   r"   r#   r     rx   zRef.get_refsc                 C   s   |   }| j||_|S ru   )r   r   r   )r   r~  r   r"   r"   r#   r     s   zRef.relabeled_clonec                 C   s   |j | jg fS ru   )rP  
quote_namer   r   r"   r"   r#   r     rp  z
Ref.as_sqlc                 C   r  ru   r"   r=   r"   r"   r#   r     r  zRef.get_group_by_colsr   )r%   r&   r'   r(   r}   rH  r   r   r2   r   r   r   r   r`  r"   r"   rE  r#   r  g  s    
r  c                       s<   e Zd ZdZdZdd Z fddZdd Zd	d
 Z  Z	S )ExpressionListz
    An expression containing multiple expressions. Can be used to provide a
    list of expressions as an argument to another expression, like a partition
    clause.
    z%(expressions)sc                 C   s   | j dd | jD S )Nc                 s   r  ru   r  r   r"   r"   r#   r     r  z)ExpressionList.__str__.<locals>.<genexpr>)r  r  r   r=   r"   r"   r#   rI    rx  zExpressionList.__str__c                    s   | j sdS t j|i |S )N) r"   )r   rD  r   rz  rE  r"   r#   r     s   zExpressionList.as_sqlc                 K   s   | j ||fi |S ru   )r   )r   r   r   r   r"   r"   r#   r$     r  zExpressionList.as_sqlitec                 C   $   g }|   D ]	}||  q|S ru   r   r   r   )r   group_by_colsr   r"   r"   r#   r        z ExpressionList.get_group_by_cols)
r%   r&   r'   r(   r  rI  r   r$   r   r`  r"   r"   rE  r#   r    s    r  c                       s$   e Zd ZdZdZ fddZ  ZS )OrderByListFzORDER BY %(expressions)sc                    s$   dd |D }t  j|i | d S )Nc                 s   sB    | ]}t |tr|d  dkrtt|dd ddn|V  qdS )r   r+   r  NTr   )r   r   r   r   r   r"   r"   r#   r     s    
z'OrderByList.__init__.<locals>.<genexpr>)rD  r}   )r   r   r  rE  r"   r#   r}     s   zOrderByList.__init__)r%   r&   r'   r  r  r}   r`  r"   r"   rE  r#   r    s    r  z"django.db.models.ExpressionWrapperc                       sX   e Zd ZdZ fddZdd Zdd Z fdd	Zd
d Zdd Z	e
dd Z  ZS )ExpressionWrapperz
    An expression that can wrap another expression so that it can provide
    extra context to the inner expression, such as the output_field.
    c                    s   t  j|d || _d S rC  r  r  rE  r"   r#   r}     s   
zExpressionWrapper.__init__c                 C      |d | _ d S Nr   r  r   r"   r"   r#   r        z(ExpressionWrapper.set_source_expressionsc                 C   r  ru   r  r=   r"   r"   r#   r     rx   z(ExpressionWrapper.get_source_expressionsc                    s0   t | jtr| j }| j|_| S t  S ru   )r   r   r	  r   r   r   rD  r   r   rE  r"   r#   r     s
   

z#ExpressionWrapper.get_group_by_colsc                 C   s   | | jS ru   )rO  r   r   r"   r"   r#   r     r   zExpressionWrapper.as_sqlc                 C   rm  rn  )rG  r   r%   r   r=   r"   r"   r#   rH    rp  zExpressionWrapper.__repr__c                 C      | j jS ru   )r   r  r=   r"   r"   r#   r       z!ExpressionWrapper.allowed_default)r%   r&   r'   r(   r}   r   r   r   r   rH  r  r  r`  r"   r"   rE  r#   r    s    	r  c                       sL   e Zd ZdZ fddZdd Z fddZ	
d fdd	Zdd Z  Z	S )rv   z1The logical negation of a conditional expression.c                    s   t  j|t d d S rC  )rD  r}   r   r   r  rE  r"   r#   r}     rx  zNegatedExpression.__init__c                 C   
   | j  S ru   )r   r   r=   r"   r"   r#   rw     r   zNegatedExpression.__invert__c                    s~   zt  ||\}}W n ty%   |jj}|jsY dS |td Y S w |jj}|	| j
s8d| d|fS d| |fS )N)z1=1r"   Tz
CASE WHEN z = 0 THEN 1 ELSE 0 ENDzNOT )rD  r   r
   r   rd  &supports_boolean_expr_in_select_clauserO  r4   rP  0conditional_expression_supported_in_where_clauser   )r   r   r   r    r!   rd  rP  rE  r"   r#   r     s   zNegatedExpression.as_sqlNTFc                    s.   t  |||||}t|jddstd|S )NrT   Fz*Cannot negate non-conditional expressions.)rD  r2   rW   r   rt  )r   r   r   r   r   r   r\  rE  r"   r#   r2     s   
z$NegatedExpression.resolve_expressionc                 C   s0   |j jj}|j jjs|| jrd|}||fS NzCASE WHEN {} THEN 1 ELSE 0 END)r   rP  r  rd  r  r   rG  )r   r   r    r!   $expression_supported_in_where_clauser"   r"   r#   r     s   
zNegatedExpression.select_formatr   )
r%   r&   r'   r(   r}   rw   r   r2   r   r`  r"   r"   rE  r#   rv     s    
rv   zdjango.db.models.Whenc                       sl   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 Zedd Z  ZS )Whenz"WHEN %(condition)s THEN %(result)sFNc                    s   |r"|d u rt di |d }}nt|ddr"t |fi |d }}|d u s.t|ddr.|r2tdt|t r=|s=tdt jd d || _| |d | _	d S )NrT   FzLWhen() supports a Q object, a boolean expression, or lookups as a condition.z1An empty Q() can't be used as a When() condition.r{   r   r"   )
r   rW   rt  r   r   rD  r}   	conditionr   r9  )r   r  thenlookupsrE  r"   r#   r}     s   zWhen.__init__c                 C   s   d| j | jf S )NzWHEN %r THEN %rr  r9  r=   r"   r"   r#   rI  +  r?   zWhen.__str__c                 C      d| j j| f S Nz<%s: %s>r   r%   r=   r"   r"   r#   rH  .  r?   zWhen.__repr__c                 C   rJ  ru   r  r=   r"   r"   r#   r   1  r   zWhen.get_source_expressionsc                 C   rL  ru   r  r   r"   r"   r#   r   4  r?   zWhen.set_source_expressionsc                 C   s
   | j jgS ru   )r9  r   r=   r"   r"   r#   r   7  s   
zWhen.get_source_fieldsc                 K   sh   |j |  |}g }|| j\}}||d< || j\}	}
|	|d< |p&| j}|| g |||
R fS )Nr  r9  )rP  rf  rO  r  r9  r  )r   r   r   r  r   template_params
sql_paramscondition_sqlcondition_params
result_sqlresult_paramsr"   r"   r#   r   ;  s   
zWhen.as_sqlc                 C   r  ru   r  r   r"   r"   r#   r   J  s   zWhen.get_group_by_colsc                 C   r^  ru   )r  r  r9  r=   r"   r"   r#   r  Q  r_  zWhen.allowed_defaultNNru   )r%   r&   r'   r  rT   r}   rI  rH  r   r   r   r   r   r   r  r`  r"   r"   rE  r#   r    s    
r  zdjango.db.models.Casec                       s   e Zd ZdZdZdZddd fdd
Zdd	 Zd
d Zdd Z	dd Z
 fddZ	dddZ fddZedd Z  ZS )Casez
    An SQL searched CASE expression:

        CASE
            WHEN n > 0
                THEN 'positive'
            WHEN n < 0
                THEN 'negative'
            ELSE 'zero'
        END
    z#CASE %(cases)s ELSE %(default)s END N)defaultr   c                   sJ   t dd |D stdt | t|| _| |d | _|| _d S )Nc                 s   r   ru   )r   r  )r   caser"   r"   r#   r   h  s    z Case.__init__.<locals>.<genexpr>z.Positional arguments must all be When objects.r   )	r  rt  rD  r}   r4  casesr   r  r  )r   r  r   r   r  rE  r"   r#   r}   g  s   

zCase.__init__c                 C   s    dd dd | jD | jf S )NzCASE %s, ELSE %rrM  c                 s   r  ru   r  )r   r   r"   r"   r#   r   q  r  zCase.__str__.<locals>.<genexpr>)r  r   r  r=   r"   r"   r#   rI  o  s   zCase.__str__c                 C   r  r  r  r=   r"   r"   r#   rH  u  r?   zCase.__repr__c                 C   s   | j | jg S ru   r   r  r=   r"   r"   r#   r   x  r  zCase.get_source_expressionsc                 C   s   |^ | _ | _d S ru   r  r   r"   r"   r#   r   {  rp  zCase.set_source_expressionsc                    s   t   }|jd d  |_|S ru   )rD  r   r   )r   r   rE  r"   r#   r   ~  s   
z	Case.copyc              	   K   s   |j |  | js|| jS i | j|}g }g }| jD ]0}	z	||	\}
}W n ty1   Y q tyB   ||	j\}}Y  nw |	|
 |
| q|| j\}}|s\||fS |p`| j}|||d< ||d< |
| |py|d| j}|| }| jd ur|j | j| }||fS )Nr   r  r  )rP  rf  r   rO  r  r  r
   r   r9  r%  r   case_joinerr  r   r  r   unification_cast_sqlr   )r   r   r   r  r  r   r  
case_partsr  r  case_sqlcase_paramsdefault_sqldefault_paramsr    r"   r"   r#   r     s:   




zCase.as_sqlc                    s   | j s| j S t  S ru   )r   r  r   rD  r=   rE  r"   r#   r     s   

zCase.get_group_by_colsc                 C   s   | j jotdd | jD S )Nc                 s   r  ru   r  )r   case_r"   r"   r#   r     s    
z'Case.allowed_default.<locals>.<genexpr>)r  r  r  r   r=   r"   r"   r#   r    s   zCase.allowed_defaultr  )r%   r&   r'   r(   r  r  r}   rI  rH  r   r   r   r   r   r   r  r`  r"   r"   rE  r#   r  V  s    
!r  c                       s|   e Zd ZdZdZdZdZdZd fdd	Zdd	 Z	d
d Z
dd Z fddZedd Zdd ZdddZdd Z  ZS )Subqueryz
    An explicit subquery. It may contain OuterRef() references to the outer
    query which will be resolved when it is applied to that query.
    z(%(subquery)s)FNTc                    s0   t |d| | _d| j_|| _t | d S )Nr   T)rW   r   r   r   r  rD  r}   )r   querysetr   r  rE  r"   r#   r}     s   zSubquery.__init__c                 C   r  ru   r   r=   r"   r"   r#   r     rx   zSubquery.get_source_expressionsc                 C   r  r  r  r   r"   r"   r#   r     r  zSubquery.set_source_expressionsc                 C   r  ru   )r   r   r=   r"   r"   r#   r     rx   zSubquery._resolve_output_fieldc                    s   t   }|j |_|S ru   )rD  r   r   r   )r   r   rE  r"   r#   r     r   zSubquery.copyc                 C   r  ru   )r   external_aliasesr=   r"   r"   r#   r    r  zSubquery.external_aliasesc                 C   r  ru   )r   get_external_colsr=   r"   r"   r#   r    r   zSubquery.get_external_colsc           	      K   s^   |j |  i | j|}| j||\}}|dd |d< |p&|d| j}|| }||fS )Nr  r:   r   r  )rP  rf  r  r   r   r   r  )	r   r   r   r  r   r  subquery_sqlr  r    r"   r"   r#   r     s   zSubquery.as_sqlc                 C   s   | j j| dS )N)wrapper)r   r   r=   r"   r"   r#   r     r  zSubquery.get_group_by_colsru   )r%   r&   r'   r(   r  r   r  r   r}   r   r   r   r   r  r  r  r   r   r`  r"   r"   rE  r#   r
    s     


r
  c                       s@   e Zd ZdZe ZdZ fddZdd Z	 fddZ
  ZS )	ExistszEXISTS(%(subquery)s)Fc                    s$   t  j|fi | | j | _d S ru   )rD  r}   r   exists)r   r  r   rE  r"   r#   r}     s   zExists.__init__c                 C   s   |j jjs
d|}||fS r  )r   rd  r  rG  r   r"   r"   r#   r     s   

zExists.select_formatc                    sR   zt  j|g|R i |W S  ty(   |jj}|jsY dS |td Y S w )N)z1=0r"   F)rD  r   r
   r   rd  r  rO  r4   )r   r   r&  r   rd  rE  r"   r#   r     s   zExists.as_sql)r%   r&   r'   r  r   r   r   r  r}   r   r   r`  r"   r"   rE  r#   r    s    r  zdjango.db.models.OrderByc                   @   sp   e Zd ZdZdZdZdZdddZdd Zd	d
 Z	dd Z
dddZdd Zdd Zdd Zdd Zdd ZdS )r   z%(expression)s %(ordering)sFTNc                 C   sV   |r|rt d|du s|du rt d|| _|| _|| _t|ds&t d|| _d S )Nz1nulls_first and nulls_last are mutually exclusiveFz7nulls_first and nulls_last values must be True or None.r2   z%expression must be an expression type)r   nulls_first
nulls_lastr   r3   r   )r   r   r   r  r  r"   r"   r#   r}     s   

zOrderBy.__init__c                 C   r  )Nz{}({}, descending={}))rG  r   r%   r   r   r=   r"   r"   r#   rH    s   zOrderBy.__repr__c                 C   r  r  r  r   r"   r"   r#   r     r  zOrderBy.set_source_expressionsc                 C   r  ru   r  r=   r"   r"   r#   r     rx   zOrderBy.get_source_expressionsc                 K   s&  t | jtr4g }g }| j D ]}|  }||g ||\}	}
||	 ||
 qd	||fS |p8| j
}|jjrM| jrEd| }n%| jrLd| }n| jr\| jrW|jjs\d| }n| jrj| jsf|jjsjd| }|j|  || j\}}|| jr~dndd|}||d	9 }||  |fS )
NrM  z%s NULLS LASTz%s NULLS FIRSTz%%(expression)s IS NULL, %sz%%(expression)s IS NOT NULL, %sDESCASC)r   orderingz%(expression)s)r   r   r   r  r   r   rO  r%  r   r  r  rd   supports_order_by_nulls_modifierr  r  r   order_by_nulls_firstrP  rf  countrstrip)r   r   r   r  r   r  r!   r|  r   r    
col_paramsexpression_sqlplaceholdersr"   r"   r#   r     sL   



zOrderBy.as_sqlc                 C   sN   |j js!|j| jr!|  }tt| jdddd|_|||S | ||S )NT)r  F)r  )	rd  r  rP  r  r   r   r  r  r   )r   r   r   r   r"   r"   r#   	as_oracleB  s   zOrderBy.as_oraclec                 C   r  ru   r  r   r"   r"   r#   r   S  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   Y  s   
zOrderBy.reverse_orderingc                 C   
   d| _ d S rA   r  r=   r"   r"   r#   r   c  r   zOrderBy.ascc                 C   r   rg   r  r=   r"   r"   r#   r   f  r   zOrderBy.desc)FNNru   )r%   r&   r'   r  rT   r   r   r}   rH  r   r   r   r  r   r   r   r   r"   r"   r"   r#   r      s    

$
r   c                       sx   e Zd ZdZdZdZ				d fdd	Zdd Zd	d
 Zdd Z	dddZ
 fddZdd Zdd Zdd Z  ZS )Windowz %(expression)s OVER (%(window)s)FTNc                    s   || _ || _|| _t|ddstd|jj | j d ur/t| j tt	fs)| j f| _ t
| j  | _ | jd urVt| jt	tfrCt| j | _nt| jttfrRt| j| _ntdt j|d | |d | _d S )Nr  Fz3Expression '%s' isn't compatible with OVER clauses.zhWindow.order_by must be either a string reference to a field, an expression, or a list or tuple of them.r{   r   )partition_byorder_byframerW   r   r   r%   r   r  r4  r  r  rz   r   rD  r}   r   source_expression)r   r   r"  r#  r$  r   rE  r"   r#   r}   r  s.   


zWindow.__init__c                 C   r  ru   )r%  r   r=   r"   r"   r#   r     rx   zWindow._resolve_output_fieldc                 C   s   | j | j| j| jgS ru   r%  r"  r#  r$  r=   r"   r"   r#   r     r   zWindow.get_source_expressionsc                 C   s   |\| _ | _| _| _d S ru   r&  r   r"   r"   r#   r     rx  zWindow.set_source_expressionsc                 C   s   |j |  |jjstd|| j\}}g d}}| jd ur6| jj||dd\}}	|	| |t
|	7 }| jd urN|| j\}
}|	|
 |t
|7 }| jrd|| j\}}|	| |t
|7 }|ph| j}||d| d g ||R fS )Nz1This backend does not support window expressions.r"   zPARTITION BY %(expressions)s)r   r   r  r  )r   window)rP  rf  rd  supports_over_clauser   rO  r%  r"  r   r%  r  r#  r$  r  r  strip)r   r   r   r  expr_sqlr!   
window_sqlwindow_paramssql_exprr  	order_sqlorder_params	frame_sqlframe_paramsr"   r"   r#   r     s2   







zWindow.as_sqlc                    sT   t | jtjr$|  }| }t |d _|| tt	|
||S | ||S r  )r   r   r   r   r   r   r   r   rD  r!  r$   r   )r   r   r   r   r   rE  r"   r#   r$     s   
zWindow.as_sqlitec                 C   s>   d t| j| jrdt| j ndt| jpdt| jpdS )Nz{} OVER ({}{}{})zPARTITION BY r  )rG  r   r%  r"  r#  r$  r=   r"   r"   r#   rI    s   zWindow.__str__c                 C   r  r  r  r=   r"   r"   r#   rH    r?   zWindow.__repr__c                 C   s8   g }| j r|| j   | jd ur|| j  |S ru   )r"  r   r   r#  )r   r  r"   r"   r#   r     s   
zWindow.get_group_by_cols)NNNNru   )r%   r&   r'   r  r   r   r}   r   r   r   r   r$   rI  rH  r   r`  r"   r"   rE  r#   r!  j  s"    $
!
r!  c                   @   s$   e Zd ZdZdZdZdZdd ZdS )WindowFrameExclusionzCURRENT ROWGROUPTIESz	NO OTHERSc                 C   s   | j j d| j S r  )r   r'   _name_r=   r"   r"   r#   rH    r   zWindowFrameExclusion.__repr__N)r%   r&   r'   CURRENT_ROWr3  r4  	NO_OTHERSrH  r"   r"   r"   r#   r2    s    r2  c                   @   s^   e Zd ZdZdZdddZdd Zdd	 Zd
d Zdd Z	dd Z
dd Zdd Zdd ZdS )WindowFrameaV  
    Model the frame clause in window expressions. There are two types of frame
    clauses which are subclasses, however, all processing and validation (by no
    means intended to be complete) is done here. Thus, providing an end for a
    frame is optional (the default is UNBOUNDED FOLLOWING, which is the last
    row in the frame).
    z7%(frame_type)s BETWEEN %(start)s AND %(end)s%(exclude)sNc                 C   s>   t || _t || _t|ttfst| jj d|| _	d S )Nz3.exclusion must be a WindowFrameExclusion instance.)
r4   r  endr   r   r2  rt  r   r'   	exclusion)r   r  r9  r:  r"   r"   r#   r}     s   


zWindowFrame.__init__c                 C   rL  ru   r  r9  r   r"   r"   r#   r     r?   z"WindowFrame.set_source_expressionsc                 C   rJ  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_typer  r9  exclude)rP  rf  window_frame_start_endr  r   r9  r:  rd  supports_frame_exclusionr   r  r>  r<  )r   r   r   r  r9  r"   r"   r#   r     s"   zWindowFrame.as_sqlc                 C   r  r  r  r=   r"   r"   r#   rH    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=  )r  r   absr   rP  	PRECEDINGr6  	FOLLOWINGUNBOUNDED_PRECEDINGr9  UNBOUNDED_FOLLOWINGr  r>  r<  )r   r  r9  r"   r"   r#   rI  "  s(   

zWindowFrame.__str__c                 C   rn   )Nz3Subclasses must implement window_frame_start_end().rp   r   r   r  r9  r"   r"   r#   r@  ;  rx   z"WindowFrame.window_frame_start_endr  )r%   r&   r'   r(   r  r}   r   r   r<  r   rH  r   rI  r@  r"   r"   r"   r#   r8    s    

r8  c                   @   r   )RowRangeROWSc                 C      |j ||S ru   )rP  window_frame_rows_start_endrG  r"   r"   r#   r@  B  r  zRowRange.window_frame_start_endNr%   r&   r'   r>  r@  r"   r"   r"   r#   rH  ?      rH  c                   @   r   )
ValueRangeRANGEc                 C   rJ  ru   )rP  window_frame_range_start_endrG  r"   r"   r#   r@  I  r  z!ValueRange.window_frame_start_endNrL  r"   r"   r"   r#   rN  F  rM  rN  )cr   r  r,  r  collectionsr   decimalr   enumr   	itertoolsr   typesr   uuidr	   django.core.exceptionsr
   r   r   	django.dbr   r   r   django.db.modelsr   django.db.models.constantsr   django.db.models.query_utilsr   django.utils.deconstructr   django.utils.functionalr   r   django.utils.hashabler   r   r)   ry   rz   r	  rC   r<   rK   rN   rQ   rG   r[   re   r]   r_   rb   rV  rU  rX  rW  _connector_combinationsr4  r6  r:  dr  r7   field_typesr7  r8  r9  r-  rB  r5   rY  rZ  r   ry  r  rq  r  r4   r  r  r  r  r   r  r  r  r  rv   r  r  r
  r  r   r!  r2  r8  rH  rN  r"   r"   r"   r#   <module>   s      Y8	y

	W3/%9]P#''9)$3AY5it
W