o
    EDi#                     @   s   d dl Z d dlmZ d dlmZmZmZmZmZm	Z	m
Z
mZmZ d dlmZ d dlmZ d dlmZ d dlmZmZmZ d dlmZmZ erLd d	lmZ e eZd
ZG dd de	Z G dd deZ!dS )    N)log)	IterableSequenceOptionalAnyDict
NamedTuple	GeneratorUnionTYPE_CHECKINGquote_identifier)	data_conv)BaseQueryContext)nppdpd_time_test)ProgrammingError	DataError)ClickHouseTypei    c                   @   sN   e Zd ZU eed< eed< eed< ee ed< ed ed< eee	  ed< dS )	InsertBlockprefixcolumn_count	row_countcolumn_namesr   column_typescolumn_dataN)
__name__
__module____qualname__bytes__annotations__intr   strr   r    r$   r$   Y/var/www/Datamplify/venv/lib/python3.10/site-packages/clickhouse_connect/driver/insert.pyr      s   
 r   c                       sF  e Zd ZdZ								d&dedee ded dedee d	ee	eef  d
ee
eef  dee	eef  dee	ee
ee	eef f f  dee dee	eef  f fddZedefddZedd ZejdefddZdefddZdeeddf fddZdd Zdd Zdd  Zd!d" Zd#edefd$d%Z  ZS )'InsertContextz9
    Reusable Argument/parameter object for inserts.
    Ntabler   r   r   datacolumn_orientedsettingscompressionquery_formatscolumn_formats
block_sizetransport_settingsc                    sZ   t  j|||	|d || _|| _|| _|d u rdn|| _|| _|
| _t| _	|| _
d | _d S )N)r/   F)super__init__r'   r   r   r)   r+   req_block_sizeDEFAULT_BLOCK_BYTESblock_row_countr(   insert_exception)selfr'   r   r   r(   r)   r*   r+   r,   r-   r.   r/   	__class__r$   r%   r1   #   s   
zInsertContext.__init__returnc                 C   s
   | j d u S N)_datar6   r$   r$   r%   empty:   s   
zInsertContext.emptyc                 C   s   | j S r:   )	_raw_datar<   r$   r$   r%   r(   >   s   zInsertContext.datac                 C   s  || _ d| _d| _d| _d| _d | _|d u st|dkrd S tr.t|tj	r.| 
|}d| _tr;t|tjr;| |}| jrU| j| _|| _d | _t|| _t|d | _n| j| _|| _d | _t|| _t|d | _| jr| jr| jt| jkr}td|| _|  | _d S d S d S )Nr   Tz4Insert data column count does not match column names)r>   current_blockcurrent_rowr   r   r;   lenr   
isinstance	DataFrame_convert_pandasr)   r   ndarray_convert_numpy_column_block_data_next_block_data_block_columns_block_rows_row_block_datar   r   _calc_block_sizer4   )r6   r(   r$   r$   r%   r(   B   s<   



c                    s  | j r| j S d}tt| jd d d}tdt| j| }t| jD ]N\}|jr0||j7 }q#| j	rV| j
  |dkrB| }n+ fddtd| j|D }||}n| j
fddtd| j|D }||}||7 }q#dtt|d }|dk rdS ddtt|d > S )	Nr         @   c                       g | ]} | qS r$   r$   .0j)col_datar$   r%   
<listcomp>r       z2InsertContext._calc_block_size.<locals>.<listcomp>c                    s   g | ]} |  qS r$   r$   rQ   )r(   ir$   r%   rU   v          )r2   minr   r   maxr"   	enumerater   	byte_sizer)   r;   	data_sizerange)r6   row_sizesample_sizesample_freqd_typed_sizesample
shift_sizer$   )rT   r(   rW   r%   rL   c   s*   



"zInsertContext._calc_block_sizec                 c   s    	 t | j| j | j}|| j }|dkrd S | jdkr7dddd | jD  d}d| j | d	 }nt	 }|  jd
7  _| 
| j|}t|| j|| j| j|V  || _q)NTr   z (z, c                 S   s   g | ]}t |qS r$   r   rR   xr$   r$   r%   rU      rV   z,InsertContext.next_block.<locals>.<listcomp>)zINSERT INTO z FORMAT Native
rM   )rZ   r@   r4   r   r?   joinr   r'   encoder    rH   r   r   r   )r6   	block_endr   colsr   r(   r$   r$   r%   
next_block|   s   

