o
    i%                    @   sX  d dl Z d dlZd dlZd dlmZ d dlmZ d dlmZ d dl	m
Z
 d dlmZ d dlmZ d dlmZmZmZ d d	lmZmZmZ d d
lmZ d dlmZ d dlmZ d dlmZ d dlm Z m!Z! d dl"m#Z# d dl$m%Z% G dd dZ&G dd dZ'G dd deZ(G dd dZ)eG dd de)e'Z*dd e'j+e'j,e'j-e'j.e'j/fD dd e'j+e'j0e'j,e'j-e'j.e'j/fD dd e'j+e'j0e'j,e'j-e'j.fD dd e'j1e'j2e'j3e'j4e'j5fD d d e'j+e'j0e'j,e'j-e'j.e'j/fD e'j+ej6ej7ej8fej8ej7ej8fej7ej6ej8fej7ej8ej8fej7ej7ej7fej9ej7ej9fej7ej9ej9fgie'j0ej6ej7ej8fej8ej7ej8fej6ej6ej7fej6ej8ej7fej8ej6ej7fej8ej8ej7fej7ej7ej7fej9ej7ej9fej9ej9ej7fg	igZ:ee;Z<d!d" Z=e:D ]Z>e>? D ]\Z@ZAeAD ]\ZBZCZDe=eBe@eCeD q|qvqpejEd#d$d%d& ZFG d'd( d(e&e*ZGG d)d* d*eGZHG d+d, d,eGZIed-d.G d/d0 d0e'ZJG d1d2 d2eJZKG d3d4 d4eJZLG d5d6 d6eJZMed7d.G d8d9 d9e&e*ZNed:d.G d;d< d<e&e*ZOG d=d> d>e*ZPG d?d@ d@e*ZQG dAdB dBe*ZRG dCdD dDe*ZSG dEdF dFe*ZTG dGdH dHe*ZUG dIdJ dJeNZVG dKdL dLeVZWedMd.G dNdO dOe&e*ZXG dPdQ dQeXZYedRd.G dSdT dTe*ZZedUd.G dVdW dWe&e*Z[G dXdY dYe)e'Z\G dZd[ d[e\Z]ed\d.G d]d^ d^e*Z^G d_d` d`e&e*Z_G dadb dbeZ`G dcdd dde*ZaG dedf dfeaZbG dgdh dheaZcdS )i    N)defaultdictDecimal)Enum)chainNoneType)UUID)EmptyResultSet
FieldErrorFullResultSet)DatabaseErrorNotSupportedError
connection)fields)
LOOKUP_SEP)Q)deconstructible)cached_propertyclassproperty)make_hashable)	signaturec                   @      e Zd ZdZdd ZdS )SQLiteNumericMixinzp
    Some expressions with output_field=DecimalField() must be cast to
    numeric to be properly filtered.
    c                 K   s\   | j ||fi |\}}z| j dkrd| }W ||fS W ||fS  ty-   Y ||fS w )NDecimalFieldz(CAST(%s AS NUMERIC)))as_sqloutput_fieldget_internal_typer   )selfcompilerr   extra_contextsqlparams r#   \/var/www/html/formularioweb/env/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r:   MULr   r#   r#   r$   __neg__L      zCombinable.__neg__c                 C      |  || jdS NFr:   ADDr   r7   r#   r#   r$   __add__O   r@   zCombinable.__add__c                 C   rA   rB   r:   SUBrE   r#   r#   r$   __sub__R   r@   zCombinable.__sub__c                 C   rA   rB   r<   rE   r#   r#   r$   __mul__U   r@   zCombinable.__mul__c                 C   rA   rB   r:   DIVrE   r#   r#   r$   __truediv__X   r@   zCombinable.__truediv__c                 C   rA   rB   r:   MODrE   r#   r#   r$   __mod__[   r@   zCombinable.__mod__c                 C   rA   rB   r:   POWrE   r#   r#   r$   __pow__^   r@   zCombinable.__pow__c                 C   s0   t | ddrt |ddrt| t|@ S tdNconditionalFFUse .bitand(), .bitor(), and .bitxor() for bitwise logical operations.getattrr   NotImplementedErrorrE   r#   r#   r$   __and__a   
   zCombinable.__and__c                 C   rA   rB   )r:   BITANDrE   r#   r#   r$   bitandh   r@   zCombinable.bitandc                 C   rA   rB   )r:   BITLEFTSHIFTrE   r#   r#   r$   bitleftshiftk   r@   zCombinable.bitleftshiftc                 C   rA   rB   )r:   BITRIGHTSHIFTrE   r#   r#   r$   bitrightshiftn   r@   zCombinable.bitrightshiftc                 C   s0   t | ddrt |ddrt| t|A S tdrT   rW   rE   r#   r#   r$   __xor__q   r[   zCombinable.__xor__c                 C   rA   rB   )r:   BITXORrE   r#   r#   r$   bitxorx   r@   zCombinable.bitxorc                 C   s0   t | ddrt |ddrt| t|B S tdrT   rW   rE   r#   r#   r$   __or__{   r[   zCombinable.__or__c                 C   rA   rB   )r:   BITORrE   r#   r#   r$   bitor   r@   zCombinable.bitorc                 C   rA   NTrC   rE   r#   r#   r$   __radd__   r@   zCombinable.__radd__c                 C   rA   rh   rG   rE   r#   r#   r$   __rsub__   r@   zCombinable.__rsub__c                 C   rA   rh   r<   rE   r#   r#   r$   __rmul__   r@   zCombinable.__rmul__c                 C   rA   rh   rK   rE   r#   r#   r$   __rtruediv__   r@   zCombinable.__rtruediv__c                 C   rA   rh   rN   rE   r#   r#   r$   __rmod__   r@   zCombinable.__rmod__c                 C   rA   rh   rQ   rE   r#   r#   r$   __rpow__   r@   zCombinable.__rpow__c                 C      t dNrV   rY   rE   r#   r#   r$   __rand__      zCombinable.__rand__c                 C   ro   rp   rq   rE   r#   r#   r$   __ror__   rs   zCombinable.__ror__c                 C   ro   rp   rq   rE   r#   r#   r$   __rxor__   rs   zCombinable.__rxor__c                 C   s   t | S N)NegatedExpressionr>   r#   r#   r$   
