B
    `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__ T/home/dcms/DCMS/lib/python3.7/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_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rd	}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)	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   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   expressionsextra)r
   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>G   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   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 expressions)r(   r)   r   r   )r   r*   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
   r   r   r   \   s    zGreatest.as_sqlite)r    r!   r"   r#   r$   r   r   r%   r   r   )r
   r   r1   M   s   r1   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   k   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   p   s    zLeast.as_sqlite)r    r!   r"   r#   r$   r   r   r%   r   r   )r
   r   r3   a   s   r3   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.)r/   
isinstancer   valuer)   r   r   )r   r   r   r   Zexpression1)r
   r   r   r   y   s    zNullIf.as_oracle)r    r!   r"   r$   arityr   r%   r   r   )r
   r   r4   u   s   r4   N)	r#   Zdjango.db.models.expressionsr   r   r   r&   r1   r3   r4   r   r   r   r   <module>   s   3