
    h#                         S r SSKJr  SSKJrJr  SSKJr  SSK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 " S S\5      rg)z;Database functions that do comparisons or type conversions.    )NotSupportedError)FuncValue)	TextField)	JSONField)_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      W/var/www/html/env/lib/python3.13/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;   a6  Sn[        T	U ]  " X4SU0UD6u  pgUS:X  a  SOSnUR	                  SU5        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:%fr   datezdate(%(expressions)s))r   r   r   r   insert)
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MM!]+;.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)r   z"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_postgresql4   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)   r0   r5   r8   __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$ )CoalesceI   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__N   .    {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   rU   Coalesce.empty_result_set_valueS   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 )Nr   TO_NCLOB)r@   )	r   r-   copyset_source_expressionsrT   r   r   rE   r   )r   r   r   r   cloner   r   s         r   r8   Coalesce.as_oracle[   s     ..0K?IIKE(( '+&A&A&C&C
 j9&C 50WWW{{8A=AAs   Br:   )r;   r<   r=   r>   r?   r@   r   propertyrU   r8   rA   rB   rC   s   @r   rE   rE   I   s0    DH0
  B Br   rE   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$ )	Collatej   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matchrL   	collationr   r   )r   r   rg   r   s      r   r   Collate.__init__r   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$ )Nrg   )
setdefaultops
quote_namerg   r   r   r   s       r   r   Collate.as_sqlx   s:      jnn.G.G.WXw~hDmDDr   )rg   )r;   r<   r=   r>   r@   r#   allowed_defaultr   re   r   r   rA   rB   rC   s   @r   ra   ra   j   s/    H;HO $K0L%E Er   ra   c                   <   ^  \ rS rSrSrSrU 4S jrU 4S jrSrU =r	$ )Greatest}   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 )NrI   z+Greatest must take at least two expressionsrJ   rM   s      r   r   Greatest.__init__   rQ   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   r:   
r;   r<   r=   r>   r?   r@   r   r)   rA   rB   rC   s   @r   rp   rp   }   s      H0
X Xr   rp   c                   ^   ^  \ rS rSrSr\" 5       rU 4S jrU 4S jrS r	U 4S jr
S rSrU =r$ )	
JSONObject   JSON_OBJECTc                    > / nUR                  5        H!  u  p4UR                  [        U5      U45        M#     [        TU ]  " U6   g rS   )itemsextendr   r   r   )r   fieldsrN   keyvaluer   s        r   r   JSONObject.__init__   s>     ,,.JCc
E23 )+&r   c                 r   > UR                   R                  (       d  [        S5      e[        TU ]  " X40 UD6$ )Nz7JSONObject() is not supported on this database backend.)featureshas_json_object_functionr   r   r   r   s       r   r   JSONObject.as_sql   s8    "";;#I  w~hDmDDr   c                V     " S S5      nU R                   " UU4U" 5       SU S3S.UD6$ )Nc                       \ rS rSrS rSrg)'JSONObject.as_native.<locals>.ArgJoiner   c                     [        US S S2   USS S2   SS9nSR                  U Vs/ s H  nSR                  U5      PM     sn5      $ s  snf )NrI      T)strictz, z VALUE )zipjoin)r   argspairspairs       r   r   ,JSONObject.as_native.<locals>.ArgJoiner.join   sL    D1ItADqDz$?yy5!I54).."65!IJJ!Is   A	r:   N)r;   r<   r=   r>   r   rA   r:   r   r   	ArgJoinerr      s    Kr   r   z'%(function)s(%(expressions)s RETURNING ))
arg_joinerr#   r3   )r   r   r   	returningr   r   s         r   	as_nativeJSONObject.as_native   sI    	K 	K
 {{
 !{>ykK	

 
 	
r   c                   > UR                   R                  (       a  UR                   R                  (       a  U R                  5       nUR	                  [        UR                  5       5       VVs/ s H$  u  pVUS-  S:X  a  [        U[        5       5      OUPM&     snn5        [        [        U].  " UU4SS0UD6$ U R                  " X4SS0UD6$ s  snnf )NrI   r   r@   JSONB_BUILD_OBJECTr   JSONB)r   is_postgresql_16uses_server_side_bindingr[   r\   	enumeraterT   r
   r   r   r|   r   r   )r   r   r   r   r[   indexr   r   s          r   r5   JSONObject.as_postgresql   s    ##44"";;99;D'' .7t7R7R7T-U-U) 6;QY!^DY[1S-U T1 .  	  ~~hWgWWWs   /+C
c                 ,    U R                   " X4SS0UD6$ )Nr   CLOB)r   r4   s       r   r8   JSONObject.as_oracle   s    ~~hVfVVVr   r:   )r;   r<   r=   r>   r@   r   r   r   r   r   r5   r8   rA   rB   rC   s   @r   r|   r|      s1    H;L'E
X(W W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	$ )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 )NrI   z(Least must take at least two expressionsrJ   rM   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@   MINrw   r   s       r   r)   Least.as_sqlite   ry   r   r:   rz   rC   s   @r   r   r      s      H0
X Xr   r   c                   0   ^  \ rS rSrSrSrU 4S jrSrU =r$ )NullIf   NULLIFrI   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.)rT   
isinstancer   r   rL   r   r   )r   r   r   r   expression1r   s        r   r8   NullIf.as_oracle   sN    113A6k5))k.?.?.GQRRw~hDmDDr   r:   )	r;   r<   r=   r>   r@   arityr8   rA   rB   rC   s   @r   r   r      s    HEE Er   r   N)r?   	django.dbr   django.db.models.expressionsr   r   django.db.models.fieldsr   django.db.models.fields.jsonr   django.utils.regex_helperr   r
   rE   ra   rp   r|   r   r   r:   r   r   <module>r      s|    A ' 4 - 2 6<B4 <B~Bt BBEd E&Xt X*4W 4WnXD X*ET Er   