
v^                 @   s   d  Z  d d l m Z m Z Gd d   d e  Z Gd d   d e  Z Gd d   d e  Z Gd	 d
   d
 e  Z Gd 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
   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__ G/tmp/pip-build-8lau8j11/django/django/db/models/functions/comparison.pyr   
   s    zCast.__init__c                s,   |  j  j |  | d <t   j | | |  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  j |  } | d
 k rz d } t   j | | d | | \ } } | d k rZ d n d } | j d |  | | f S| d k r d	 } t   j | | d | | S|  j | | |  S)Ndatetimetimezstrftime(%%s, %(expressions)s)templatez%H:%M:%fz%Y-%m-%d %H:%M:%fr   datezdate(%(expressions)s)>   timedatetime)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   s:   |  j  j   d k r d n d  } |  j | | d | | S)NZ
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  | | d d | 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   r   r   )r
   r   r      s   r   c                   s@   e  Z d  Z d Z d Z   f d d   Z   f d d   Z   S)Coalescez:Return, from left to right, the first non-null expression.ZCOALESCEc                s5   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                sp   |  j  j   d k r] |  j   } | j d d   |  j   D  t t |  j | | |  S|  j | | |  S)NZ	TextFieldc             S   s"   g  |  ] } t  | d  d  q S)r#   ZTO_NCLOB)r   ).0r	   r   r   r   
<listcomp>:   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   	as_oracle4   s    zCoalesce.as_oracle)r   r    r!   r"   r#   r   r/   r   r   )r
   r   r$   +   s   r$   c                   s@   e  Z d  Z d Z d Z   f d d   Z   f d d   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                s5   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 | | d d | 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   r0   @   s   r0   c                   s@   e  Z d  Z d Z d Z   f d d   Z   f d d   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                s5   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 | | d d | S)zUse the MIN function on SQLite.r#   Z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   r2   T   s   r2   c                   s.   e  Z d  Z d Z d Z   f d d   Z   S)NullIfZNULLIFr%   c                sP   |  j    d } t | t  r: | j d  k r: t d   t   j | | |  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/   l   s    zNullIf.as_oracle)r   r    r!   r#   arityr/   r   r   )r
   r   r3   h   s   r3   N)	r"   Zdjango.db.models.expressionsr   r   r   r$   r0   r2   r3   r   r   r   r   <module>   s   &