
    Hwg(!                         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y)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                 (    t         |   ||       y )N)output_field)super__init__)self
expressionr   	__class__s      \/var/www/horilla/myenv/lib/python3.12/site-packages/django/db/models/functions/comparison.pyr   zCast.__init__   s    ,?    c                 b    | j                   j                  |      |d<   t        |   ||fi |S )Ndb_type)r   cast_db_typer   as_sqlr   compiler
connectionextra_contextr   s       r   r   zCast.as_sql   s4    #'#4#4#A#A*#Mi w~h
DmDDr   c                    | j                   j                  |      }|dv r7d}t        	|   ||fd|i|\  }}|dk(  rdnd}|j	                  d|       ||fS |dk(  rd	}t        	|   ||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**7H'.*/7;HKC +2V*;JATMMM!]+;.H7>*/7;H  t{{8ZA=AAr   c                     d }| j                   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(   sZ    ''99;,&0HK'J,G,G;Ht{{8ZT(Tm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   s1     t{{
 6
 	
 	
r   c                     | j                   j                         dk(  rd}t        |   ||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>   s_    ..0K?9H7>*/7;H  t{{8ZA=AAr   )__name__
__module____qualname____doc__functionr    r   r   r&   r,   r/   r1   __classcell__r   s   @r   r
   r
   	   s9    3H=H@EB$	U	
B Br   r
   c                   @     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                 V    t        |      dk  rt        d      t        |   |i | y )N   z+Coalesce must take at least two expressionslen
ValueErrorr   r   r   expressionsextrar   s      r   r   zCoalesce.__init__M   .    {aJKK+//r   c                 b    | j                         D ]  }|j                  }|t        u s||c S  y N)get_source_expressionsempty_result_set_valueNotImplemented)r   r   results      r   rH   zCoalesce.empty_result_set_valueR   s<    557 	J66F'6+=	 r   c           	      *   | j                   j                         dk(  r]| j                         }|j                  | j	                         D cg c]  }t        |d       c}       t        t        |"  ||fi |S  | j                  ||fi |S c c}w )Nr   TO_NCLOB)r6   )	r   r)   copyset_source_expressionsrG   r   r   r:   r   )r   r   r   r   cloner   r   s         r   r1   zCoalesce.as_oracleZ   s     ..0K?IIKE(( '+&A&A&C" j9 50:WWWt{{8ZA=AAs   B)
r2   r3   r4   r5   r6   r   propertyrH   r1   r7   r8   s   @r   r:   r:   H   s0    DH0
  B Br   r:   c                   @     e 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)sz	^[\w\-]+$c                     |r| j                   j                  |      st        d|z        || _        t        |   |       y )NzInvalid collation name: %r.)collation_rematchr@   	collationr   r   )r   r   rW   r   s      r   r   zCollate.__init__p   s>    d//55i@:YFGG"$r   c                     |j                  d|j                  j                  | j                               t	        |   ||fi |S )NrW   )
setdefaultops
quote_namerW   r   r   r   s       r   r   zCollate.as_sqlv   s<      jnn.G.G.WXw~h
DmDDr   )
r2   r3   r4   r6   r    r   rU   r   r   r7   r8   s   @r   rR   rR   i   s*    H;H $L1L%E Er   rR   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                 V    t        |      dk  rt        d      t        |   |i | y )Nr=   z+Greatest must take at least two expressionsr>   rA   s      r   r   zGreatest.__init__   rD   r   c                 *    t        |   ||fddi|S )zUse the MAX function on SQLite.r6   MAXr   r&   r   s       r   r&   zGreatest.as_sqlite       w :WWWWr   r2   r3   r4   r5   r6   r   r&   r7   r8   s   @r   r]   r]   {   s      H0
X Xr   r]   c                   J     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 }|j                         D ]!  \  }}|j                  t        |      |f       # t        |   |  y rF   )itemsextendr   r   r   )r   fieldsrB   keyvaluer   s        r   r   zJSONObject.__init__   sE     ,,. 	4JCc
E23	4+&r   c                 h    |j                   j                  st        d      t        |   ||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   s:    "";;#I  w~h
DmDDr   c                    | j                         }|j                  t        |j                               D cg c]#  \  }}|dz  dk(  rt	        |t                     n|% c}}       t        t        |"  ||fddi|S c c}}w )Nr=   r   r6   JSONB_BUILD_OBJECT)	rM   rN   	enumeraterG   r
   r   r   rf   r   )r   r   r   r   rM   indexr   r   s          r   r/   zJSONObject.as_postgresql   s    yy{## *343N3N3P)Q%E: 27aZ-ZO	
 Z-
 *
 	
 	
s   (B 
c                 N     G d d      } | j                   ||f |       dd|S )Nc                       e Zd Zd Zy)'JSONObject.as_oracle.<locals>.ArgJoinerc                     t        |d d d   |dd d         D cg c]  }dj                  |       }}dj                  |      S c c}w )Nr=      z VALUE z, )zipjoin)r   argsargs      r   r{   z,JSONObject.as_oracle.<locals>.ArgJoiner.join   sK    7:4!9d14a4j7QR	s+RRyy& Ss   AN)r2   r3   r4   r{    r   r   	ArgJoinerrw      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   s@    	' 	'
 t{{
 !{C	

 
 	
r   )r2   r3   r4   r6   r   r   r   r   r/   r1   r7   r8   s   @r   rf   rf      s$    H;L'E

r   rf   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                 V    t        |      dk  rt        d      t        |   |i | y )Nr=   z(Least must take at least two expressionsr>   rA   s      r   r   zLeast.__init__   s.    {aGHH+//r   c                 *    t        |   ||fddi|S )zUse the MIN function on SQLite.r6   MINrb   r   s       r   r&   zLeast.as_sqlite   rc   r   rd   r8   s   @r   r   r      s      H0
X Xr   r   c                   &     e Zd ZdZdZ fdZ xZS )NullIfNULLIFr=   c                     | j                         d   }t        |t              r|j                  t	        d      t        |   ||fi |S )Nr   z2Oracle does not allow Value(None) for expression1.)rG   
isinstancer   rm   r@   r   r   )r   r   r   r   expression1r   s        r   r1   zNullIf.as_oracle   sM    113A6k5)k.?.?.GQRRw~h
DmDDr   )r2   r3   r4   r6   arityr1   r7   r8   s   @r   r   r      s    H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:   rR   r]   rf   r   r   r~   r   r   <module>r      sz    A ' 4 - 2 6<B4 <B~Bt BBEd E$Xt X*,
 ,
^XD X*ET Er   