
    sgh                         d Z ddlmZ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y)z;Database functions that do comparisons or type conversions.    )FuncValue)_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      i/var/www/enzed_healthcare/enzed_env/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)	JSONFieldz"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_postgresql1   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,   r.   __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__K   .    {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   rD   zCoalesce.empty_result_set_valueP   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 )N	TextFieldTO_NCLOB)r3   )	r
   r'   copyset_source_expressionsrC   r   r   r7   r   )r   r   r   r   cloner   r   s         r   r.   zCoalesce.as_oracleX   s     ..0K?IIKE(( '+&A&A&C" j9 50:WWWt{{8ZA=AAs   B)
r/   r0   r1   r2   r3   r   propertyrD   r.   r4   r5   s   @r   r7   r7   F   s0    DH0
  B Br   r7   c                   D     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                   j                  |      st        d|z        || _        t        |   |       y )NzInvalid collation name: %r.)collation_rematchr=   	collationr   r   )r   r   rT   r   s      r   r   zCollate.__init__o   s>    d//55i@:YFGG"$r   c                     |j                  d|j                  j                  | j                               t	        |   ||fi |S )NrT   )
setdefaultops
quote_namerT   r   r   r   s       r   r   zCollate.as_sqlu   s<      jnn.G.G.WXw~h
DmDDr   )r/   r0   r1   r3   r   allowed_defaultr   rR   r   r   r4   r5   s   @r   rO   rO   g   s/    H;HO $K0L%E Er   rO   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;   r>   s      r   r   zGreatest.__init__   rA   r   c                 *    t        |   ||fddi|S )zUse the MAX function on SQLite.r3   MAXr   r#   r   s       r   r#   zGreatest.as_sqlite       w :WWWWr   r/   r0   r1   r2   r3   r   r#   r4   r5   s   @r   r[   r[   z   s      H0
X Xr   r[   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;   r>   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.r3   MINr`   r   s       r   r#   zLeast.as_sqlite   ra   r   rb   r5   s   @r   rd   rd      s      H0
X Xr   rd   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.)rC   
isinstancer   valuer=   r   r   )r   r   r   r   expression1r   s        r   r.   zNullIf.as_oracle   sM    113A6k5)k.?.?.GQRRw~h
DmDDr   )r/   r0   r1   r3   arityr.   r4   r5   s   @r   rj   rj      s    HEE Er   rj   N)r2   django.db.models.expressionsr   r   django.utils.regex_helperr   r   r7   rO   r[   rd   rj    r   r   <module>rt      sd    A 4 6<B4 <B~Bt BBEd E&Xt X*XD X*ET Er   