

_V                 @   s  d  Z  d d l m Z m Z m Z 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 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,
Classes that represent database functions.
    )DateTimeFieldFuncIntegerField	TransformValuec                   s@   e  Z d  Z d Z d Z   f d d   Z   f d d   Z   S)CoalescezT
    Chooses, from left to right, the first non-null expression and returns it.
    ZCOALESCEc                s>   t  |  d k  r! t d   n  t t |   j | |   d  S)N   z+Coalesce must take at least two expressions)len
ValueErrorsuperr   __init__)selfexpressionsextra)	__class__ </tmp/pip-build-ghmbqnp_/Django/django/db/models/functions.pyr      s    zCoalesce.__init__c                ss   |  j  j   d k rZ Gd d   d t      f d d   |  j   D } |  j |  n  t t |   j | |  S)NZ	TextFieldc               @   s   e  Z d  Z d Z d S)z#Coalesce.as_oracle.<locals>.ToNCLOBZTO_NCLOBN)__name__
__module____qualname__functionr   r   r   r   ToNCLOB   s   r   c                s   g  |  ] }   |   q Sr   r   ).0
expression)r   r   r   
<listcomp>   s   	 z&Coalesce.as_oracle.<locals>.<listcomp>)output_fieldZget_internal_typer   get_source_expressionsset_source_expressionsr   r   as_sql)r   compiler
connectionr   )r   )r   r   	as_oracle   s
    zCoalesce.as_oracle)r   r   r   __doc__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   f d d   Z d	 d
   Z   S)
ConcatPairz
    A helper class that concatenates two arguments together. This is used
    by `Concat` because not all backend databases support more than two
    arguments.
    ZCONCATc                s    t  t |   j | | |  d  S)N)r   r#   r   )r   leftrightr   )r   r   r   r   )   s    zConcatPair.__init__c                s7   |  j    } d | _ d | _ t t |  j | |  S)Nz || z%(expressions)s)coalesceZ
arg_joinertemplater   r#   r   )r   r   r    Z	coalesced)r   r   r   	as_sqlite,   s    		zConcatPair.as_sqlitec                s+   d |  _  d |  _ t t |   j | |  S)NZ	CONCAT_WSz!%(function)s('', %(expressions)s))r   r'   r   r#   r   )r   r   r    )r   r   r   as_mysql2   s    		zConcatPair.as_mysqlc             C   s6   |  j    } d d   | j   D } | j |  | S)Nc             S   s%   g  |  ] } t  | t d     q S) )r   r   )r   r   r   r   r   r   <   s   	 z'ConcatPair.coalesce.<locals>.<listcomp>)copyr   r   )r   cr   r   r   r   r&   8   s    zConcatPair.coalesce)	r   r   r   r"   r   r   r(   r)   r&   r   r   )r   r   r#   !   s   r#   c                   s@   e  Z d  Z d Z d Z d Z   f d d   Z d d   Z   S)Concatz
    Concatenates text fields together. Backends that result in an entire
    null expression when any arguments are null will wrap each argument in
    coalesce functions to ensure we always get a non-null result.
    Nz%(expressions)sc                sM   t  |  d k  r! t d   n  |  j |  } t t |   j | |  d  S)Nr   z)Concat must take at least two expressions)r	   r
   _pairedr   r-   r   )r   r   r   Zpaired)r   r   r   r   K   s    zConcat.__init__c             C   s@   t  |  d k r t |   St | d |  j | d d     S)Nr   r      )r	   r#   r.   )r   r   r   r   r   r.   Q   s    