__invert__      zCombinable.__invert__N))r&   r'   r(   r)   rD   rH   r=   rL   rR   rO   r\   rf   r^   r`   rc   r:   r?   rF   rI   rJ   rM   rP   rS   rZ   r]   r_   ra   rb   rd   re   rg   ri   rj   rk   rl   rm   rn   rr   rt   ru   rx   r#   r#   r#   r$   r*   &   sN    r*   c                   @   s   e Zd ZdS )OutputFieldIsNoneErrorN)r&   r'   r(   r#   r#   r#   r$   rz      s    rz   c                   @   sn  e Zd ZdZeZdZdZdZdZ	dZ
dZdZdIddZdd Zd	d
 Zdd Zdd Zdd Zdd Zedd Zedd Zedd Zedd Z	dJddZedd Zedd  Zed!d" Zed#d$ Zd%d& Ze d'd( Z!ed)d* Z"d+d, Z#d-d. Z$d/d0 Z%d1d2 Z&d3d4 Z'd5d6 Z(d7d8 Z)d9d: Z*d;d< Z+d=d> Z,d?d@ Z-dAdB Z.dCdD Z/dEdF Z0dGdH Z1dS )KBaseExpressionz%Base class for all query expressions.FTNc                 C   s   |d ur	|| _ d S d S rv   r   r   r   r#   r#   r$   __init__   s   
zBaseExpression.__init__c                 C   s   | j  }|dd  |S )Nconvert_value)__dict__copypop)r   stater#   r#   r$   __getstate__      
zBaseExpression.__getstate__c                 C   s$   | j | ju rg n| j g| j| S rv   )r   _convert_value_noopr   get_db_convertersr   r   r#   r#   r$   r      s
   
z BaseExpression.get_db_convertersc                 C      g S rv   r#   r>   r#   r#   r$   get_source_expressions      z%BaseExpression.get_source_expressionsc                 C   s   |rJ d S rv   r#   r   exprsr#   r#   r$   set_source_expressions      z%BaseExpression.set_source_expressionsc                 G   s   dd |D S )Nc                 S   s4   g | ]}t |d r|nt|trt|nt|qS r3   )r4   
isinstancestrFr5   .0argr#   r#   r$   
<listcomp>   s    z5BaseExpression._parse_expressions.<locals>.<listcomp>r#   )r   expressionsr#   r#   r$   _parse_expressions   s   z!BaseExpression._parse_expressionsc                 C   ro   )a  
        Responsible for returning a (sql, [params]) tuple to be included
        in the current query.

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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





