3
(h                 @   s   d Z ddlmZmZ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
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G dd deZdS )z,
Classes that represent database functions.
    )Func	TransformValuefieldsc                   sZ   e Zd ZdZdZdZejdejdej	diZ
 fddZ fd	d
Zdd Zdd Z  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__ C/tmp/pip-install-q3hcpn_q/Django/django/db/models/functions/base.pyr      s    zCast.__init__c                s.   d|kr| j j||d< tt| j||f|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   s6   i }t | j}|| jkr&| j| |d< | j||f|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 )Nz%(expressions)s::%(db_type)s)template)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   __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 )CoalescezT
    Chooses, from left to right, the first non-null expression and returns it.
    ZCOALESCEc                s*   t |dk rtd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                sd   | j j dkrXG d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S r   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   r0   r"   r   r   )r   r   r#   (   s   r#   c                   sD   e Zd ZdZdZ fddZ fddZ fddZd	d
 Z  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||f| d S )N)r
   r1   r   )r   leftrightr(   )r   r   r   r   J   s    zConcatPair.__init__c                s    | j  }tt|j||dddS )Nz%(expressions)sz || )r   Z
arg_joiner)coalescer
   r1   r   )r   r   r   Z	coalesced)r   r   r   	as_sqliteM   s    
zConcatPair.as_sqlitec                s   t t| j||dddS )NZ	CONCAT_WSz!%(function)s('', %(expressions)s))r    r   )r
   r1   r   )r   r   r   )r   r   r   r   S   s    
zConcatPair.as_mysqlc             C   s(   | 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   r4   Y   s    
zConcatPair.coalesce)
r   r   r   r   r    r   r5   r   r4   r"   r   r   )r   r   r1   B   s   r1   c                   s0   e Zd ZdZdZdZ fddZdd Z  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                s6   t |dk rtd| j|}tt| j|f| d S )Nr$   z)Concat must take at least two expressions)r%   r&   _pairedr
   r8   r   )r   r'   r(   Zpaired)r   r   r   r   l   s    
zConcat.__init__c             C   s0   t |dkrt| S t|d | j|dd  S )Nr$   r      )r%   r1   r9   )r   r'   r   r   r   r9   r   s    zConcat._paired)	r   r   r   r   r    r   r   r9   r"   r   r   )r   r   r8   c   s
   r8   c                   s0   e Zd ZdZdZ fddZ fddZ  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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.MAX)r    )r
   r;   r   )r   r   r   )r   r   r   r5      s    zGreatest.as_sqlite)r   r   r   r   r    r   r5   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 )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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.ZMIN)r    )r
   r=   r   )r   r   r   )r   r   r   r5      s    zLeast.as_sqlite)r   r   r   r   r    r   r5   r"   r   r   )r   r   r=      s   r=   c                   s4   e Zd ZdZdZdZ fddZ fddZ  ZS )Lengthz2Returns the number of characters in the expressionZLENGTHlengthc                s0   |j dtj }tt| j|fd|i| 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 )NZCHAR_LENGTH)r    )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   r>      s
   r>   c               @   s   e Zd ZdZdZdS )LowerZLOWERlowerN)r   r   r   r    rA   r   r   r   r   rB      s   rB   c                   s*   e Zd ZdZd fdd	Zdd Z  ZS )NowZCURRENT_TIMESTAMPNc                s.   |d krt j }tt| jf d|i| d S )Nr	   )r   ZDateTimeFieldr
   rD   r   )r   r	   r(   )r   r   r   r      s    zNow.__init__c             C   s   | j ||ddS )NzSTATEMENT_TIMESTAMP())r   )r   )r   r   r   r   r   r   r      s    zNow.as_postgresql)N)r   r   r   r   r   r   r"   r   r   )r   r   rD      s   rD   c                   s:   e Zd ZdZd	 fdd	Z fddZ fddZ  ZS )
SubstrZ	SUBSTRINGNc                sd   t |ds"|dk rtdt|}||g}|dk	rNt |dsDt|}|j| 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
   rE   r   )r   r   posr?   r(   r'   )r   r   r   r      s    


zSubstr.__init__c                s   t t| j||ddS )NSUBSTR)r    )r
   rE   r   )r   r   r   )r   r   r   r5      s    zSubstr.as_sqlitec                s   t t| j||ddS )NrI   )r    )r
   rE   r   )r   r   r   )r   r   r   r0      s    zSubstr.as_oracle)N)r   r   r   r    r   r5   r0   r"   r   r   )r   r   rE      s   rE   c               @   s   e Zd ZdZdZdS )UpperZUPPERupperN)r   r   r   r    rA   r   r   r   r   rJ      s   rJ   N)r   Zdjango.db.modelsr   r   r   r   r   r#   r1   r8   r;   r=   r>   rB   rD   rE   rJ   r   r   r   r   <module>   s   !!