o
    ѷ6iC1                     @  sd  d dl mZ d dlZd dlZd dlmZ d dlmZ d dlm	Z	 d dlm
Z
 d dlmZ d dlmZ d d	lmZ d d
lmZ d dlmZ d dlmZ d dlmZ d dlmZ d dlmZ d dlmZ eeef 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$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/d0 d0e'Z)G d1d2 d2e'Z*G d3d4 d4e'Z+G d5d6 d6eZ,G d7d8 d8eZ-G d9d: d:eZ.G d;d< d<eZ/G d=d> d>eZ0G d?d@ d@eZ1G dAdB dBeZ2dS )C    )annotationsN)Any)Union)DEFAULT_DB_ALIAS)connections)BaseDatabaseWrapper)	CharField)
Expression)Field)Func)IntegerField)	JSONField)	TextField)Value)SQLCompilerc                      s(   e Zd ZU ded< d	 fddZ  ZS )
SingleArgFuncztype[DjangoField]output_field_class
expressionExpressionArgumentreturnNonec                   s   t  j||  d d S Noutput_field)super__init__r   selfr   	__class__ b/var/www/hoanhtaovolam_webdjango/env/lib/python3.10/site-packages/django_mysql/models/functions.pyr      s   zSingleArgFunc.__init__)r   r   r   r   )__name__
__module____qualname____annotations__r   __classcell__r    r    r   r!   r      s   
 r   c                      s(   e Zd ZdZ		dd fddZ  ZS )IfIFN	conditionr   truefalseExpressionArgument | Noner   DjangoField | Noner   r   c                   s&   |d u rt  }t j||||d d S r   )DjangoFieldr   r   )r   r)   r*   r+   r   r   r    r!   r   (   s   zIf.__init__)NN)
r)   r   r*   r   r+   r,   r   r-   r   r   r"   r#   r$   functionr   r&   r    r    r   r!   r'   %   s
    r'   c                   @  s   e Zd Zd ZeZdS )CRC32N)r"   r#   r$   r0   r   r   r    r    r    r!   r1   9   s    r1   c                      s,   e Zd ZdZdZddd fddZ  ZS )ConcatWSz*
    Stands for CONCAT_With-Separator
    	CONCAT_WS,)	separatorexpressionsr   r5   
str | Noner   r   c                  sJ   t |dk r
tdt|dst|}t }t j|g|R d|i d S )N   z+ConcatWS must take at least two expressionsresolve_expressionr   )len
ValueErrorhasattrr   r   r   r   )r   r5   r6   r   r   r    r!   r   H   s   
zConcatWS.__init__)r6   r   r5   r7   r   r   )r"   r#   r$   __doc__r0   r   r&   r    r    r   r!   r2   A   s
    r2   c                      s"   e Zd Zd Zd	 fddZ  ZS )
ELTnumr   r6   4list[ExpressionArgument] | tuple[ExpressionArgument]r   r   c                   sJ   g }|D ]}t |dst|}|| qt j|g|R dt i d S Nr9   r   )r<   r   appendr   r   r   )r   r?   r6   value_exprsvr   r    r!   r   Y   s   
 zELT.__init__)r?   r   r6   r@   r   r   r/   r    r    r   r!   r>   V       r>   c                      s"   e Zd ZdZd fd
dZ  ZS )r
   FIELDfieldr   valuesr@   kwargsr   r   r   c                   sB   g }|D ]}t |dst|}|| qt j|g|R   d S )Nr9   )r<   r   rB   r   r   )r   rG   rH   rI   values_exprsrD   r   r    r!   r   j   s   
zField.__init__)rG   r   rH   r@   rI   r   r   r   r/   r    r    r   r!   r
   g   rE   r
   c                      "   e Zd ZdZd
 fdd	Z  ZS )	UpdateXML	UPDATEXML
xml_targetr   
xpath_exprnew_xmlr   r   c                   >   t |ds	t|}t |dst|}t j|||t d d S Nr9   r   r<   r   r   r   r   )r   rN   rO   rP   r   r    r!   r      s
   

