o
    ^"<f                     @   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	 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)	JSONField)_lazy_re_compilec                       sT   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	 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__ \/var/www/html/kck/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                    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'   __classcell__r   r   r   r   r      s    r   c                       0   e Zd ZdZdZ f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   9      zCoalesce.__init__c                    s\   | j  dkr$|  }|dd |  D  tt|j||fi |S | j||fi |S )N	TextFieldc                 S   s   g | ]}t |d dqS )TO_NCLOB)r,   )r   ).0r   r   r   r   
<listcomp>C   s    z&Coalesce.as_oracle.<locals>.<listcomp>)r	   r#   copyset_source_expressionsget_source_expressionsr
   r/   r   )r   r   r   r   cloner   r   r   r'   >   s   
zCoalesce.as_oracle)r(   r)   r*   r+   r,   r   r'   r-   r   r   r   r   r/   5   s
    r/   c                       s8   e 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)sz	^[\w\-]+$c                    s2   |r| j |std| || _t | d S )NzInvalid collation name: %r.)collation_rematchr5   	collationr
   r   )r   r   rF   r   r   r   r   P   s   zCollate.__init__c                    s,   | d|j| j t j||fi |S )NrF   )
setdefaultops
quote_namerF   r
   r   r   r   r   r   r   V   s   zCollate.as_sql)
r(   r)   r*   r,   r   r   rD   r   r   r-   r   r   r   r   rB   J   s    rB   c                       r.   )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                    r1   )Nr2   z+Greatest must take at least two expressionsr3   r6   r   r   r   r   e   r9   zGreatest.__init__c                       t  j||fddi|S )zUse the MAX function on SQLite.r,   MAXr
   r!   r   r   r   r   r!   j      zGreatest.as_sqliter(   r)   r*   r+   r,   r   r!   r-   r   r   r   r   rJ   [   
    rJ   c                       sB   e Zd ZdZe Z fddZ fddZdd Zdd	 Z	  Z
S )

JSONObjectJSON_OBJECTc                    s8   g }|  D ]\}}|t||f qt j|  d S )N)itemsextendr   r
   r   )r   fieldsr7   keyvaluer   r   r   r   s   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   y   s
   zJSONObject.as_sqlc                 K   s   | j ||fddi|S )Nr,   JSONB_BUILD_OBJECTr   r   r   r   r   as_postgresql   s   zJSONObject.as_postgresqlc                 K   s*   G dd d}| j ||f| dd|S )Nc                   @   s   e Zd Zdd ZdS )z'JSONObject.as_oracle.<locals>.ArgJoinerc                 S   s2   dd t |d d d |dd d D }d|S )Nc                 S   s   g | ]}d  |qS )z VALUE )join)r<   argr   r   r   r=      s    z@JSONObject.as_oracle.<locals>.ArgJoiner.join.<locals>.<listcomp>r2      z, )zipr^   )r   argsr   r   r   r^      s   (
z,JSONObject.as_oracle.<locals>.ArgJoiner.joinN)r(   r)   r*   r^   r   r   r   r   	ArgJoiner   s    rc   z,%(function)s(%(expressions)s RETURNING CLOB))
arg_joinerr   r\   )r   r   r   r   rc   r   r   r   r'      s   zJSONObject.as_oracle)r(   r)   r*   r,   r   r	   r   r   r]   r'   r-   r   r   r   r   rR   o   s    rR   c                       r.   )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                    r1   )Nr2   z(Least must take at least two expressionsr3   r6   r   r   r   r      r9   zLeast.__init__c                    rL   )zUse the MIN function on SQLite.r,   MINrN   r   r   r   r   r!      rO   zLeast.as_sqliterP   r   r   r   r   re      rQ   re   c                       s$   e Zd ZdZdZ fddZ  ZS )NullIfNULLIFr2   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   rX   r5   r
   r   )r   r   r   r   expression1r   r   r   r'      s   zNullIf.as_oracle)r(   r)   r*   r,   arityr'   r-   r   r   r   r   rh      s    rh   N)r+   	django.dbr   django.db.models.expressionsr   r   django.db.models.fields.jsonr   django.utils.regex_helperr   r   r/   rB   rJ   rR   re   rh   r   r   r   r   <module>   s    -(