3
v^*                 @   s,  d dl mZmZ d dlmZ d dlmZ d dlmZ d dl	m
Z
 G dd dZG dd	 d	ZG d
d dZG dd d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eZG dd deZG dd deeZG d d! d!eZG d"d# d#e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eeZG d0d1 d1eeeZ G d2d3 d3eeeeZ!G d4d5 d5eeeeZ"G d6d7 d7eeeeZ#G d8d9 d9eZ$G d:d; d;eZ%G d<d= d=eZ&G d>d? d?eZ'd@S )A    )FuncValue)IntegerField)Coalesce)	Transform)NotSupportedErrorc                   s    e Zd ZdZ fddZ  ZS )BytesToCharFieldConversionMixina"  
    Convert CharField results from bytes to str.

    MySQL returns long data types (bytes) instead of chars when it can't
    determine the length of the result string. For example:
        LPAD(column1, CHAR_LENGTH(column2), ' ')
    returns the LONGTEXT (bytes) instead of VARCHAR.
    c                s8   |j jr(| jj dkr(t|tr(|j S t j|||S )N	CharField)	featuresZ!db_functions_convert_bytes_to_stroutput_fieldget_internal_type
isinstancebytesdecodesuperconvert_value)selfvalue
expression
connection)	__class__ C/usr/lib/python3.6/site-packages/django/db/models/functions/text.pyr      s    z-BytesToCharFieldConversionMixin.convert_value)__name__
__module____qualname____doc__r   __classcell__r   r   )r   r   r      s   r   c                   s   e Zd Z fddZ  ZS )MySQLSHA2Mixinc                s(   t  j||fdd| jdd   i|S )NtemplatezSHA2(%%(expressions)s, %s)   )r   as_sqlfunction)r   compilerr   extra_content)r   r   r   as_mysql   s
    zMySQLSHA2Mixin.as_mysql)r   r   r   r%   r   r   r   )r   r   r      s   r   c                   s   e Zd Z fddZ  ZS )OracleHashMixinc                s   t  j||fddi|S )Nr   zcLOWER(RAWTOHEX(STANDARD_HASH(UTL_I18N.STRING_TO_RAW(%(expressions)s, 'AL32UTF8'), '%(function)s'))))r   r!   )r   r#   r   extra_context)r   r   r   	as_oracle#   s
    zOracleHashMixin.as_oracle)r   r   r   r(   r   r   r   )r   r   r&   "   s   r&   c                   s   e Zd Z fddZ  ZS )PostgreSQLSHAMixinc                s"   t  j||fd| jj d|S )Nz6ENCODE(DIGEST(%(expressions)s, '%(function)s'), 'hex'))r   r"   )r   r!   r"   lower)r   r#   r   r$   )r   r   r   as_postgresql0   s    z PostgreSQLSHAMixin.as_postgresql)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  ZS )	ChrZCHRchrc                s   t  j||fddd|S )NCHARz)%(function)s(%(expressions)s USING utf16))r"   r   )r   r!   )r   r#   r   r'   )r   r   r   r%   >   s    zChr.as_mysqlc                s   t  j||fddi|S )Nr   z,%(function)s(%(expressions)s USING NCHAR_CS))r   r!   )r   r#   r   r'   )r   r   r   r(   E   s    zChr.as_oraclec                s   t  j||fddi|S )Nr"   r.   )r   r!   )r   r#   r   r'   )r   r   r   	as_sqliteL   s    zChr.as_sqlite)	r   r   r   r"   lookup_namer%   r(   r/   r   r   r   )r   r   r,   :   s
   r,   c                   s8   e Zd ZdZdZ fddZ fddZdd Z  ZS )	
ConcatPairz
    Concatenate two arguments together. This is used by `Concat` because not
    all backend databases support more than two arguments.
    ZCONCATc                s(   | j  }tt|j||fddd|S )Nz%(expressions)sz || )r   
