U
    e(!                     @   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.Z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/htmlvenv/lib/python3.8/site-packages/django/db/models/functions/comparison.pyr      s    zCast.__init__c                    s"   | j ||d< t j||f|S )Ndb_type)r	   Zcast_db_typer
   as_sqlr   compiler
connectionextra_contextr   r   r   r      s    zCast.as_sqlc           	         s   | j |}|dkrZd}t j||fd|i|\}}|dkrBdnd}|d| ||fS |dkrd	}t j||fd|i|S | j||f|S )
N>   datetimetimez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   s2     
 zCast.as_sqlitec                 K   sF   d }| j  }|dkrd}n|dkr.|jr.d}| j||fd|i|S )NZ
FloatFieldz(%(expressions)s + 0.0)r   z"JSON_EXTRACT(%(expressions)s, '$')r   )r	   get_internal_typeZmysql_is_mariadbr   )r   r   r   r   r   output_typer   r   r   as_mysql(   s    
zCast.as_mysqlc                 K   s   | j ||fddi|S )Nr   z(%(expressions)s)::%(db_type)sr   r   r   r   r   as_postgresql3   s    zCast.as_postgresqlc                    s<   | j  dkr,d}t j||fd|i|S | j||f|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.ZCOALESCEc                    s&   t |dk rtdt j|| d S )N   z+Coalesce must take at least two expressionslen
ValueErrorr
   r   r   expressionsextrar   r   r   r   M   s    zCoalesce.__init__c                 C   s0   |   D ]"}|j}|tks"|d k	r|  S qd S N)get_source_expressionsempty_result_set_valueNotImplemented)r   r   resultr   r   r   r7   R   s
    
zCoalesce.empty_result_set_valuec                    sT   | j  dkrD|  }|dd |  D  tt|j||f|S | j||f|S )Nr   c                 S   s   g | ]}t |d dqS )ZTO_NCLOB)r+   )r   ).0r   r   r   r   
<listcomp>`   s   z&Coalesce.as_oracle.<locals>.<listcomp>)r	   r!   copyset_source_expressionsr6   r
   r-   r   )r   r   r   r   cloner   r   r   r&   Z   s    zCoalesce.as_oracle)
r'   r(   r)   r*   r+   r   propertyr7   r&   r,   r   r   r   r   r-   H   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 )CollateZ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matchr1   	collationr
   r   )r   r   rC   r   r   r   r   p   s    zCollate.__init__c                    s(   | d|j| j t j||f|S )NrC   )
setdefaultZopsZ
quote_namerC   r
   r   r   r   r   r   r   v   s    zCollate.as_sql)
r'   r(   r)   r+   r   r   rA   r   r   r,   r   r   r   r   r@   i   s
   r@   c                       s0   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.
    ZGREATESTc                    s&   t |dk rtdt j|| d S )Nr.   z+Greatest must take at least two expressionsr/   r2   r   r   r   r      s    zGreatest.__init__c                    s   t  j||fddi|S )zUse the MAX function on SQLite.r+   MAXr
   r    r   r   r   r   r       s    zGreatest.as_sqliter'   r(   r)   r*   r+   r   r    r,   r   r   r   r   rE   {   s   rE   c                       sF   e Zd ZdZe Z fddZ fddZ fddZdd	 Z	  Z
S )

JSONObjectZJSON_OBJECTc                    s8   g }|  D ]\}}|t||f qt j|  d S r5   )itemsextendr   r
   r   )r   fieldsr3   keyvaluer   r   r   r      s    zJSONObject.__init__c                    s"   |j jstdt j||f|S )Nz7JSONObject() is not supported on this database backend.)featuresZhas_json_object_functionr   r
   r   r   r   r   r   r      s
    zJSONObject.as_sqlc                    sB   |   }|dd t| D  tt|j||fddi|S )Nc                 S   s,   g | ]$\}}|d  dkr$t |t n|qS )r.   r   )r   r   )r:   indexr   r   r   r   r;      s   z,JSONObject.as_postgresql.<locals>.<listcomp>r+   ZJSONB_BUILD_OBJECT)r<   r=   	enumerater6   r
   rI   r   )r   r   r   r   r<   r   r   r   r%      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>r.      z, )ziprR   )r   argsr   r   r   rR      s    (z,JSONObject.as_oracle.<locals>.ArgJoiner.joinN)r'   r(   r)   rR   r   r   r   r   	ArgJoiner   s   rW   z,%(function)s(%(expressions)s RETURNING CLOB))Z
arg_joinerr   r$   )r   r   r   r   rW   r   r   r   r&      s    zJSONObject.as_oracle)r'   r(   r)   r+   r   r	   r   r   r%   r&   r,   r   r   r   r   rI      s   rI   c                       s0   e Zd ZdZdZ fddZ fddZ  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.
    ZLEASTc                    s&   t |dk rtdt j|| d S )Nr.   z(Least must take at least two expressionsr/   r2   r   r   r   r      s    zLeast.__init__c                    s   t  j||fddi|S )zUse the MIN function on SQLite.r+   ZMINrG   r   r   r   r   r       s    zLeast.as_sqliterH   r   r   r   r   rX      s   rX   c                       s$   e Zd ZdZdZ fddZ  ZS )NullIfZNULLIFr.   c                    s:   |   d }t|tr(|jd kr(tdt j||f|S )Nr   z2Oracle does not allow Value(None) for expression1.)r6   
isinstancer   rN   r1   r
   r   )r   r   r   r   Zexpression1r   r   r   r&      s    zNullIf.as_oracle)r'   r(   r)   r+   arityr&   r,   r   r   r   r   rY      s   rY   N)r*   Z	django.dbr   Zdjango.db.models.expressionsr   r   Zdjango.db.models.fieldsr   Zdjango.db.models.fields.jsonr   Zdjango.utils.regex_helperr   r   r-   r@   rE   rI   rX   rY   r   r   r   r   <module>   s   ?!/