zUpdateXML.__init__)rN   r   rO   r   rP   r   r   r   r/   r    r    r   r!   rL   |   rE   rL   c                      "   e Zd ZdZd	 fddZ  ZS )
XMLExtractValueEXTRACTVALUExml_fragr   rO   r   r   c                   *   t |ds	t|}t j||t d d S rR   rS   )r   rW   rO   r   r    r!   r         
zXMLExtractValue.__init__)rW   r   rO   r   r   r   r/   r    r    r   r!   rU      rE   rU   c                      s6   e Zd ZdZdd fddZeefdddZ  ZS )LastInsertIdLAST_INSERT_IDNr   r,   r   r   c                   s2   |d urt  j|t d d S t  jt d d S r   )r   r   r   r   r   r    r!   r      s   zLastInsertId.__init__usingstrintc                 C  sF   t |  }|d | d W  d    S 1 sw   Y  d S )NzSELECT LAST_INSERT_ID()r   )r   cursorexecutefetchone)clsr\   r_   r    r    r!   get   s   

$zLastInsertId.getN)r   r,   r   r   )r\   r]   r   r^   )	r"   r#   r$   r0   r   classmethodr   rc   r&   r    r    r   r!   rZ      s
    rZ   c                      s(   e Zd ZdZddd fddZ  ZS )JSONExtractJSON_EXTRACTNr   r   r   pathsr   type[DjangoField] | Noner   r   c                  sf   |g}|D ]}t |dst|}|| q|d ur%t|dkr$tdnt }t j|d|i d S )Nr9      zQoutput_field won't work with more than one path, as a JSON Array will be returnedr   )r<   r   rB   r:   	TypeErrorr   r   r   )r   r   r   rh   exprspathr   r    r!   r      s   
zJSONExtract.__init__)r   r   rh   r   r   ri   r   r   r/   r    r    r   r!   rf      s    rf   c                      s&   e Zd ZdZ	dd fd	d
Z  ZS )JSONKeys	JSON_KEYSNr   r   rm   r,   r   r   c                   sB   |g}|d urt |dst|}|| t j|dt i d S rA   )r<   r   rB   r   r   r   )r   r   rm   rl   r   r    r!   r      s   

zJSONKeys.__init__rd   )r   r   rm   r,   r   r   r/   r    r    r   r!   rn      s    rn   c                      s,   e Zd ZdZ	dddd fddZ  ZS )
JSONLengthJSON_LENGTHNr   r   r   rm   r,   r   r-   extrar   r   r   c                  sN   |d u rt  }|g}|d urt|dst|}|| t j|d|i d S rA   )r   r<   r   rB   r   r   )r   r   rm   r   rr   rl   r   r    r!   r      s   

zJSONLength.__init__rd   )
r   r   rm   r,   r   r-   rr   r   r   r   r/   r    r    r   r!   rp      s    rp   c                   @  s    e Zd ZdddZdddZdS )	JSONValuedata5None | int | float | str | list[Any] | dict[str, Any]r   r   c                 C  s
   || _ d S rd   )_data)r   rt   r    r    r!   r      s   
zJSONValue.__init__compilerr   
connectionr   tuple[str, tuple[Any, ...]]c                 C  sF   |j dkr	tdtj| jdd}|j dkr|jrd|ffS d|ffS )Nmysqlz%JSONValue only supports MySQL/MariaDBF)	allow_nanzJSON_EXTRACT(%s, '$')zCAST(%s AS JSON))vendorAssertionErrorjsondumpsrv   mysql_is_mariadb)r   rw   rx   json_stringr    r    r!   as_sql   s   


zJSONValue.as_sqlN)rt   ru   r   r   )rw   r   rx   r   r   ry   )r"   r#   r$   r   r   r    r    r    r!   rs      s    
rs   c                      s   e Zd Zd	 fddZ  ZS )
BaseJSONModifyFuncr   r   rt   Udict[str, ExpressionArgument | None | int | float | str | list[Any] | dict[str, Any]]r   r   c                   st   |st d|g}| D ] \}}t|dst|}|| t|ds(t|}|| qt j|dt i d S )Nz"data" cannot be emptyr9   r   )	r;   itemsr<   r   rB   rs   r   r   r   )r   r   rt   rl   rm   valuer   r    r!   r     s   