arg_joiner)coalescer   r1   r!   )r   r#   r   r'   Z	coalesced)r   r   r   r/   W   s    
zConcatPair.as_sqlitec                s   t  j||fddd|S )NZ	CONCAT_WSz!%(function)s('', %(expressions)s))r"   r   )r   r!   )r   r#   r   r'   )r   r   r   r%   ^   s    zConcatPair.as_mysqlc             C   s$   | j  }|jdd |j D  |S )Nc             S   s   g | ]}t |td qS ) )r   r   ).0r   r   r   r   
<listcomp>j   s    z'ConcatPair.coalesce.<locals>.<listcomp>)copyset_source_expressionsget_source_expressions)r   cr   r   r   r3   f   s    zConcatPair.coalesce)	r   r   r   r   r"   r/   r%   r3   r   r   r   )r   r   r1   P   s
   r1   c                   s0   e Zd ZdZdZdZ fddZdd Z  ZS )Concatz
    Concatenate 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 a non-null result.
    Nz%(expressions)sc                s2   t |dk rtd| j|}t j|f| d S )N   z)Concat must take at least two expressions)len
ValueError_pairedr   __init__)r   expressionsextraZpaired)r   r   r   r@   x   s    
zConcat.__init__c             C   s0   t |dkrt| S t|d | j|dd  S )Nr<   r      )r=   r1   r?   )r   rA   r   r   r   r?   ~   s    zConcat._paired)	r   r   r   r   r"   r   r@   r?   r   r   r   )r   r   r;   o   s
   r;   c                   s<   e Zd ZdZdZ fddZdd Zdd Zd	d
 Z  Z	S )LeftZLEFTr<   c                s0   t |ds|dk rtdt j||f| dS )z
        expression: the name of a field, or an expression returning a string
        length: the number of characters to return from the start of the string
        resolve_expressionrC   z 'length' must be greater than 0.N)hasattrr>   r   r@   )r   r   lengthrB   )r   r   r   r@      s    
zLeft.__init__c             C   s   t | jd td| jd S )Nr   rC   )Substrsource_expressionsr   )r   r   r   r   
get_substr   s    zLeft.get_substrc             K   s   | j  j||f|S )N)rJ   r(   )r   r#   r   r'   r   r   r   r(      s    zLeft.as_oraclec             K   s   | j  j||f|S )N)rJ   r/   )r   r#   r   r'   r   r   r   r/      s    zLeft.as_sqlite)
r   r   r   r"   arityr@   rJ   r(   r/   r   r   r   )r   r   rD      s   
rD   c                   s.   e Zd ZdZdZdZe Z fddZ  Z	S )Lengthz2Return the number of characters in the expression.ZLENGTHrG   c                s   t  j||fddi|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"   r0   r   r   r%   r   r   r   )r   r   rL      s
   rL   c               @   s   e Zd ZdZdZdS )LowerZLOWERr*   N)r   r   r   r"   r0   r   r   r   r   rM      s   rM   c                   s(   e Zd ZdZedf fdd	Z  ZS )LPadZLPAD c                s<   t |d r$|d k	r$|dk r$tdt j|||f| d S )NrE   r   z''length' must be greater or equal to 0.)rF   r>   r   r@   )r   r   rG   Z	fill_textrB   )r   r   r   r@      s    zLPad.__init__)r   r   r   r"   r   r@   r   r   r   )r   r   rN      s   rN   c               @   s   e Zd ZdZdZdS )LTrimZLTRIMZltrimN)r   r   r   r"   r0   r   r   r   r   rP      s   rP   c               @   s   e Zd Zd ZdZdS )MD5md5N)r   r   r   r"   r0   r   r   r   r   rQ      s   rQ   c                   s6   e Zd ZdZdZe Z fddZ fddZ  Z	S )OrdASCIIordc                s   t  j||fddi|S )Nr"   ZORD)r   r!   )r   r#   r   r'   )r   r   r   r%      s    zOrd.as_mysqlc                s   t  j||fddi|S )Nr"   UNICODE)r   r!   )r   r#   r   r'   )r   r   r   r/      s    zOrd.as_sqlite)
r   r   r   r"   r0   r   r   r%   r/   r   r   r   )r   r   rS      s
   rS   c                   s(   e Zd ZdZ fddZdd Z  ZS )RepeatREPEATc                s:   t |d r$|d k	r$|dk r$tdt j||f| d S )NrE   r   z''number' must be greater or equal to 0.)rF   r>   r   r@   )r   r   numberrB   )r   r   r   r@      s    zRepeat.__init__c             K   s>   | j \}}|d krd n
