o
    EDi                     @   sX   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	 G dd	 d	eZ
d
d ZdS )    )chain)Struct   )Column)UInt64Column   )pairwisec                       sx   e Zd ZdZeefZ fddZdd Zdd Z	dd	 Z
d
d Zdd Zdd Z fddZ fddZdd Z  ZS )ArrayColumna  
    Nested arrays written in flatten form after information about their
    sizes (offsets really).
    One element of array of arrays can be represented as tree:
    (0 depth)          [[3, 4], [5, 6]]
                      |               |
    (1 depth)      [3, 4]           [5, 6]
                   |    |           |    |
    (leaf)        3     4          5     6

    Offsets (sizes) written in breadth-first search order. In example above
    following sequence of offset will be written: 4 -> 2 -> 4
    1) size of whole array: 4
    2) size of array 1 in depth=1: 2
    3) size of array 2 plus size of all array before in depth=1: 2 + 2 = 4

    After sizes info comes flatten data: 3 -> 4 -> 5 -> 6
    c                    sB   || _ tdi || _|| _d| _tt| jdi | g | _d S )NT )	init_kwargsr   size_columnnested_column_write_depth_0_sizesuperr	   __init__
null_value)selfr   kwargs	__class__r
   ^/var/www/Datamplify/venv/lib/python3.10/site-packages/clickhouse_driver/columns/arraycolumn.pyr      s   
zArrayColumn.__init__c                 C   s<   t | jfi | j| _| j| j_d| _d| _| || d S )NF)r	   r   r   nullabler   _write)r   databufr
   r
   r   
write_data&   s   
zArrayColumn.write_datac                 C   s6   t | jfi | j| _| j| j_d| _| ||d S )NFr   )r	   r   r   r   _read)r   n_rowsr   r
   r
   r   	read_data1   s   
zArrayColumn.read_datac                 C   s   g }| }| j rt|gng }	 |j}t|ts"|jr!dd |D }nd}g }|D ]}	|t|	7 }|| ||	 q(|}|}q|rH| || t	d
t|}
||
j|  d S )NTc                 S   s   g | ]}|d u qS Nr
   ).0xr
   r
   r   
<listcomp>C   s    z,ArrayColumn._write_sizes.<locals>.<listcomp>r   <{}Q)r   lenr   
isinstancer	   r   appendextend_write_nulls_mapr   formatwritepack)r   valuer   	nulls_mapcolumnsizesr   offset	new_valuer!   nsr
   r
   r   _write_sizes9   s,   

zArrayColumn._write_sizesc                 C   sB   | j r|pg }t| jtrtt|}|r| j|| d S d S r   )r   r%   r   r	   listr   from_iterable_write_datar   r,   r   r
   r
   r   r6   V   s   zArrayColumn._write_datac                 C   sX   | j r|pg }t| jtrtt|}| j|| d S | jj r*| j|| d S d S r   )	r   r%   r   r	   r4   r   r5   _write_nulls_datar(   r7   r
   r
   r   r8   `   s   zArrayColumn._write_nulls_datac                 C   s2   |  |}| || | || | || d S r   )prepare_itemsr3   r8   r6   r7   r
   r
   r   r   k   s   
zArrayColumn._writec                        t t| | | j| d S r   )r   r	   read_state_prefixr   r   r   r   r
   r   r;   q      zArrayColumn.read_state_prefixc                    r:   r   )r   r	   write_state_prefixr   r<   r   r
   r   r>   v   r=   zArrayColumn.write_state_prefixc                    s   d|gg}| j }|}d }t|trH|d u rdg}td|}|||j}|| |	| d }t
|dkr>|d nd}|j }t|ts|dkrN|nd}	d }
|jr[| |	|}
g  |	rit|j|	||
d t|D ]} fddt|D  qmt S )Nr   r#   )r-   c                    s   g | ]
\}} || qS r
   r
   )r    beginendr   r
   r   r"      s    z%ArrayColumn._read.<locals>.<listcomp>)r   r%   r	   r   r)   unpackreadsizer'   r&   r$   r   _read_nulls_mapr4   
_read_datareversedr   tuple)r   rE   r   slices_seriesr   cur_level_slice_sizecur_level_slicer2   nested_sizesn_itemsr-   slicesr
   rB   r   r   {   s:   




zArrayColumn._read)__name__
__module____qualname____doc__r4   rI   py_typesr   r   r   r3   r6   r8   r   r;   r>   r   __classcell__r
   r
   r   r   r	   	   s    
r	   c                 C   s    | dd }t ||fi |S )N   r?   )r	   )speccolumn_by_spec_gettercolumn_optionsinnerr
   r
   r   create_array_column   s   r[   N)	itertoolsr   structr   baser   	intcolumnr   util.helpersr   r	   r[   r
   r
   r
   r   <module>   s     