U
    Ha>(                     @   s  d dl mZ d dlmZmZ d dlmZ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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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eeZG d.d/ d/eeeZ G d0d1 d1eeeeZ!G d2d3 d3eeeeZ"G d4d5 d5eeeeZ#G d6d7 d7eZ$G d8d9 d9eZ%G d:d; d;eZ&G d<d= d=eZ'd>S )?    NotSupportedError)FuncValue)	CharFieldIntegerField)Coalesce)	Transformc                       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)   )superas_sqlfunctionselfcompiler
connectionZextra_content	__class__ C/tmp/pip-unpacked-wheel-3jxiddxt/django/db/models/functions/text.pyas_mysql	   s    zMySQLSHA2Mixin.as_mysql)__name__
__module____qualname__r   __classcell__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_contextr   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 d|S )Nz6ENCODE(DIGEST(%(expressions)s, '%(function)s'), 'hex'))r   r   )r   r   r   lowerr   r   r   r   as_postgresql    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   .   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!   5   s     zChr.as_oraclec                    s   t  j||fddi|S )Nr   r'   r   r   r   r   r   	as_sqlite<   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(   |   }tt|j||fddd|S )N%(expressions)sz || )r   Z
arg_joiner)coalescer   r+   r   )r   r   r   r    Z	coalescedr   r   r   r)   G   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   N   s     zConcatPair.as_mysqlc                 C   s$   |   }|dd | D  |S )Nc                 S   s   g | ]}t |td qS ) )r   r   ).0
expressionr   r   r   
<listcomp>Y   s    z'ConcatPair.coalesce.<locals>.<listcomp>)copyZset_source_expressionsZget_source_expressions)r   cr   r   r   r-   V   s
    
zConcatPair.coalesce)	r   r   r   __doc__r   r)   r   r-   r   r   r   r   r   r+   @   s
   r+   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.
    Nr,   c                    s2   t |dk rtd| |}t j|f| d S )N   z)Concat must take at least two expressions)len
ValueError_pairedr   __init__)r   expressionsextraZpairedr   r   r   r:   h   s    
zConcat.__init__c                 C   s0   t |dkrt| S t|d | |dd  S )Nr6   r      )r7   r+   r9   )r   r;   r   r   r   r9   n   s    zConcat._paired)	r   r   r   r4   r   r   r:   r9   r   r   r   r   r   r5   _   s
   r5   c                       sB   e Zd ZdZdZe Z fddZdd Zdd Z	d	d
 Z
  ZS )LeftLEFTr6   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_expressionr=   z 'length' must be greater than 0.Nhasattrr8   r   r:   )r   r0   lengthr<   r   r   r   r:   |   s    
zLeft.__init__c                 C   s   t | jd td| jd S )Nr   r=   Substrsource_expressionsr   r   r   r   r   
get_substr   s    zLeft.get_substrc                 K   s   |   j||f|S N)rH   r!   r   r   r   r   r!      s    zLeft.as_oraclec                 K   s   |   j||f|S rI   )rH   r)   r   r   r   r   r)      s    zLeft.as_sqlite)r   r   r   r   arityr   output_fieldr:   rH   r!   r)   r   r   r   r   r   r>   w   s   
r>   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LENGTHrC   c                    s   t  j||fddi|S )Nr   ZCHAR_LENGTHr   r   r   r   r   r      s    zLength.as_mysql)
r   r   r   r4   r   r*   r   rK   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   r*   r   r   r   r   rM      s   rM   c                       s.   e Zd ZdZe Zedf fdd	Z  ZS )LPadZLPAD c                    s:   t |ds"|d k	r"|dk r"tdt j|||f| d S )Nr@   r   z''length' must be greater or equal to 0.rA   )r   r0   rC   Z	fill_textr<   r   r   r   r:      s    zLPad.__init__)	r   r   r   r   r   rK   r   r:   r   r   r   r   r   rO      s   rO   c                   @   s   e Zd ZdZdZdS )LTrimZLTRIMZltrimNrN   r   r   r   r   rQ      s   rQ   c                   @   s   e Zd Zd ZdZdS )MD5md5NrN   r   r   r   r   rR      s   rR   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ORDr   r   r   r   r   r      s    zOrd.as_mysqlc                    s   t  j||fddi|S )Nr   UNICODEr   r   r   r   r   r)      s    zOrd.as_sqlite)
r   r   r   r   r*   r   rK   r   r)   r   r   r   r   r   rT      s
   rT   c                       s.   e Zd ZdZe Z fddZdd Z  ZS )RepeatREPEATc                    s8   t |ds"|d k	r"|dk r"tdt j||f| d S )Nr@   r   z''number' must be greater or equal to 0.rA   )r   r0   numberr<   r   r   r   r:      s    zRepeat.__init__c                 K   s>   | j \}}|d krd n
