3
v^                 @   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                   sP   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
  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/usr/lib/python3.6/site-packages/django/db/models/functions/comparison.pyr   
   s    zCast.__init__c                s"   | j j||d< t j||f|S )Ndb_type)r   cast_db_typer   as_sql)r   compiler
connectionextra_context)r
   r   r   r      s    zCast.as_sqlc       	         s   | j j|}|d
krZd}t j||fd|i|\}}|dkrBdnd}|jd| ||fS |dkrd	}t j||fd|i|S | j||f|S )Ndatetimetimezstrftime(%%s, %(expressions)s)templatez%H:%M:%fz%Y-%m-%d %H:%M:%fr   datezdate(%(expressions)s)>   r   r   )r   r   r   r   insert)	r   r   r   r   r   r   sqlparamsformat_string)r
   r   r   	as_sqlite   s    zCast.as_sqlitec             K   s.   | j j dkrdnd }| j||fd|i|S )N
FloatFieldz(%(expressions)s + 0.0)r   )r   get_internal_typer   )r   r   r   r   r   r   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_postgresql)__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   /   s    zCoalesce.__init__c                sT   | j j dkrD| j }|jdd | j D  tt|j||f|S | j||f|S )N	TextFieldc             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_expressionsget_source_expressionsr   r&   r   )r   r   r   r   clone)r
   r   r   	as_oracle4   s    zCoalesce.as_oracle)r    r!   r"   r#   r$   r   r3   r%   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 )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   J   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   O   s    zGreatest.as_sqlite)r    r!   r"   r#   r$   r   r   r%   r   r   )r
   r   r4   @   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 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$   MIN)r   r   )r   r   r   r   )r
   r   r   r   c   s    zLeast.as_sqlite)r    r!   r"   r#   r$   r   r   r%   r   r   )r
   r   r6   T   s   r6   c                   s$   e Zd ZdZdZ fddZ  ZS )NullIfZNULLIFr'   c                s:   | j  d }t|tr(|jd kr(tdt j||f|S )Nr   z2Oracle does not allow Value(None) for expression1.)r1   
isinstancer   valuer)   r   r   )r   r   r   r   Zexpression1)r
   r   r   r3   l   s    zNullIf.as_oracle)r    r!   r"   r$   arityr3   r%   r   r   )r
   r   r8   h   s   r8   N)	r#   django.db.models.expressionsr   r   r   r&   r4   r6   r8   r   r   r   r   <module>   s   &