zBaseJSONModifyFunc.__init__)r   r   rt   r   r   r   )r"   r#   r$   r   r&   r    r    r   r!   r     s    r   c                   @     e Zd ZdZdS )
JSONInsertJSON_INSERTNr"   r#   r$   r0   r    r    r    r!   r   0      r   c                   @  r   )JSONReplaceJSON_REPLACENr   r    r    r    r!   r   4  r   r   c                   @  r   )JSONSetJSON_SETNr   r    r    r    r!   r   8  r   r   c                   @  r   )JSONArrayAppendJSON_ARRAY_APPENDNr   r    r    r    r!   r   <  r   r   c                      rT   )
RegexpInstrREGEXP_INSTRr   r   regexr   r   c                   rX   rR   )r<   r   r   r   r   r   r   r   r   r    r!   r   F  rY   zRegexpInstr.__init__r   r   r   r   r   r   r/   r    r    r   r!   r   C  rE   r   c                      rK   )RegexpReplaceREGEXP_REPLACEr   r   r   replacer   r   c                   rQ   rR   r<   r   r   r   r   )r   r   r   r   r   r    r!   r   R  s
   

zRegexpReplace.__init__)r   r   r   r   r   r   r   r   r/   r    r    r   r!   r   O  rE   r   c                      rT   )
RegexpSubstrREGEXP_SUBSTRr   r   r   r   r   c                   rX   rR   r   r   r   r    r!   r   d  rY   zRegexpSubstr.__init__r   r/   r    r    r   r!   r   a  rE   r   c                      s*   e Zd ZdZdZdZd fd
dZ  ZS )AsTypezN
    Helper for ColumnAdd when you want to add a column with a given type
     z %(expressions)s AS %(data_type)sr   r   	data_typer]   r   r   c                   sR   ddl m} t|dst|}||jvr|dkrtd|t j||d d S )Nr   KeyTransformr9   BINARYInvalid data_type )r   )"django_mysql.models.fields.dynamicr   r<   r   TYPE_MAPr;   r   r   )r   r   r   r   r   r    r!   r   x  s   
zAsType.__init__)r   r   r   r]   r   r   )r"   r#   r$   r=   r0   templater   r&   r    r    r   r!   r   p  s
    r   c                      rK   )	ColumnAdd
COLUMN_ADDr   r   to_addMdict[str, ExpressionArgument | float | int | dt.date | dt.time | dt.datetime]r   r   c                   s   ddl m} |g}| D ]&\}}t|dst|}t|tr#tdt|ds,t|}|||f qt	 j
|d| i d S )Nr   DynamicFieldr9   z-ColumnAdd with nested values is not supportedr   )django_mysql.models.fieldsr   r   r<   r   
isinstancedictr;   extendr   r   )r   r   r   r   r6   namer   r   r    r!   r     s   


zColumnAdd.__init__)r   r   r   r   r   r   r/   r    r    r   r!   r     rE   r   c                      rT   )
ColumnDeleteCOLUMN_DELETEr   r   	to_deleter   r   c                   sP   ddl m} |g}|D ]}t|dst|}|| qt j|d| i d S )Nr   r   r9   r   )r   r   r<   r   rB   r   r   )r   r   r   r   r6   r   r   r    r!   r     s   
zColumnDelete.__init__)r   r   r   r   r   r   r/   r    r    r   r!   r     rE   r   c                      s&   e Zd ZdZdZd
 fdd	Z  ZS )	ColumnGet
COLUMN_GETz,COLUMN_GET(%(expressions)s AS %(data_type)s)r   r   column_namer   r]   c                   s~   ddl m} ddl m} t|dst|}|dkr| }nz|j| }W n ty2   td|w t j	||||d d S )Nr   r   r   r9   r   r   )r   r   )
r   r   r   r<   r   r   KeyErrorr;   r   r   )r   r   r   r   r   r   r   r   r    r!   r     s"   

zColumnGet.__init__)r   r   r   r   r   r]   )r"   r#   r$   r0   r   r   r&   r    r    r   r!   r     s    r   )3
__future__r   datetimedtr~   typingr   r   	django.dbr   r   django.db.backends.base.baser   django.db.modelsr   r	   r
   r.   r   r   r   r   r   django.db.models.sql.compilerr   r]   r   r   r'   r1   r2   r>   rL   rU   rZ   rf   rn   rp   rs   r   r   r   r   r   r   r   r   r   r   r   r   r    r    r    r!   <module>   s^    
$