U
    7h+                     @   s&  d dl mZ d dlmZmZ d dlmZmZmZ d dl	m
Z
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	TextField)Cast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
connectionextra_context	__class__ Y/var/www/formularioweb/env/lib/python3.8/site-packages/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   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"   7   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                       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
    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*   K   s    
zConcatPair.as_sqlitec                    s6   |   }|dd | D  tt|j||f|S )Nc                 S   s   g | ]}t |t qS r   )r	   r   .0
expressionr   r   r   
<listcomp>X   s   z,ConcatPair.as_postgresql.<locals>.<listcomp>)copyset_source_expressionsget_source_expressionsr   r,   r   )r   r   r   r   r3   r   r   r   r%   U   s    
zConcatPair.as_postgresqlc                    s   t  j||fddd|S )NZ	CONCAT_WSz!%(function)s('', %(expressions)s)r)   r!   r   r   r   r   r   c   s    zConcatPair.as_mysqlc                 C   s$   |   }|dd | D  |S )Nc                 S   s   g | ]}t |td qS ) )r
   r   r/   r   r   r   r2   q   s   z'ConcatPair.coalesce.<locals>.<listcomp>)r3   r4   r5   )r   cr   r   r   r.   m   s    zConcatPair.coalesce)
r   r   r   __doc__r   r*   r%   r   r.   r   r   r   r   r   r,   C   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>      s    
zConcat.__init__c                 C   s0   t |dkrt| S t|d | |dd  S )Nr:   r      )r;   r,   r=   )r   r?   r   r   r   r=      s    zConcat._paired)	r   r   r   r8   r   r   r>   r=   r   r   r   r   r   r9   y   s
   r9   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 )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_expressionrA   z 'length' must be greater than 0.Nhasattrr<   r   r>   )r   r1   lengthr@   r   r   r   r>      s    
zLeft.__init__c                 C   s   t | jd td| jd S )Nr   rA   Substrsource_expressionsr   r   r   r   r   
get_substr   s    zLeft.get_substrc                 K   s   |   j||f|S N)rK   r"   r   r   r   r   r"      s    zLeft.as_oraclec                 K   s   |   j||f|S rL   )rK   r*   r   r   r   r   r*      s    zLeft.as_sqlite)r   r   r   r   arityr   output_fieldr>   rK   r"   r*   r   r   r   r   r   rB      s   
rB   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LENGTHrF   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   r8   r   r+   r   rN   r   r   r   r   r   r   rO      s
   rO   c                   @   s   e Zd ZdZdZdS )LowerZLOWERr$   Nr   r   r   r   r+   r   r   r   r   rP      s   rP   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 )NrC   r   z''length' must be greater or equal to 0.rD   )r   r1   rF   Z	fill_textr@   r   r   r   r>      s    zLPad.__init__)	r   r   r   r   r   rN   r   r>   r   r   r   r   r   rR      s   rR   c                   @   s   e Zd ZdZdZdS )LTrimZLTRIMZltrimNrQ   r   r   r   r   rT      s   rT   c                   @   s   e Zd Zd ZdZdS )MD5md5NrQ   r   r   r   r   rU      s   rU   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   rN   r   r*   r   r   r   r   r   rW      s
   rW   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 )NrC   r   z''number' must be greater or equal to 0.rD   )r   r1   numberr@   r   r   r   r>      s    zRepeat.__init__c                 K   s>   | j \}}|d krd n
t|| }t|||}|j||f|S rL   )rI   rO   RPadr   )r   r   r   r   r1   r]   rF   Zrpadr   r   r   r"      s    
zRepeat.as_oracle)	r   r   r   r   r   rN   r>   r"   r   r   r   r   r   r[      s   	r[   c                       s(   e Zd ZdZedf fdd	Z  ZS )ReplaceZREPLACEr6   c                    s   t  j|||f| d S rL   )r   r>   )r   r1   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   rb      s   rb   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   rA   rG   rJ   r   r   r   rK     s     zRight.get_substrN)r   r   r   r   rK   r   r   r   r   rd     s   rd   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rtrimNrQ   r   r   r   r   rf     s   rf   c                   @   s   e Zd Zd ZdZdS )SHA1sha1NrQ   r   r   r   r   rg   "  s   rg   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   ri   '  s   ri   c                   @   s   e Zd Zd ZdZdS )SHA256sha256NrQ   r   r   r   r   rk   /  s   rk   c                   @   s   e Zd Zd ZdZdS )SHA384sha384NrQ   r   r   r   r   rm   4  s   rm   c                   @   s   e Zd Zd ZdZdS )SHA512sha512NrQ   r   r   r   r   ro   9  s   ro   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STRPOSr!   r   r   r   r   r%   I  s    zStrIndex.as_postgresql)
r   r   r   r8   r   rM   r   rN   r%   r   r   r   r   r   rq   >  s
   rq   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 )
rH   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
        rC   rA   z'pos' must be greater than 0N)rE   r<   appendr   r>   )r   r1   posrF   r@   r?   r   r   r   r>   Q  s    

zSubstr.__init__c                    s   t  j||fddi|S Nr   ZSUBSTRr!   r   r   r   r   r*   _  s    zSubstr.as_sqlitec                    s   t  j||fddi|S rt   r!   r   r   r   r   r"   b  s    zSubstr.as_oracle)N)
r   r   r   r   r   rN   r>   r*   r"   r   r   r   r   r   rH   M  s
   rH   c                   @   s   e Zd ZdZdZdS )TrimZTRIMZtrimNrQ   r   r   r   r   ru   f  s   ru   c                   @   s   e Zd ZdZdZdS )UpperZUPPERupperNrQ   r   r   r   r   rv   k  s   rv   N)*Z	django.dbr   Zdjango.db.models.expressionsr   r   Zdjango.db.models.fieldsr   r   r   Zdjango.db.models.functionsr	   r
   Zdjango.db.models.lookupsr   r   r    r#   r&   r,   r9   rB   rO   rP   rR   rT   rU   rW   r[   r_   rb   rd   r^   rf   rg   ri   rk   rm   ro   rq   rH   ru   rv   r   r   r   r   <module>   s@   
6	