zInsertContext.next_blockc                    s.   dkr| j  kr| jS  fdd| jD S )Nr   c                    s   g | ]}|  qS r$   r$   )rR   colrl   block_startr$   r%   rU      rX   z4InsertContext._column_block_data.<locals>.<listcomp>)r   rI   r6   rq   rl   r$   rp   r%   rG      s   z InsertContext._column_block_datac                 C   s   t | j||S r:   )r   pivotrJ   rr   r$   r$   r%   rK      s   zInsertContext._row_block_datac                    s6  g }t |j| j| jD ]\}}}|| }|jj}|jtkr<|dkr,| j	|j
dd}n5|dv r;|js;||  qn%d|jv rat|sLdt|jv ra|j | fdd|D  d	| j|< q|jr|d
krw|tjd itjd i}nd|j
v r|dd |D  q|tjd i}||jdd q|S )NfF)copy)rW   udatetimezdatetime64[nsc                    s$   g | ]}t |rd n|j  qS r:   )r   isnullvaluerg   divr$   r%   rU      s   $ z1InsertContext._convert_pandas.<locals>.<listcomp>r"   OFloatc                 S   s   g | ]}t |rd n|qS r:   )r   rx   rg   r$   r$   r%   rU      s    )zipcolumnsr   r   dtypekindpython_typer"   roundastype	base_typehasnansappendto_listnp_typer   r#   nano_divisorr-   nullablereplacer   NaTr   nanto_numpy)r6   dfr(   df_col_namecol_namech_typedf_cold_type_kindr$   rz   r%   rD      s2   
 

zInsertContext._convert_pandasc                    s^   j jd u rDdt j v r*t| j| jD ]\}}d|jv r"d| j|< q d	 S | jD ]}|j
dks;|j
 j jkrA 	   S q- S t| jt j jr[ fdd| jD }n fdd j jD }tt| j| jD ]:\}\}}|| j }dt|v rd|jv rd| j|< || t	 ||< qo|j
dks|j
|jkr|| 	 ||< qod| _|S )Ndater"   r   c                    rP   r$   r$   rR   r   np_arrayr$   r%   rU      rV   z0InsertContext._convert_numpy.<locals>.<listcomp>c                    rP   r$   r$   r   r   r$   r%   rU      rV   T)r   namesr#   r~   r   r   r   r-   r   tolistr]   itemsizesetissubsetr\   r"   r)   )r6   r   r   col_typer(   ixrc   r$   r   r%   rF      s2   




zInsertContext._convert_numpyerror_messagec                 C   s   t d| j d| S )NzFailed to write column 'z': )r   column_name)r6   r   r$   r$   r%   
data_error   s   zInsertContext.data_error)NNNNNNNN)r   r   r   __doc__r#   r   r   r   boolr   r
   r"   r1   propertyr=   r(   setterrL   r	   r   rn   rG   rK   rD   rF   r   r   __classcell__r$   r$   r7   r%   r&      s\    		

 r&   )"loggingmathr   typingr   r   r   r   r   r   r	   r
   r   !clickhouse_connect.driver.bindingr    clickhouse_connect.driver.ctypesr   !clickhouse_connect.driver.contextr   !clickhouse_connect.driver.optionsr   r   r   $clickhouse_connect.driver.exceptionsr   r   !clickhouse_connect.datatypes.baser   	getLoggerr   loggerr3   r   r&   r$   r$   r$   r%   <module>   s    ,

