
    afC!                        d Z ddlmZ ddlmZmZ ddlmZ ddlm	Z	 ddl
mZ  G d de          Z G d	 d
e          Z G d de          Z G d de          Z G d de          Z G d de          Z G d de          ZdS )z;Database functions that do comparisons or type conversions.    )NotSupportedError)FuncValue)	TextField)	JSONField)_lazy_re_compilec                   T     e Zd ZdZdZdZ fdZ fdZ fdZd Z	d Z
 fd	Z xZS )
Castz)Coerce an expression to a new field type.CASTz,%(function)s(%(expressions)s AS %(db_type)s)c                 N    t                                          ||           d S )N)output_field)super__init__)self
expressionr   	__class__s      W/var/www/html/env/lib/python3.11/site-packages/django/db/models/functions/comparison.pyr   zCast.__init__   s&    ,?????    c                 t    | j                             |          |d<    t                      j        ||fi |S )Ndb_type)r   cast_db_typer   as_sqlr   compiler
connectionextra_contextr   s       r   r   zCast.as_sql   s>    #'#4#A#A*#M#Mi uww~h
DDmDDDr   c                 4   | j                             |          }|dv rFd} t                      j        ||fd|i|\  }}|dk    rdnd}|                    d|           ||fS |dk    rd	} t                      j        ||fd|i|S  | j        ||fi |S )
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_sqlitezCast.as_sqlite   s    #++J77***7H(%''.* /7;H KC +2V*;*;JJATMMM!]+++;.H!577>* /7;H   t{8ZAA=AAAr   c                     d }| j                                         }|dk    rd}n|dk    r	|j        rd} | j        ||fd|i|S )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_mysqlzCast.as_mysql(   sf    '99;;,&&0HHK''J,G';Ht{8ZTT(TmTTTr   c                 $     | j         ||fddi|S )Nr    z(%(expressions)s)::%(db_type)sr   )r   r   r   r   s       r   as_postgresqlzCast.as_postgresql3   s9     t{
 
 6
 	
 
 	
r   c                     | j                                         dk    rd} t                      j        ||fd|i|S  | j        ||fi |S )Nr   z JSON_QUERY(%(expressions)s, '$')r    )r   r)   r   r   )r   r   r   r   r    r   s        r   	as_oraclezCast.as_oracle>   st    ..00K??9H!577>* /7;H   t{8ZAA=AAAr   )__name__
__module____qualname____doc__functionr    r   r   r&   r,   r/   r1   __classcell__r   s   @r   r
   r
   	   s        33H=H@ @ @ @ @E E E E EB B B B B$	U 	U 	U	
 	
 	
B B B B B B B B Br   r
   c                   F     e Zd ZdZdZ fdZed             Z fdZ xZ	S )Coalescez:Return, from left to right, the first non-null expression.COALESCEc                 ~    t          |          dk     rt          d           t                      j        |i | d S )N   z+Coalesce must take at least two expressionslen
