o
    <g#                     @   s   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 deZG d	d
 d
eZG dd deZG dd deZG dd deZG dd deZG dd deZdS )z;Database functions that do comparisons or type conversions.    )NotSupportedError)FuncValue)	TextField)	JSONField)_lazy_re_compilec                       s\   e Zd ZdZdZdZ fddZ fddZ fdd	Zd
d Z	dd Z
 fddZ  ZS )Castz)Coerce an expression to a new field type.CASTz,%(function)s(%(expressions)s AS %(db_type)s)c                    s   t  j||d d S )N)output_field)super__init__)self
expressionr
   	__class__ X/var/www/html/venv/lib/python3.10/site-packages/django/db/models/functions/comparison.pyr      s   zCast.__init__c                    s&   | j ||d< t j||fi |S )Ndb_type)r
   cast_db_typer   as_sqlr   compiler
connectionextra_contextr   r   r   r      s   zCast.as_sqlc           	         s   | j |}|dv r-d}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   r   r   	as_sqlite   s.   
zCast.as_sqlitec                 K   sF   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_typer   r   r   as_mysql)   s   
zCast.as_mysqlc                 K      | j ||fddi|S )Nr   z(%(expressions)s)::%(db_type)sr   r   r   r   r   as_postgresql4   s   zCast.as_postgresqlc                    s@   | 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   r   r   	as_oracle?   s   zCast.as_oracle)__name__
__module____qualname____doc__functionr   r   r   r"   r'   r*   r+   __classcell__r   r   r   r   r   
   s    r   c                       s<   e Zd ZdZdZ fddZedd Z fddZ  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   r   r   r   N      zCoalesce.__init__c                 C   s0   |   D ]}|j}|tu s|d ur|  S qd S N)get_source_expressionsempty_result_set_valueNotImplemented)r   r   resultr   r   r   r?   S   s   zCoalesce.empty_result_set_valuec                    s\   | j  dkr$|  }|dd |  D  tt|j||fi |S | j||fi |S )Nr   c                 S   s   g | ]}t |d dqS )TO_NCLOB)r0   )r   ).0r   r   r   r   
<listcomp>a   s    
z&Coalesce.as_oracle.<locals>.<listcomp>)r
   r$   copyset_source_expressionsr>   r   r2   r   )r   r   r   r   cloner   r   r   r+   [   s   zCoalesce.as_oracle)
r,   r-   r.   r/   r0   r   propertyr?   r+   r1   r   r   r   r   r2   I   s    
r2   c                       s<   e Zd ZdZdZdZedZ fddZ fddZ	  Z
S )	CollateCOLLATEz*%(expressions)s %(function)s %(collation)sFz^[\w-]+$c                    s2   |r| j |std| || _t | d S )NzInvalid collation name: %r.)collation_rematchr8   	collationr   r   )r   r   rM   r   r   r   r   r   s   zCollate.__init__c                    s,   | d|j| j t j||fi |S )NrM   )
setdefaultops
quote_namerM   r   r   r   r   r   r   r   x   s   zCollate.as_sql)r,   r-   r.   r0   r   allowed_defaultr   rK   r   r   r1   r   r   r   r   rI   j   s    rI   c                       0   e Zd ZdZdZ fddZ fddZ  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                    r4   )Nr5   z+Greatest must take at least two expressionsr6   r9   r   r   r   r      r<   zGreatest.__init__c                       t  j||fddi|S )zUse the MAX function on SQLite.r0   MAXr   r"   r   r   r   r   r"         zGreatest.as_sqliter,   r-   r.   r/   r0   r   r"   r1   r   r   r   r   rS   }   
    rS   c                       sN   e Zd ZdZe Z fddZ fddZdd Z fdd	Z	d
d Z
  ZS )
JSONObjectJSON_OBJECTc                    s8   g }|  D ]\}}|t||f qt j|  d S r=   )itemsextendr   r   r   )r   fieldsr:   keyvaluer   r   r   r      s   zJSONObject.__init__c                    s&   |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   r   r   r   r      s
   zJSONObject.as_sqlc                K   s2   G dd d}| j ||f| d| dd|S )Nc                   @   s   e Zd Zdd ZdS )z'JSONObject.as_native.<locals>.ArgJoinerc                 S   s6   t |d d d |dd d dd}ddd |D S )Nr5      T)strictz, c                 S   s   g | ]}d  |qS )z VALUE )join)rC   pairr   r   r   rD      s    z@JSONObject.as_native.<locals>.ArgJoiner.join.<locals>.<listcomp>)ziprf   )r   argspairsr   r   r   rf      s   "z,JSONObject.as_native.<locals>.ArgJoiner.joinN)r,   r-   r.   rf   r   r   r   r   	ArgJoiner   s    rk   z'%(function)s(%(expressions)s RETURNING ))
arg_joinerr   r)   )r   r   r   	returningr   rk   r   r   r   	as_native   s   
zJSONObject.as_nativec                    sj   |j jr|j jr)|  }|dd t| D  tt|j	||fddi|S | j
||fddi|S )Nc                 S   s,   g | ]\}}|d  dkrt |t n|qS )r5   r   )r   r   )rC   indexr   r   r   r   rD      s    z,JSONObject.as_postgresql.<locals>.<listcomp>r0   JSONB_BUILD_OBJECTrn   JSONB)rb   is_postgresql_16uses_server_side_bindingrE   rF   	enumerater>   r   r[   r   ro   )r   r   r   r   rE   r   r   r   r*      s&   

zJSONObject.as_postgresqlc                 K   r(   )Nrn   CLOB)ro   r   r   r   r   r+      s   zJSONObject.as_oracle)r,   r-   r.   r0   r   r
   r   r   ro   r*   r+   r1   r   r   r   r   r[      s    r[   c                       rR   )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                    r4   )Nr5   z(Least must take at least two expressionsr6   r9   r   r   r   r      r<   zLeast.__init__c                    rU   )zUse the MIN function on SQLite.r0   MINrW   r   r   r   r   r"      rX   zLeast.as_sqliterY   r   r   r   r   rw      rZ   rw   c                       s$   e Zd ZdZdZ fddZ  ZS )NullIfNULLIFr5   c                    s>   |   d }t|tr|jd u rtdt j||fi |S )Nr   z2Oracle does not allow Value(None) for expression1.)r>   
isinstancer   ra   r8   r   r   )r   r   r   r   expression1r   r   r   r+      s   zNullIf.as_oracle)r,   r-   r.   r0   arityr+   r1   r   r   r   r   rz      s    rz   N)r/   	django.dbr   django.db.models.expressionsr   r   django.db.models.fieldsr   django.db.models.fields.jsonr   django.utils.regex_helperr   r   r2   rI   rS   r[   rw   rz   r   r   r   r   <module>   s    ?!7