U
    d/eG                     @   s   d dl mZmZmZ d dlmZ d dlmZmZ d dl	m
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dS )   )read_varintread_binary_uint8read_binary_int32)write_varint)write_binary_uint8write_binary_int32)nestedcolumnc                   @   s$   e Zd ZdZdZdd Zdd ZdS )	BlockInfoFc                 C   s:   t d| t| j| t d| t| j| t d| d S )Nr          )r   r   is_overflowsr   
bucket_num)selfbuf r   ;/tmp/pip-unpacked-wheel-mds_o03w/clickhouse_driver/block.pywrite   s
    

zBlockInfo.writec                 C   s>   t |}|sq:|dkr&tt|| _q |dkr t|| _q d S )Nr   r   )r   boolr   r   r   r   )r   r   Z	field_numr   r   r   read   s    zBlockInfo.readN)__name__
__module____qualname__r   r   r   r   r   r   r   r   r	      s   
r	   c                       s^   e Zd Zd fdd	Zdd Zedd Zed	d
 Zdd Zdd Z	dd Z
dd Z  ZS )	BaseBlockNFc                    s>   |pg | _ || _|pt | _| |p&g | _tt|   d S N)	columns_with_typestypes_checkr	   info	normalizedatasuperr   __init__)r   r   r   r   r   	__class__r   r   r!   #   s
    
zBaseBlock.__init__c                 C   s   |S r   r   r   r   r   r   r   r   ,   s    zBaseBlock.normalizec                 C   s   t d S r   NotImplementedErrorr   r   r   r   num_columns/   s    zBaseBlock.num_columnsc                 C   s   t d S r   r%   r'   r   r   r   num_rows3   s    zBaseBlock.num_rowsc                 C   s   t d S r   r%   r'   r   r   r   get_columns7   s    zBaseBlock.get_columnsc                 C   s   t d S r   r%   r'   r   r   r   get_rows:   s    zBaseBlock.get_rowsc                 C   s   t d S r   r%   r   indexr   r   r   get_column_by_index=   s    zBaseBlock.get_column_by_indexc                 C   s   t t| j S r   )listzipr   r'   r   r   r   
transposed@   s    zBaseBlock.transposed)NNNF)r   r   r   r!   r   propertyr(   r)   r*   r+   r.   r1   __classcell__r   r   r"   r   r   "   s       	

r   c                   @   sT   e Zd Zdd Zedd Zedd Zdd Zd	d
 Zdd Z	dd Z
dd ZdS )ColumnOrientedBlockc                 C   s    |sg S |  | | | |S r   )_check_number_of_columns_check_all_columns_equal_lengthr$   r   r   r   r   E   s
    

zColumnOrientedBlock.normalizec                 C   s
   t | jS r   lenr   r'   r   r   r   r(   M   s    zColumnOrientedBlock.num_columnsc                 C   s   | j rt| jd S dS Nr   )r(   r8   r   r'   r   r   r   r)   Q   s    zColumnOrientedBlock.num_rowsc                 C   s   | j S r   r   r'   r   r   r   r*   U   s    zColumnOrientedBlock.get_columnsc                 C   s   |   S r   r1   r'   r   r   r   r+   X   s    zColumnOrientedBlock.get_rowsc                 C   s
   | j | S r   r:   r,   r   r   r   r.   [   s    z'ColumnOrientedBlock.get_column_by_indexc                 C   s2   t | j}t |}||kr.d||}t|d S )NExpected {} columns, got {})r8   r   format
ValueError)r   r   expected_row_lengotmsgr   r   r   r5   ^   s
    
z,ColumnOrientedBlock._check_number_of_columnsc                 C   s>   t |d }|D ](}t |}||krd||}t|qd S )Nr   zExpected {} rows, got {})r8   r=   r>   )r   r   expectedcolumnr@   rA   r   r   r   r6   f   s    z3ColumnOrientedBlock._check_all_columns_equal_lengthN)r   r   r   r   r2   r(   r)   r*   r+   r.   r5   r6   r   r   r   r   r4   D   s   

r4   c                   @   s   e Zd ZefZeefZee Zdd Z	e
dd Ze
dd Zdd Zd	d
 Zdd Zdd Zdd Zdd Zdd Zdd Zdd ZdS )RowOrientedBlockc                 C   sD   |sg S |d }| j r | | t|tr6| | n
| | |S r9   )r   _check_row_type
isinstancedict_mutate_dicts_to_rows_check_rows)r   r   Z	first_rowr   r   r   r   u   s    


zRowOrientedBlock.normalizec                 C   s,   | j d k	rt| j S | jr(t| jd S dS r9   )r   r8   r)   r   r'   r   r   r   r(      s    

zRowOrientedBlock.num_columnsc                 C   s
   t | jS r   r7   r'   r   r   r   r)      s    zRowOrientedBlock.num_rowsc                 C   s   |   S r   r;   r'   r   r   r   r*      s    zRowOrientedBlock.get_columnsc                 C   s   | j S r   r:   r'   r   r   r   r+      s    zRowOrientedBlock.get_rowsc                    s    fdd| j D S )Nc                    s   g | ]}|  qS r   r   ).0rowr-   r   r   
<listcomp>   s     z8RowOrientedBlock.get_column_by_index.<locals>.<listcomp>r:   r,   r   rL   r   r.      s    z$RowOrientedBlock.get_column_by_indexc                 C   s    d}| j r| j}| || j|S )NF)r   _check_dict_row_type_pure_mutate_dicts_to_rowsr   )r   r   check_row_typer   r   r   rH      s    z&RowOrientedBlock._mutate_dicts_to_rowsc              	   C   s   g }|D ].\}}d }| dr(t|}|||f qt|D ]^\}}	|rT||	 g }
|D ]8\}}|d kr||
|	|  q\|
| |	| || q\|
||< q@|S )NZNested)
startswithr   Zget_columns_with_typesappend	enumeraterO   )r   r   r   rP   Zcolumns_with_cwtnametype_ZcwtirK   Znew_datar   r   r   rO      s(    

  
z+RowOrientedBlock._pure_mutate_dicts_to_rowsc                 C   sT   t | j}t |d }||kr2d||}t|| jrP| j}|D ]}|| qBd S )Nr   r<   )r8   r   r=   r>   r   _check_tuple_row_type)r   r   r?   r@   rA   rP   rK   r   r   r   rI      s    
zRowOrientedBlock._check_rowsc                 C   s"   t || jstdt|d S )Nz:Unsupported row type: {}. dict, list or tuple is expected.)rF   supported_row_types	TypeErrorr=   typer   rK   r   r   r   rE      s    z RowOrientedBlock._check_row_typec                 C   s"   t || jstdt|d S )Nz4Unsupported row type: {}. list or tuple is expected.)rF   tuple_row_typesrY   r=   rZ   r[   r   r   r   rW      s    z&RowOrientedBlock._check_tuple_row_typec                 C   s"   t || jstdt|d S )Nz+Unsupported row type: {}. dict is expected.)rF   dict_row_typesrY   r=   rZ   r[   r   r   r   rN      s    z%RowOrientedBlock._check_dict_row_typeN)r   r   r   rG   r]   r/   tupler\   rX   r   r2   r(   r)   r*   r+   r.   rH   rO   rI   rE   rW   rN   r   r   r   r   rD   p   s"   

rD   N)readerr   r   r   Zvarintr   writerr   r   columnsr   objectr	   r   r4   rD   r   r   r   r   <module>   s   ",