B
    CVvg�  ã               @   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.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-install-o3oxmrkh/Django/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_context)r   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>   Ú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   ZsqlÚparamsÚformat_string)r   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)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                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    Ú__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   ÚexpressionsÚextra)r   r   r   r
   9   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>D   s    z&Coalesce.as_oracle.<locals>.<listcomp>)r   r   ÚcopyZset_source_expressionsÚget_source_expressionsr	   r'   r   )r   r   r   r   Úclone)r   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 )Ú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Úmatchr*   Ú	collationr	   r
   )r   r   r5   )r   r   r   r
   P   s    zCollate.__init__c                s(   |  d|j | j¡¡ tƒ j||f|ŽS )Nr5   )Ú
setdefaultÚopsZ
quote_namer5   r	   r   )r   r   r   r   )r   r   r   r   V   s    zCollate.as_sql)
r!   r"   r#   r%   r   r   r3   r
   r   r&   r   r   )r   r   r2   J   s
   r2   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 expressions)r)   r*   r	   r
   )r   r+   r,   )r   r   r   r
   e   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   r   r   r   j   s    zGreatest.as_sqlite)r!   r"   r#   r$   r%   r
   r   r&   r   r   )r   r   r8   [   s   r8   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 )
Ú
JSONObjectZJSON_OBJECTc                s<   g }x&|  ¡ D ]\}}| t|ƒ|f¡ qW tƒ j|Ž  d S )N)ÚitemsÚextendr   r	   r
   )r   Úfieldsr+   ÚkeyÚvalue)r   r   r   r
   s   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   r   r   r   y   s    zJSONObject.as_sqlc             K   s   | j ||fddi|—ŽS )Nr%   ZJSONB_BUILD_OBJECT)r   )r   r   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>r(   é   z, )ÚziprB   )r   Úargsr   r   r   rB   Š   s    (z,JSONObject.as_oracle.<locals>.ArgJoiner.joinN)r!   r"   r#   rB   r   r   r   r   Ú	ArgJoiner‰   s   rG   z,%(function)s(%(expressions)s RETURNING CLOB))Z
arg_joinerr   )r   )r   r   r   r   rG   r   r   r   r    ˆ   s    zJSONObject.as_oracle)r!   r"   r#   r%   r   r   r
   r   rA   r    r&   r   r   )r   r   r:   o   s   r:   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 expressions)r)   r*   r	   r
   )r   r+   r,   )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MIN)r	   r   )r   r   r   r   )r   r   r   r   ¦   s    zLeast.as_sqlite)r!   r"   r#   r$   r%   r
   r   r&   r   r   )r   r   rH   —   s   rH   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.)r0   Ú
isinstancer   r?   r*   r	   r   )r   r   r   r   Zexpression1)r   r   r   r    ¯   s    zNullIf.as_oracle)r!   r"   r#   r%   Úarityr    r&   r   r   )r   r   rI   «   s   rI   N)r$   Z	django.dbr   Zdjango.db.models.expressionsr   r   Zdjango.db.models.fields.jsonr   Zdjango.utils.regex_helperr   r   r'   r2   r8   r:   rH   rI   r   r   r   r   Ú<module>   s   -(