
 X                 @   s  d  Z  d d l 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 Gd d   d e  Z d S)z,
Classes that represent database functions.
    )Func	TransformValuefieldsc                   s   e  Z d  Z d Z d Z d Z i d e j 6d e j 6d e j	 6Z
   f d d   Z   f d	 d
   Z d d   Z d d   Z   S)Castz3
    Coerce an expression to a new field type.
    ZCASTz,%(function)s(%(expressions)s AS %(db_type)s)charzsigned integersignedc                s    t  t |   j | d | d  S)Noutput_field)superr   __init__)self
expressionr	   )	__class__ M/home/ubuntu/projects/ifolica/build/django/django/db/models/functions/base.pyr      s    zCast.__init__c                sA   d | k r% |  j  j |  | d <n  t t |   j | | |  S)Ndb_type)_output_fieldr   r
   r   as_sql)r   compiler
connectionextra_context)r   r   r   r      s    zCast.as_sqlc             C   sK   i  } t  |  j  } | |  j k r8 |  j | | d <n  |  j | | |  S)Nr   )typer   mysql_typesr   )r   r   r   r   Zoutput_field_classr   r   r   as_mysql   s
    zCast.as_mysqlc             C   s   |  j  | | d d S)Ntemplatez%(expressions)s::%(db_type)s)r   )r   r   r   r   r   r   as_postgresql#   s    zCast.as_postgresql)__name__
__module____qualname____doc__functionr   r   Z	CharFieldIntegerFieldZ
FloatFieldr   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)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
ValueErrorr
   r"   r   )r   expressionsextra)r   r   r   r   .   s    zCoalesce.__init__c                s   |  j  j   d k r| Gd d   d t      f d d   |  j   D } |  j   } | j |  t t |  j | |  S|  j | |  S)NZ	TextFieldc               @   s   e  Z d  Z d Z d S)z#Coalesce.as_oracle.<locals>.ToNCLOBZTO_NCLOBN)r   r   r   r    r   r   r   r   ToNCLOB7   s   r(   c                s   g  |  ] }   |   q Sr   r   ).0r   )r(   r   r   
<listcomp>;   s   	 z&Coalesce.as_oracle.<locals>.<listcomp>)	r	   Zget_internal_typer   get_source_expressionscopyset_source_expressionsr
   r"   r   )r   r   r   r&   clone)r   )r(   r   	as_oracle3   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   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
   r0   r   )r   leftrightr'   )r   r   r   r   J   s    zConcatPair.__init__c                s1   |  j    } t t |  j | | d d d d S)Nr   z%(expressions)sZ
arg_joinerz || )coalescer
   r0   r   )r   r   r   Z	coalesced)r   r   r   	as_sqliteM   s    zConcatPair.as_sqlitec                s%   t  t |   j | | d d d d S)Nr    Z	CONCAT_WSr   z!%(function)s('', %(expressions)s))r
   r0   r   )r   r   r   )r   r   r   r   S   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>)r,   r+   r-   )r   cr&   r   r   r   r3   Y   s    zConcatPair.coalesce)	r   r   r   r   r    r   r4   r   r3   r   r   )r   r   r0   B   s   r0   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
   r7   r   )r   r&   r'   Zpaired)r   r   r   r   l   s    zConcat.__init__c             C   s@   t  |  d k r t |   St | d |  j | d d     S)Nr#   r      )r$   r0   r8   )r   r&   r   r   r   r8   r   s    
zConcat._paired)r   r   r   r   r    r   r   r8   r   r   )r   r   r7   c   s
   r7   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
   r:   r   )r   r&   r'   )r   r   r   r      s    zGreatest.__init__c                s   t  t |   j | | d d S)zUse the MAX function on SQLite.r    MAX)r
   r:   r   )r   r   r   )r   r   r   r4      s    zGreatest.as_sqlite)r   r   r   r   r    r   r4   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)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
   r<   r   )r   r&   r'   )r   r   r   r      s    zLeast.__init__c                s   t  t |   j | | d d S)zUse the MIN function on SQLite.r    ZMIN)r
   r<   r   )r   r   r   )r   r   r   r4      s    zLeast.as_sqlite)r   r   r   r   r    r   r4   r   r   )r   r   r<      s   r<   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                s;   | j  d t j    } t t |   j | d | | d  S)Nr	   )popr   r!   r
   r=   r   )r   r   r'   r	   )r   r   r   r      s    zLength.__init__c                s   t  t |   j | | d d S)Nr    ZCHAR_LENGTH)r
   r=   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   r=      s
   r=   c               @   s   e  Z d  Z d Z d Z d S)LowerZLOWERlowerN)r   r   r   r    r@   r   r   r   r   rA      s   rA   c                   s7   e  Z d  Z d Z d   f d d  Z d d   Z   S)NowZCURRENT_TIMESTAMPNc                s;   | d  k r t  j   } n  t t |   j d | |  d  S)Nr	   )r   ZDateTimeFieldr
   rC   r   )r   r	   r'   )r   r   r   r      s    zNow.__init__c             C   s   |  j  | | d d S)Nr   zSTATEMENT_TIMESTAMP())r   )r   r   r   r   r   r   r      s    zNow.as_postgresql)r   r   r   r   r   r   r   r   )r   r   rC      s   rC   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_expressionr9   z'pos' must be greater than 0N)hasattrr%   r   appendr
   rD   r   )r   r   posr>   r'   r&   )r   r   r   r      s    zSubstr.__init__c                s   t  t |   j | | d d S)Nr    SUBSTR)r
   rD   r   )r   r   r   )r   r   r   r4      s    zSubstr.as_sqlitec                s   t  t |   j | | d d S)Nr    rH   )r
   rD   r   )r   r   r   )r   r   r   r/      s    zSubstr.as_oracle)r   r   r   r    r   r4   r/   r   r   )r   r   rD      s   rD   c               @   s   e  Z d  Z d Z d Z d S)UpperZUPPERupperN)r   r   r   r    r@   r   r   r   r   rI      s   rI   N)r   Zdjango.db.modelsr   r   r   r   r   r"   r0   r7   r:   r<   r=   rA   rC   rD   rI   r   r   r   r   <module>   s   "!!