
    MȂi                         S r SSKJrJr  SSKJr   " S S\5      r " S S\5      r " S S	\5      r " S
 S\5      r	 " S S\5      r
 " S S\5      rg)z;Database functions that do comparisons or type conversions.    )FuncValue)_lazy_re_compilec                   d   ^  \ rS rSrSrSrSrU 4S jrU 4S jrU 4S jr	S r
S	 rU 4S
 jrSrU =r$ )Cast   z)Coerce an expression to a new field type.CASTz,%(function)s(%(expressions)s AS %(db_type)s)c                     > [         TU ]  XS9  g )N)output_field)super__init__)self
expressionr   	__class__s      VD:\sksbv-state-backend\venv\Lib\site-packages\django/db/models/functions/comparison.pyr   Cast.__init__   s    ?    c                 b   > U R                   R                  U5      US'   [        TU ]  " X40 UD6$ )Ndb_type)r   cast_db_typer   as_sqlr   compiler
connectionextra_contextr   s       r   r   Cast.as_sql   s2    #'#4#4#A#A*#Mi w~hDmDDr   c                    > U R                   R                  U5      nUS;   a*  Sn[        T	U ]  " X4SU0UD6u  pgUS:X  a  SOSnU/UQ7nXg4$ US:X  a  Sn[        T	U ]  " X4SU0UD6$ U R                  " X40 UD6$ )	N>   timedatetimezstrftime(%%s, %(expressions)s)templater   z%H:%M:%fz%Y-%m-%d %H:%M:%fdatezdate(%(expressions)s))r   r   r   r   )
r   r   r   r   r   r    sqlparamsformat_stringr   s
            r   	as_sqliteCast.as_sqlite   s    ##++J7**7H'./7;HKC +2V*;JATM#-f-F;.H7>/7;H  {{8A=AAr   c                     S nU R                   R                  5       nUS:X  a  SnOUS:X  a  UR                  (       a  SnU R                  " X4SU0UD6$ )N
