o
    KDiB                  	   @   s   d dl Z d dlZd dlmZmZmZmZ ddddddd	d
dZedde	  d Z
d'ddZdd Zdd Zdd Zdd Zdd Zdd Zd(dd Zd!d" Zd#d$ ZG d%d& d&Ze ZdS ))    N)datedatetimetzinfo	timedeltaz\bz\fz\rz\nz\tz\0z\\z\')
	 \'[ ]Tc                 C   s6   dd }t | trt|| } |rd|  d } t| S )z
    If the value is a string, escapes any special characters and optionally
    surrounds it with single quotes. If the value is not a string (e.g. a number),
    converts it to one.
    c                 S   s   t | d S )Nr   )SPECIAL_CHARSgroup)match r   R/var/www/Datamplify/venv/lib/python3.10/site-packages/infi/clickhouse_orm/utils.py
escape_one   s   zescape.<locals>.escape_oner   )
isinstancestrSPECIAL_CHARS_REGEXsub)valuequoter   r   r   r   escape   s   
r   c                 C   s   t | d dS )Nr   zutf-8)codecsescape_decodedecode)r   r   r   r   unescape%   s   r!   c                 C   s   t | dr	|  S | S )Nto_sql)hasattrr"   objr   r   r   string_or_func)   s   r&   c                 C   sB  ddl m}m}m}m}m}m} t| |r|  S t| |r"d|  S t| t	r-| 
| S t| tr:d| 
|  S t| trEd|   S t| trRdt|   S t| tr]t	t| S t| trk| 
| dS | du rqdS t| |rzd	|  S t| trd
tdd | D  d S t| rdtdd | D  d S t	| S )z
    Converts a function argument to SQL string according to its type.
    Supports functions, model fields, strings, dates, datetimes, timedeltas, booleans,
    None, numbers, timezones, arrays/iterables.
    r   )FieldStringFieldDateTimeField	DateFieldFQuerySetz`%s`ztoDateTime(%s)ztoDate('%s')ztoIntervalSecond(%d)NNULLz(%s)(c                 s       | ]}t |V  qd S N
arg_to_sql.0xr   r   r   	<genexpr>I       zarg_to_sql.<locals>.<genexpr>)r   c                 s   r/   r0   r1   r3   r   r   r   r6   K   r7   r   )infi.clickhouse_ormr'   r(   r)   r*   r+   r,   r   r"   r   to_db_stringr   r   	isoformatr   inttotal_secondsboolr   tznametuple
comma_joinis_iterable)argr'   r(   r)   r*   r+   r,   r   r   r   r2   -   s4    









r2   c                 C   sF   t | tr	|  } | r| d dkr| d d } dd | tdD S )Nr	   c                 S   s   g | ]}t |qS r   )r!   )r4   r   r   r   r   
<listcomp>T   s    zparse_tsv.<locals>.<listcomp>r
   )r   bytesr    splitr   )liner   r   r   	parse_tsvO   s
   
rI   c                 C   s   t | dk s| d dvs| d dvrtd|  | dd } g }	 | dv r'|S | d d
v r4| dd } nG| d dkr`td| }|du rJtd|  || d| d   | | d } ntd| }|| d|   | | d d } q!)z
    Parse an array or tuple string as returned by clickhouse. For example:
        "['hello', 'world']" ==> ["hello", "world"]
        "(1,2,3)"            ==> [1, 2, 3]
       r   z[(rD   z])zInvalid array string: "%s"   NT, r   z[^\\]'zMissing closing quote: "%s"z,|\])len
ValueErrorresearchappendstartend)array_stringvaluesr   r   r   r   parse_arrayW   s&   $rV   c                    s6   ddl  ddl} } fdd||jD S )z,
    Import all submodules of a module.
    r   Nc                    s&   i | ]\}}}|  d  | qS ).)import_module)r4   _name	importlibpackage_namer   r   
<dictcomp>   s    z%import_submodules.<locals>.<dictcomp>)r\   pkgutilrX   iter_modules__path__)r]   r_   packager   r[   r   import_submodulesy   s
   

rc   Fc                 C   s"   |rd dd | D S d | S )z3
    Joins an iterable of strings with commas.
    rL   c                 s   r/   r0   )r   )r4   itemr   r   r   r6      r7   zcomma_join.<locals>.<genexpr>)join)items	stringifyr   r   r   rA      s   
rA   c                 C   s$   zt |  W dS  ty   Y dS w )z1
    Checks if the given object is iterable.
    TF)iter	TypeErrorr$   r   r   r   rB      s   rB   c                    s$   ddl m  fdd|  D S )Nr   )isclassc                    s$   g | ]}|rt | r|jqS r   )
issubclass__name__)r4   c
base_classrj   r   r   rE      s   $ z&get_subclass_names.<locals>.<listcomp>)inspectrj   rU   )localsro   r   rn   r   get_subclass_names   s   rr   c                   @   s   e Zd ZdZdd ZdS )NoValuezo
    A sentinel for fields with an expression for a default value,
    that were not assigned a value yet.
    c                 C   s   dS )NNO_VALUEr   )selfr   r   r   __repr__   s   zNoValue.__repr__N)rl   
__module____qualname____doc__rv   r   r   r   r   rs      s    rs   )T)F)r   rO   r   r   r   r   r   compilere   rU   r   r   r!   r&   r2   rI   rV   rc   rA   rB   rr   rs   rt   r   r   r   r   <module>   s2    
""