t|| }t|||}|j||f|S )N)rI   rL   RPadr!   )r   r#   r   r'   r   rY   rG   Zrpadr   r   r   r(      s    
zRepeat.as_oracle)r   r   r   r"   r@   r(   r   r   r   )r   r   rW      s   rW   c                   s(   e Zd ZdZedf fdd	Z  ZS )ReplaceZREPLACEr4   c                s   t  j|||f| d S )N)r   r@   )r   r   textreplacementrB   )r   r   r   r@      s    zReplace.__init__)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  ZS )ReverseZREVERSEreversec                s   t  j||fddi|S )Nr   z(SELECT LISTAGG(s) WITHIN GROUP (ORDER BY n DESC) FROM (SELECT LEVEL n, SUBSTR(%(expressions)s, LEVEL, 1) s FROM DUAL CONNECT BY LEVEL <= LENGTH(%(expressions)s)) GROUP BY %(expressions)s))r   r!   )r   r#   r   r'   )r   r   r   r(      s    zReverse.as_oracle)r   r   r   r"   r0   r(   r   r   r   )r   r   r^      s   r^   c               @   s   e Zd ZdZdd ZdS )RightZRIGHTc             C   s   t | jd | jd td S )Nr   rC   )rH   rI   r   )r   r   r   r   rJ      s    zRight.get_substrN)r   r   r   r"   rJ   r   r   r   r   r`      s   r`   c               @   s   e Zd ZdZdS )rZ   ZRPADN)r   r   r   r"   r   r   r   r   rZ      s   rZ   c               @   s   e Zd ZdZdZdS )RTrimZRTRIMZrtrimN)r   r   r   r"   r0   r   r   r   r   rb     s   rb   c               @   s   e Zd Zd ZdZdS )SHA1sha1N)r   r   r   r"   r0   r   r   r   r   rc     s   rc   c               @   s   e Zd Zd ZdZdd ZdS )SHA224sha224c             K   s   t dd S )Nz"SHA224 is not supported on Oracle.)r   )r   r#   r   r'   r   r   r   r(     s    zSHA224.as_oracleN)r   r   r   r"   r0   r(   r   r   r   r   re     s   re   c               @   s   e Zd Zd ZdZdS )SHA256sha256N)r   r   r   r"   r0   r   r   r   r   rg     s   rg   c               @   s   e Zd Zd ZdZdS )SHA384sha384N)r   r   r   r"   r0   r   r   r   r   ri     s   ri   c               @   s   e Zd Zd ZdZdS )SHA512sha512N)r   r   r   r"   r0   r   r   r   r   rk     s   rk   c                   s.   e Zd ZdZdZdZe Z fddZ  Z	S )StrIndexz
    Return a positive integer corresponding to the 1-indexed position of the
    first occurrence of a substring inside another string, or 0 if the
    substring is not found.
    ZINSTRr<   c                s   t  j||fddi|S )Nr"   ZSTRPOS)r   r!   )r   r#   r   r'   )r   r   r   r+   ,  s    zStrIndex.as_postgresql)
r   r   r   r   r"   rK   r   r   r+   r   r   r   )r   r   rm   "  s
   rm   c                   s:   e Zd ZdZd	 fdd	Z fddZ fddZ  ZS )
rH   Z	SUBSTRINGNc                sF   t |ds|dk rtd||g}|dk	r4|j| 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
        rE   rC   z'pos' must be greater than 0N)rF   r>   appendr   r@   )r   r   posrG   rB   rA   )r   r   r   r@   3  s    

zSubstr.__init__c                s   t  j||fddi|S )Nr"   SUBSTR)r   r!   )r   r#   r   r'   )r   r   r   r/   A  s    zSubstr.as_sqlitec                s   t  j||fddi|S )Nr"   rp   )r   r!   )r   r#   r   r'   )r   r   r   r(   D  s    zSubstr.as_oracle)N)r   r   r   r"   r@   r/   r(   r   r   r   )r   r   rH   0  s   rH   c               @   s   e Zd ZdZdZdS )TrimZTRIMZtrimN)r   r   r   r"   r0   r   r   r   r   rq   H  s   rq   c               @   s   e Zd ZdZdZdS )UpperZUPPERupperN)r   r   r   r"   r0   r   r   r   r   rr   M  s   rr   N)(django.db.models.expressionsr   r   django.db.models.fieldsr   Zdjango.db.models.functionsr   django.db.models.lookupsr   django.db.utilsr   r   r   r&   r)   r,   r1   r;   rD   rL   rM   rN   rP   rQ   rS   rW   r[   r^   r`   rZ   rb   rc   re   rg   ri   rk   rm   rH   rq   rr   r   r   r   r   <module>   sB   

	