U
    8ÄT_p  ã                   @   sh   d Z ddlmZ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dS )z;Database functions that do comparisons or type conversions.é    )ÚFuncÚValuec                       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__© úI/tmp/pip-unpacked-wheel-dv63caxw/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r€d	}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   Z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 )NZ
FloatFieldz(%(expressions)s + 0.0)Ú	JSONFieldz"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_postgresql*   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_oracle0   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                       s0   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.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   ZexpressionsÚextrar
   r   r   r   <   s    zCoalesce.__init__c                    sT   | j  ¡ dkrD|  ¡ }| dd„ |  ¡ D ƒ¡ tt|ƒj||f|ŽS | j||f|ŽS )NZ	TextFieldc                 S   s   g | ]}t |d d�‘qS )ZTO_NCLOB)r&   )r   )Ú.0r	   r   r   r   Ú
<listcomp>F   s    z&Coalesce.as_oracle.<locals>.<listcomp>)r   r   ÚcopyZset_source_expressionsÚget_source_expressionsr   r(   r   )r   r   r   r   Úcloner
   r   r   r!   A   s    
ÿzCoalesce.as_oracle)r"   r#   r$   r%   r&   r   r!   r'   r   r   r
   r   r(   8   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*   r-   r
   r   r   r   W   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   r4   M   s   r4   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*   r-   r
   r   r   r   k   s    zLeast.__init__c                    s   t ƒ j||fddi|—ŽS )zUse the MIN function on SQLite.r&   ZMINr6   r   r
   r   r   r   p   s    zLeast.as_sqliter7   r   r   r
   r   r8   a   s   r8   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.)r2   Ú
isinstancer   Úvaluer,   r   r   )r   r   r   r   Zexpression1r
   r   r   r!   y   s    zNullIf.as_oracle)r"   r#   r$   r&   Úarityr!   r'   r   r   r
   r   r9   u   s   r9   N)	r%   Zdjango.db.models.expressionsr   r   r   r(   r4   r8   r9   r   r   r   r   Ú<module>   s   3