o
    :i                     @   s  d dl Z d dlZd dlZd dlmZmZmZ d dlmZ d dlm	Z	m
Z
mZmZmZm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	Zed
dddfZedZG dd dZdefddZ	d)dede	e
eeeef f  de	e defddZ	d)dede	e
eeeef f  de	e deeeeef f fddZ defddZ!defdd Z"ej#fdedefd!d"Z$ej#fdedefd#d$Z%ej#d%fdeded&e&fd'd(Z'dS )*    N)tzinfodatetimedate)Enum)OptionalUnionSequenceDictAnyTuple)common)tzutil)	dict_copy)any_to_json\'`	
z{.+:.+}c                   @   s0   e Zd ZdefddZdededefddZd	S )
	DT64Paramvaluec                 C   s
   || _ d S Nr   )selfr    r   n/home/aiteam/pcaa-dev/dashboard-backend/venv/lib/python3.10/site-packages/clickhouse_connect/driver/binding.py__init__   s   
zDT64Param.__init__tz	top_levelreturnc                 C   s2   | j }|r
||}|d}|r|S d| dS )Nz%Y-%m-%d %H:%M:%S.%fr   )r   
astimezonestrftime)r   r   r   r   sr   r   r   format   s   

zDT64Param.formatN)	__name__
__module____qualname__r   r   r   boolstrr#   r   r   r   r   r      s    r   
identifierc                 C   s0   | d }|dv r| d |kr| S dt |  dS )Nr   )r   "r   
escape_str)r)   
first_charr   r   r   quote_identifier"   s   r/   query
parameters	server_tzr   c                    sP   |  d} |s	| S t|dr|  fdd| D  S | t fdd|D  S )N;itemsc                    s   i | ]
\}}|t | qS r   format_query_value.0kvr2   r   r   
<dictcomp>0   s    z"finalize_query.<locals>.<dictcomp>c                 3       | ]}t | V  qd S r   r5   )r8   r:   r;   r   r   	<genexpr>1       z!finalize_query.<locals>.<genexpr>)rstriphasattrr4   tuple)r0   r1   r2   r   r;   r   finalize_query*   s   

rC   c                    s  |  d} |s| i fS d }t|trt|}dd | D }| D ]}||= q#i }| D ]<\}}|drgt|trH|d d }t|}nt|t	rgt
|dkrgt|d trg|d d }dd |D }|||< q/t| d u r}t| | i } }	n fd	d| D }	n	t| | i } }	|r|  }
i }| D ]'\}}| }d}	 |
||}|dkrn||f||t
| < |t
|7 }qqd} d}t| D ]}|| \}}| |
|| | | 7 } |}q| |
|d  7 } | |	fS )Nr3   c                 S   s6   i | ]\}}| d r|d rt|dkr||qS )$   )
startswithendswithlenr7   r   r   r   r<   ?   s   6 zbind_query.<locals>.<dictcomp>_64r   c                 S   s   g | ]}t |qS r   )r   r8   xr   r   r   
<listcomp>K   s    zbind_query.<locals>.<listcomp>c                    s"   i | ]\}}d | t | qS )param_format_bind_valuer7   r;   r   r   r<   P   s   " Tr+       )r@   
isinstancedictr   r4   keysrG   r   r   listrH   external_bind_researchrC   encodefindsorted)r0   r1   r2   binary_bindsparams_copykeyfinal_paramsr9   r:   bound_paramsbinary_querybinary_indexes
item_indexstartlocr   r   r;   r   
bind_query5   sZ   




$
re   r   c                 C   s   dt |  dS )Nr   r,   r   r   r   r   
format_stri   s   rf   c                 C   s   d dd | D S )N c                 s   s(    | ]}|t v rt | n|V  qd S r   )must_escapeBS)r8   cr   r   r   r>   n   s   & zescape_str.<locals>.<genexpr>)joinr   r   r   r   r-   m   s   r-   c                    sh  | du rdS t | trt| S t | tr|  dS t | tr7| jdus)t s.| 	 } d| 
d dS t | trDd|   dS t | trYdd fdd	| D  d
S t | trndd fdd	| D  dS t | trtddkrtt|  S  fdd|  D }dd| dS t | trt| j S t | tjtjtjfrd|  dS | S )z
    Format Python values in a ClickHouse query
    :param value: Python object
    :param server_tz: Server timezone for adjusting datetime values
    :return: Literal string for python value
    NNULLFr   %Y-%m-%d %H:%M:%S[, c                 3   r=   r   str_query_valuerK   r;   r   r   r>      r?   z%format_query_value.<locals>.<genexpr>](c                 3   r=   r   rp   rK   r;   r   r   r>      r?   )dict_parameter_formatjsonc                    s(   g | ]\}}t | d  t |  qS :rp   r7   r;   r   r   rM      s    z&format_query_value.<locals>.<listcomp>{})rR   r(   rf   r   r#   r   r   r   is_utc_timezoner    r!   r   	isoformatrU   rk   rB   rS   r   get_settingr   decoder4   r   r6   r   uuidUUID	ipaddressIPv4AddressIPv6Address)r   r2   pairsr   r;   r   r6   r   s8   





 
 


r6   c                 C   s   t t| |S r   )r(   r6   )r   r2   r   r   r   rq      s   rq   Tr   c                    s`  fdd | du rdS t | tr|rt| S t| S t | tr&| |S t | tr?| } | d}|r9|S d| dS t | t	rR|rJ| 
 S d| 
  dS t | trgdd fd	d
| D  dS t | tr|dd fdd
| D  dS t | trtddkrt|  S  fdd|  D }dd| dS t | tr | jS t| S )a  
    Format Python values in a ClickHouse query
    :param value: Python object
    :param server_tz: Server timezone for adjusting datetime values
    :param top_level: Flag for top level for nested structures
    :return: Literal string for python value
    c                    s   t |  dS )NFrO   )rL   r;   r   r   recurse   s   z"format_bind_value.<locals>.recurseNz\Nrm   r   rn   ro   c                 3       | ]} |V  qd S r   r   rK   r   r   r   r>          z$format_bind_value.<locals>.<genexpr>rr   rs   c                 3   r   r   r   rK   r   r   r   r>      r   rt   ru   rv   c                    s$   g | ]\}} |d   | qS rw   r   r7   r   r   r   rM      s    z%format_bind_value.<locals>.<listcomp>ry   rz   )rR   r(   r-   rf   r   r#   r   r    r!   r   r|   rU   rk   rB   rS   r   r}   r   r~   r4   r   r   )r   r2   r   valr   r   )r   r2   r   rP      sB   	






 
 



rP   r   )(r   rer   r   r   r   enumr   typingr   r   r   r	   r
   r   pytzclickhouse_connectr   clickhouse_connect.driverr    clickhouse_connect.driver.commonr   clickhouse_connect.json_implr   ri   rh   compilerV   r   r(   r/   rC   re   rf   r-   UTCr6   rq   r'   rP   r   r   r   r   <module>   sB     
	 
 
4$"