ValueErrorr   r   r   expressionsextrar   s      r   r   zCoalesce.__init__M   G    {aJKKK+//////r   c                 `    |                                  D ]}|j        }|t          u s||c S d S N)get_source_expressionsempty_result_set_valueNotImplemented)r   r   results      r   rH   zCoalesce.empty_result_set_valueR   sH    5577 	 	J6F''6+= ,>tr   c                 *   | j                                         dk    rg|                                 }|                    d |                                 D                         t          t          |          j        ||fi |S  | j        ||fi |S )Nr   c                 0    g | ]}t          |d           S )TO_NCLOB)r6   )r   ).0r   s     r   
<listcomp>z&Coalesce.as_oracle.<locals>.<listcomp>`   s5       " j999  r   )r   r)   copyset_source_expressionsrG   r   r:   r   )r   r   r   r   cloner   s        r   r1   zCoalesce.as_oracleZ   s     ..00K??IIKKE(( &*&A&A&C&C     155))0:WWWWWt{8ZAA=AAAr   )
r2   r3   r4   r5   r6   r   propertyrH   r1   r7   r8   s   @r   r:   r:   H   s        DDH0 0 0 0 0
   XB B B B B B B B Br   r:   c                   J     e Zd ZdZdZdZ ed          Z fdZ fdZ	 xZ
S )CollateCOLLATEz*%(expressions)s %(function)s %(collation)sFz^[\w-]+$c                     |r| j                             |          st          d|z            || _        t	                                          |           d S )NzInvalid collation name: %r.)collation_rematchr@   	collationr   r   )r   r   rZ   r   s      r   r   zCollate.__init__q   s^     	Hd/55i@@ 	H:YFGGG"$$$$$r   c                     |                     d|j                            | j                              t	                      j        ||fi |S )NrZ   )
setdefaultops
quote_namerZ   r   r   r   s       r   r   zCollate.as_sqlw   sK      jn.G.G.W.WXXXuww~h
DDmDDDr   )r2   r3   r4   r6   r    allowed_defaultr   rX   r   r   r7   r8   s   @r   rU   rU   i   s{        H;HO $#K00L% % % % %E E E E E E E E Er   rU   c                   0     e Zd ZdZdZ fdZ fdZ xZS )Greatestz
    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                 ~    t          |          dk     rt          d           t                      j        |i | d S )Nr=   z+Greatest must take at least two expressionsr>   rA   s      r   r   zGreatest.__init__   rD   r   c                 >     t                      j        ||fddi|S )zUse the MAX function on SQLite.r6   MAXr   r&   r   s       r   r&   zGreatest.as_sqlite   )     uww :WWWWWWr   r2   r3   r4   r5   r6   r   r&   r7   r8   s   @r   ra   ra   |   sk          H0 0 0 0 0
X X X X X X X X Xr   ra   c                   P     e Zd ZdZ e            Z fdZ fdZ fdZd Z	 xZ
S )
JSONObjectJSON_OBJECTc                     g }|                                 D ])\  }}|                    t          |          |f           * t                      j        |  d S rF   )itemsextendr   r   r   )r   fieldsrB   keyvaluer   s        r   r   zJSONObject.__init__   s_     ,,.. 	4 	4JCc

E23333+&&&&r   c                 p    |j         j        st          d           t                      j        ||fi |S )Nz7JSONObject() is not supported on this database backend.)featureshas_json_object_functionr   r   r   r   s       r   r   zJSONObject.as_sql   sH    "; 	#I   uww~h
DDmDDDr   c                     |                                  }|                    d t          |                                          D                         t	          t
          |          j        ||fddi|S )Nc                 b    g | ],\  }}|d z  dk    rt          |t                                n|-S )r=   r   )r
   r   )rN   indexr   s      r   rO   z,JSONObject.as_postgresql.<locals>.<listcomp>   sK       %E: 27aZ---Z  r   r6   JSONB_BUILD_OBJECT)rP   rQ   	enumeraterG   r   rj   r   )r   r   r   r   rP   r   s        r   r/   zJSONObject.as_postgresql   s    yy{{## )243N3N3P3P)Q)Q  	
 	
 	
 .uZ&&-
 
 *
 	
 
 	
r   c                 P     G d d          } | j         ||f |            dd|S )Nc                       e Zd Zd ZdS )'JSONObject.as_oracle.<locals>.ArgJoinerc                     d t          |d d d         |dd d                   D             }d                    |          S )Nc                 8    g | ]}d                      |          S )z VALUE )join)rN   args     r   rO   z@JSONObject.as_oracle.<locals>.ArgJoiner.join.<locals>.<listcomp>   s$    RRR	s++RRRr   r=      z, )zipr   )r   argss     r   r   z,JSONObject.as_oracle.<locals>.ArgJoiner.join   sC    RRs4!9d14a4j7Q7QRRRyy&r   N)r2   r3   r4   r    r   r   	ArgJoinerr|      s#        ' ' ' ' 'r   r   z,%(function)s(%(expressions)s RETURNING CLOB))
arg_joinerr    r.   )r   r   r   r   r   s        r   r1   zJSONObject.as_oracle   sj    	' 	' 	' 	' 	' 	' 	' 	'
 t{
 !y{{C	
 

 
 
 	
r   )r2   r3   r4   r6   r   r   r   r   r/   r1   r7   r8   s   @r   rj   rj      s        H9;;L' ' ' ' 'E E E E E
 
 
 
 

 
 
 
 
 
 
r   rj   c                   0     e Zd ZdZdZ fdZ fdZ xZS )Leastz
    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                 ~    t          |          dk     rt          d           t                      j        |i | d S )Nr=   z(Least must take at least two expressionsr>   rA   s      r   r   zLeast.__init__   sG    {aGHHH+//////r   c                 >     t                      j        ||fddi|S )zUse the MIN function on SQLite.r6   MINrf   r   s       r   r&   zLeast.as_sqlite   rg   r   rh   r8   s   @r   r   r      sk          H0 0 0 0 0
X X X X X X X X Xr   r   c                   &     e Zd ZdZdZ fdZ xZS )NullIfNULLIFr=   c                     |                                  d         }t          |t                    r|j        t	          d           t                      j        ||fi |S )Nr   z2Oracle does not allow Value(None) for expression1.)rG   
isinstancer   rq   r@   r   r   )r   r   r   r   expression1r   s        r   r1   zNullIf.as_oracle   sc    1133A6k5)) 	Sk.?.GQRRRuww~h
DDmDDDr   )r2   r3   r4   r6   arityr1   r7   r8   s   @r   r   r      sK        HEE E E E E E E E Er   r   N)r5   	django.dbr   django.db.models.expressionsr   r   django.db.models.fieldsr   django.db.models.fields.jsonr   django.utils.regex_helperr   r
   r:   rU   ra   rj   r   r   r   r   r   <module>r      s   A A ' ' ' ' ' ' 4 4 4 4 4 4 4 4 - - - - - - 2 2 2 2 2 2 6 6 6 6 6 6<B <B <B <B <B4 <B <B <B~B B B B Bt B B BBE E E E Ed E E E&X X X X Xt X X X*,
 ,
 ,
 ,
 ,
 ,
 ,
 ,
^X X X X XD X X X*E E E E ET E E E E Er   