t|| }t|||}|j||f|S rI   )rF   rL   RPadr   )r   r   r   r    r0   rZ   rC   Zrpadr   r   r   r!      s    
zRepeat.as_oracle)	r   r   r   r   r   rK   r:   r!   r   r   r   r   r   rX      s   rX   c                       s(   e Zd ZdZedf fdd	Z  ZS )ReplaceZREPLACEr.   c                    s   t  j|||f| d S rI   )r   r:   )r   r0   textreplacementr<   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!      s     zReverse.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d ZdS )RightRIGHTc                 C   s   t | jd | jd td S )Nr   r=   rD   rG   r   r   r   rH      s    zRight.get_substrN)r   r   r   r   rH   r   r   r   r   ra      s   ra   c                   @   s   e Zd ZdZdS )r[   ZRPADN)r   r   r   r   r   r   r   r   r[      s   r[   c                   @   s   e Zd ZdZdZdS )RTrimZRTRIMZrtrimNrN   r   r   r   r   rd      s   rd   c                   @   s   e Zd Zd ZdZdS )SHA1sha1NrN   r   r   r   r   re      s   re   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!     s    zSHA224.as_oracleN)r   r   r   r   r*   r!   r   r   r   r   rg      s   rg   c                   @   s   e Zd Zd ZdZdS )SHA256sha256NrN   r   r   r   r   ri     s   ri   c                   @   s   e Zd Zd ZdZdS )SHA384sha384NrN   r   r   r   r   rk     s   rk   c                   @   s   e Zd Zd ZdZdS )SHA512sha512NrN   r   r   r   r   rm     s   rm   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INSTRr6   c                    s   t  j||fddi|S )Nr   ZSTRPOSr   r   r   r   r   r$     s    zStrIndex.as_postgresql)
r   r   r   r4   r   rJ   r   rK   r$   r   r   r   r   r   ro     s
   ro   c                       s@   e Zd ZdZe Zd	 fdd	Z fddZ fddZ  Z	S )
rE   Z	SUBSTRINGNc                    sF   t |ds|dk rtd||g}|dk	r4|| 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
        r@   r=   z'pos' must be greater than 0N)rB   r8   appendr   r:   )r   r0   posrC   r<   r;   r   r   r   r:   '  s    

zSubstr.__init__c                    s   t  j||fddi|S Nr   ZSUBSTRr   r   r   r   r   r)   5  s    zSubstr.as_sqlitec                    s   t  j||fddi|S rr   r   r   r   r   r   r!   8  s    zSubstr.as_oracle)N)
r   r   r   r   r   rK   r:   r)   r!   r   r   r   r   r   rE   #  s
   rE   c                   @   s   e Zd ZdZdZdS )TrimZTRIMZtrimNrN   r   r   r   r   rs   <  s   rs   c                   @   s   e Zd ZdZdZdS )UpperZUPPERupperNrN   r   r   r   r   rt   A  s   rt   N)(Z	django.dbr   Zdjango.db.models.expressionsr   r   Zdjango.db.models.fieldsr   r   Zdjango.db.models.functionsr   Zdjango.db.models.lookupsr	   r
   r   r"   r%   r+   r5   r>   rL   rM   rO   rQ   rR   rT   rX   r\   r_   ra   r[   rd   re   rg   ri   rk   rm   ro   rE   rs   rt   r   r   r   r   <module>   s@   