FloatFieldz(%(expressions)s + 0.0)	JSONFieldz"JSON_EXTRACT(%(expressions)s, '$')r    )r   get_internal_typemysql_is_mariadbr   )r   r   r   r   r    output_types         r   as_mysqlCast.as_mysql&   sV    ''99;,&0HK'J,G,G;H{{8T(TmTTr   c                 .    U R                   " UU4SS0UD6$ )Nr    z(%(expressions)s)::%(db_type)s)r   )r   r   r   r   s       r   as_postgresqlCast.as_postgresql1   s/     {{
 6
 	
 	
r   c                    > U R                   R                  5       S:X  a  Sn[        TU ]  " X4SU0UD6$ U R                  " X40 UD6$ )Nr)   z JSON_QUERY(%(expressions)s, '$')r    )r   r*   r   r   )r   r   r   r   r    r   s        r   	as_oracleCast.as_oracle<   sY    ..0K?9H7>/7;H  {{8A=AAr    )__name__
__module____qualname____firstlineno____doc__functionr    r   r   r%   r-   r0   r3   __static_attributes____classcell__r   s   @r   r   r      s9    3H=H@EB$	U	
B Br   r   c                   L   ^  \ rS rSrSrSrU 4S jr\S 5       rU 4S jr	Sr
U =r$ )CoalesceF   z:Return, from left to right, the first non-null expression.COALESCEc                 Z   > [        U5      S:  a  [        S5      e[        TU ]  " U0 UD6  g )N   z+Coalesce must take at least two expressionslen
ValueErrorr   r   r   expressionsextrar   s      r   r   Coalesce.__init__K   .    {aJKK+//r   c                 j    U R                  5        H  nUR                  nU[        L d  Uc  M  Us  $    g )N)get_source_expressionsempty_result_set_valueNotImplemented)r   r   results      r   rO   Coalesce.empty_result_set_valueP   s7    557J66F'6+= 8 r   c           
      (  > U R                   R                  5       S:X  a\  U R                  5       nUR                  U R	                  5        Vs/ sH  n[        USS9PM     sn5        [        [        U]"  " X40 UD6$ U R                  " X40 UD6$ s  snf )N	TextFieldTO_NCLOB)r;   )	r   r*   copyset_source_expressionsrN   r   r   r@   r   )r   r   r   r   cloner   r   s         r   r3   Coalesce.as_oracleX   s     ..0K?IIKE(( '+&A&A&C&C
 j9&C 50WWW{{8A=AAs   Br5   )r6   r7   r8   r9   r:   r;   r   propertyrO   r3   r<   r=   r>   s   @r   r@   r@   F   s0    DH0
  B Br   r@   c                   P   ^  \ rS rSrSrSrSr\" S5      rU 4S jr	U 4S jr
SrU =r$ )	Collateg   COLLATEz*%(expressions)s %(function)s %(collation)sFz^[\w-]+$c                    > U(       a   U R                   R                  U5      (       d  [        SU-  5      eX l        [        TU ]  U5        g )NzInvalid collation name: %r.)collation_rematchrG   	collationr   r   )r   r   rb   r   s      r   r   Collate.__init__o   s?    d//55i@@:YFGG"$r   c                    > UR                  SUR                  R                  U R                  5      5        [        TU ]  " X40 UD6$ )Nrb   )
setdefaultops
quote_namerb   r   r   r   s       r   r   Collate.as_sqlu   s:      jnn.G.G.WXw~hDmDDr   )rb   )r6   r7   r8   r9   r;   r    allowed_defaultr   r`   r   r   r<   r=   r>   s   @r   r\   r\   g   s/    H;HO $K0L%E Er   r\   c                   <   ^  \ rS rSrSrSrU 4S jrU 4S jrSrU =r	$ )Greatestz   z
Return the maximum expression.

If any expression is null the return value is database-specific:
On PostgreSQL, the maximum not-null expression is returned.
On MySQL, Oracle, and SQLite, if any expression is null, null is returned.
GREATESTc                 Z   > [        U5      S:  a  [        S5      e[        TU ]  " U0 UD6  g )NrD   z+Greatest must take at least two expressionsrE   rH   s      r   r   Greatest.__init__   rL   r   c                 *   > [         TU ]  " X4SS0UD6$ )zUse the MAX function on SQLite.r;   MAXr   r%   r   s       r   r%   Greatest.as_sqlite       w WWWWr   r5   
r6   r7   r8   r9   r:   r;   r   r%   r<   r=   r>   s   @r   rk   rk   z   s      H0
X Xr   rk   c                   <   ^  \ rS rSrSrSrU 4S jrU 4S jrSrU =r	$ )Least   z
Return the minimum expression.

If any expression is null the return value is database-specific:
On PostgreSQL, return the minimum not-null expression.
On MySQL, Oracle, and SQLite, if any expression is null, return null.
LEASTc                 Z   > [        U5      S:  a  [        S5      e[        TU ]  " U0 UD6  g )NrD   z(Least must take at least two expressionsrE   rH   s      r   r   Least.__init__   s.    {aGHH+//r   c                 *   > [         TU ]  " X4SS0UD6$ )zUse the MIN function on SQLite.r;   MINrr   r   s       r   r%   Least.as_sqlite   rt   r   r5   ru   r>   s   @r   rw   rw      s      H0
X Xr   rw   c                   0   ^  \ rS rSrSrSrU 4S jrSrU =r$ )NullIf   NULLIFrD   c                    > U R                  5       S   n[        U[        5      (       a  UR                  c  [	        S5      e[
        TU ]  " X40 UD6$ )Nr   z2Oracle does not allow Value(None) for expression1.)rN   
isinstancer   valuerG   r   r   )r   r   r   r   expression1r   s        r   r3   NullIf.as_oracle   sN    113A6k5))k.?.?.GQRRw~hDmDDr   r5   )	r6   r7   r8   r9   r;   arityr3   r<   r=   r>   s   @r   r   r      s    HEE Er   r   N)r:   django.db.models.expressionsr   r   django.utils.regex_helperr   r   r@   r\   rk   rw   r   r5   r   r   <module>r      sd    A 4 6<B4 <B~Bt BBEd E&Xt X*XD X*ET Er   