zConcat._paired)r   r   r   r"   r   r'   r   r.   r   r   )r   r   r-   B   s
   r-   c                   s@   e  Z d  Z d Z d Z   f d d   Z   f d d   Z   S)Greatesta  
    Chooses the maximum expression and returns it.

    If any expression is null the return value is database-specific:
    On Postgres, 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   n  t t |   j | |   d  S)Nr   z+Greatest must take at least two expressions)r	   r
   r   r0   r   )r   r   r   )r   r   r   r   d   s    zGreatest.__init__c                s   t  t |   j | | d d S)zUse the MAX function on SQLite.r   MAX)r   r0   r   )r   r   r    )r   r   r   r(   i   s    zGreatest.as_sqlite)r   r   r   r"   r   r   r(   r   r   )r   r   r0   Z   s   r0   c                   s@   e  Z d  Z d Z d Z   f d d   Z   f d d   Z   S)Leasta  
    Chooses the minimum expression and returns it.

    If any expression is null the return value is database-specific:
    On Postgres, the minimum not-null expression is returned.
    On MySQL, Oracle, and SQLite, if any expression is null, null is returned.
    ZLEASTc                s>   t  |  d k  r! t d   n  t t |   j | |   d  S)Nr   z(Least must take at least two expressions)r	   r
   r   r2   r   )r   r   r   )r   r   r   r   x   s    zLeast.__init__c                s   t  t |   j | | d d S)zUse the MIN function on SQLite.r   ZMIN)r   r2   r   )r   r   r    )r   r   r   r(   }   s    zLeast.as_sqlite)r   r   r   r"   r   r   r(   r   r   )r   r   r2   n   s   r2   c                   sF   e  Z d  Z d Z d Z d Z   f d d   Z   f d d   Z   S)Lengthz2Returns the number of characters in the expressionZLENGTHlengthc                s8   | j  d t    } t t |   j | d | | d  S)Nr   )popr   r   r3   r   )r   r   r   r   )r   r   r   r      s    zLength.__init__c                s"   d |  _  t t |   j | |  S)NZCHAR_LENGTH)r   r   r3   r   )r   r   r    )r   r   r   r)      s    	zLength.as_mysql)r   r   r   r"   r   lookup_namer   r)   r   r   )r   r   r3      s
   r3   c                   s.   e  Z d  Z d Z d Z   f d d   Z   S)LowerZLOWERlowerc                s   t  t |   j | |  d  S)N)r   r7   r   )r   r   r   )r   r   r   r      s    zLower.__init__)r   r   r   r   r6   r   r   r   )r   r   r7      s   r7   c                   s7   e  Z d  Z d Z d   f d d  Z d d   Z   S)NowZCURRENT_TIMESTAMPNc                s8   | d  k r t    } n  t t |   j d | |  d  S)Nr   )r   r   r9   r   )r   r   r   )r   r   r   r      s    zNow.__init__c             C   s   d |  _  |  j | |  S)NzSTATEMENT_TIMESTAMP())r'   r   )r   r   r    r   r   r   as_postgresql   s    	zNow.as_postgresql)r   r   r   r'   r   r:   r   r   )r   r   r9      s   r9   c                   sO   e  Z d  Z d Z d   f d d  Z   f d d   Z   f d d   Z   S)	SubstrZ	SUBSTRINGNc                s   t  | d  s9 | d k  r* t d   n  t |  } n  | | g } | d k	 r t  | d  so t |  } n  | j |  n  t t |   j | |   d S)z
        expression: the name of a field, or an expression returning a string
        pos: an integer > 0, or an expression returning an integer
        length: an optional number of characters to return
        Zresolve_expressionr/   z'pos' must be greater than 0N)hasattrr
   r   appendr   r;   r   )r   r   posr4   r   r   )r   r   r   r      s    zSubstr.__init__c                s"   d |  _  t t |   j | |  S)NSUBSTR)r   r   r;   r   )r   r   r    )r   r   r   r(      s    	zSubstr.as_sqlitec                s"   d |  _  t t |   j | |  S)Nr?   )r   r   r;   r   )r   r   r    )r   r   r   r!      s    	zSubstr.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   S)UpperZUPPERupperc                s   t  t |   j | |  d  S)N)r   r@   r   )r   r   r   )r   r   r   r      s    zUpper.__init__)r   r   r   r   r6   r   r   r   )r   r   r@      s   r@   N)r"   Zdjango.db.modelsr   r   r   r   r   r   r#   r-   r0   r2   r3   r7   r9   r;   r@   r   r   r   r   <module>   s   (!