zWindow.as_sqlc                    sT   t | jtjr$|  }| }t |d _|| tt	|
||S | ||S r  )r   r   r   r   r   r   r   r   rD  r'  r%   r   )r   r   r   r   r   rE  r#   r$   r%     s   
zWindow.as_sqlitec                 C   s>   d t| j| jrdt| j ndt| jpdt| jpdS )Nz{} OVER ({}{}{})zPARTITION BY r  )rG  r   r+  r(  r)  r*  r>   r#   r#   r$   rI    s   zWindow.__str__c                 C   r  r  r  r>   r#   r#   r$   rH    r@   zWindow.__repr__c                 C   s8   g }| j r|| j   | jd ur|| j  |S rv   )r(  r   r   r)  )r   r  r#   r#   r$   r     s   
zWindow.get_group_by_cols)NNNNrv   )r&   r'   r(   r  r   r   r~   r   r   r   r   r%   rI  rH  r   r`  r#   r#   rE  r$   r'    s"    $
!
r'  c                   @   s$   e Zd ZdZdZdZdZdd ZdS )WindowFrameExclusionzCURRENT ROWGROUPTIESz	NO OTHERSc                 C   s   | j j d| j S r  )r   r(   _name_r>   r#   r#   r$   rH     r   zWindowFrameExclusion.__repr__N)r&   r'   r(   CURRENT_ROWr9  r:  	NO_OTHERSrH  r#   r#   r#   r$   r8    s    r8  c                   @   s^   e Zd ZdZdZdddZdd Zdd	 Zd
d Zdd Z	dd Z
dd Zdd Zdd ZdS )WindowFrameaV  
    Model the frame clause in window expressions. There are two types of frame
    clauses which are subclasses, however, all processing and validation (by no
    means intended to be complete) is done here. Thus, providing an end for a
    frame is optional (the default is UNBOUNDED FOLLOWING, which is the last
    row in the frame).
    z7%(frame_type)s BETWEEN %(start)s AND %(end)s%(exclude)sNc                 C   s>   t || _t || _t|ttfst| jj d|| _	d S )Nz3.exclusion must be a WindowFrameExclusion instance.)
r5   r  endr   r   r8  rt  r   r(   	exclusion)r   r  r?  r@  r#   r#   r$   r~     s   


zWindowFrame.__init__c                 C   rL  rv   r  r?  r   r#   r#   r$   r     r@   z"WindowFrame.set_source_expressionsc                 C   rJ  rv   rA  r>   r#   r#   r$   r     r   z"WindowFrame.get_source_expressionsc                 C   s   | j d u rdS d| j j S )Nr  z	 EXCLUDE )r@  r   r>   r#   r#   r$   get_exclusion  s   
zWindowFrame.get_exclusionc                 C   sZ   |j |  | || jj| jj\}}| jr|jjst	d| j
| j|||  d g fS )Nz6This backend does not support window frame exclusions.
frame_typer  r?  exclude)rP  rf  window_frame_start_endr  r   r?  r@  rd  supports_frame_exclusionr   r  rD  rB  )r   r   r   r  r?  r#   r#   r$   r   $  s"   zWindowFrame.as_sqlc                 C   r  r  r  r>   r#   r#   r$   rH  8  r@   zWindowFrame.__repr__c                 C   r   rv   r#   r>   r#   r#   r$   r   ;  r   zWindowFrame.get_group_by_colsc                 C   s.  | j jd ur| j jdk rdt| j jtjjf }n,| j jd ur*| j jdkr*tjj}n| j jd urA| j jdkrAd| j jtjjf }ntjj}| j	jd ur\| j	jdkr\d| j	jtjjf }n.| j	jd urm| j	jdkrmtjj}n| j	jd ur| j	jdk rdt| j	jtjjf }ntjj
}| j| j|||  d S )Nr   z%d %srC  )r  r   absr   rP  	PRECEDINGr<  	FOLLOWINGUNBOUNDED_PRECEDINGr?  UNBOUNDED_FOLLOWINGr  rD  rB  )r   r  r?  r#   r#   r$   rI  >  s(   

zWindowFrame.__str__c                 C   ro   )Nz3Subclasses must implement window_frame_start_end().rq   r   r   r  r?  r#   r#   r$   rF  W  ry   z"WindowFrame.window_frame_start_endr  )r&   r'   r(   r)   r  r~   r   r   rB  r   rH  r   rI  rF  r#   r#   r#   r$   r>    s    

r>  c                   @   r   )RowRangeROWSc                 C      |j ||S rv   )rP  window_frame_rows_start_endrM  r#   r#   r$   rF  ^  r  zRowRange.window_frame_start_endNr&   r'   r(   rD  rF  r#   r#   r#   r$   rN  [      rN  c                   @   r   )
ValueRangeRANGEc                 C   rP  rv   )rP  window_frame_range_start_endrM  r#   r#   r$   rF  e  r  z!ValueRange.window_frame_start_endNrR  r#   r#   r#   r$   rT  b  rS  rT  )dr   r  r,  collectionsr   decimalr   enumr   	itertoolsr   typesr   uuidr	   django.core.exceptionsr
   r   r   	django.dbr   r   r   django.db.modelsr   django.db.models.constantsr   django.db.models.query_utilsr   django.utils.deconstructr   django.utils.functionalr   r   django.utils.hashabler   django.utils.inspectr   r   r*   rz   r{   r  rD   r=   rL   rO   rR   rH   r\   rf   r^   r`   rc   rV  rU  rX  rW  _connector_combinationsr4  r6  r:  dr  r8   field_typesr7  r8  r9  r-  rB  r6   rY  rZ  r   r~  r  rq  r  r5   r  r  r  r  r   r  r  r  r  rw   r  r  r  r  r   r'  r8  r>  rN  rT  r#   r#   r#   r$   <module>   s      Y8	y

	W3@%9]P#''9)$3LY5it
W