o
    FDi                     @   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)Queue)Struct   )Column)UInt64Columnc                       s   e Zd ZdZeefZedZ f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d Z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
    z<Qc                    sN   | t|j|jd tdi || _|| _d| _t j	di | g | _
d S )N)readerwriterT )updatedictr	   r
   r   size_columnnested_column_write_depth_0_sizesuper__init__
null_value)selfr   kwargs	__class__r   Y/var/www/Datamplify/venv/lib/python3.10/site-packages/asynch/proto/columns/arraycolumn.pyr       s   
zArrayColumn.__init__c                 C   s   | j |S N)size_structpackr   valuer   r   r   	size_pack(   s   zArrayColumn.size_packc                    s$   | j | j| j jI d H d S )Nr   )r   unpackr	   
read_bytessizer   r   r   r   size_unpack+   s   "zArrayColumn.size_unpackc                    s   |  |I d H S r   )
write_data)r   itemsr   r   r   write_items0   s   
zArrayColumn.write_itemsc                    s8   t | j| _| j| j_d| _d| _| |I d H  d S NF)r   r   nullabler   _write)r   datar   r   r   r$   8   s   
zArrayColumn.write_datac                    s.   t | j| _| j| j_d| _| |I d H S r'   )r   r   r(   _read)r   rowsr   r   r   	read_dataF   s   

zArrayColumn.read_datac           
         s   t  }|| |df d}d}g }| s~| \}}}||kr2|}d}|jr0| |I d H  g }|jr9|p8g }|t|7 }|dkrF| jsJ|dkrV| j	| 
|I d H  |j}t|trx|D ]}	|||	|d f ||	d u rtd nd q`| rd S d S )Nr   r   F)r   putempty
get_nowaitr(   _write_nulls_maplenr   r
   write_bytesr   r   
isinstancer   append)
r   r   q	cur_depthoffset	nulls_mapcolumndepthr   xr   r   r   _write_sizesQ   s6   

zArrayColumn._write_sizesc                    s@   | j r|pg }t| jtrtt|}| j|I d H  d S r   )r(   r4   r   r   listr   from_iterable_write_datar   r   r   r   r@   v   s   zArrayColumn._write_datac                    sb   | j r|pg }t| jtr tt|}| j|I d H  d S | jj r/| j|I d H  d S d S r   )	r(   r4   r   r   r>   r   r?   _write_nulls_datar1   r   r   r   r   rA      s   zArrayColumn._write_nulls_datac                    s@   |  |}| |I d H  | |I d H  | |I d H  d S r   )prepare_itemsr=   rA   r@   r   r   r   r   r)      s   


zArrayColumn._writec                    s   | j  I d H S r   )r   read_state_prefixr"   r   r   r   rC      s   zArrayColumn.read_state_prefixc                    s   | j  I d H  d S r   )r   write_state_prefixr"   r   r   r   rD      s   zArrayColumn.write_state_prefixc                    s  t  }|| |df g }d}d}g }| jjr!| |I d H }ndg| }|}| j}	| s| \}
}}|
j}	||kr[|}|||f |	jrR| |I d H }ndg| }d}g }t|	t	rt
|D ] }|  I d H }|}||	|| |d f |||f |}qdn||7 }| r/g }|r|	j||dI d H }t|D ]#\}}g }t||D ]\\}}}||rd nt|||  q|}qt|S )Nr   r   )r9   )r   r.   r   r(   _read_nulls_mapr/   r0   r5   r4   r   ranger#   
_read_datareversedzipr>   tuple)r   r!   r6   slices_seriesr7   prev_offsetslicesr9   nested_column_sizer   r:   r;   _ir8   r*   nested_data
slice_fromslice_tois_nullr   r   r   r+      s\   


	  zArrayColumn._read)__name__
__module____qualname____doc__r>   rJ   py_typesr   r   r   r   r#   r&   r$   r-   r=   r@   rA   r)   rC   rD   r+   __classcell__r   r   r   r   r   	   s"    %r   c                 C   s    | dd }t ||fi |S )N   )r   )speccolumn_by_spec_gettercolumn_optionsinnerr   r   r   create_array_column   s   r`   N)	itertoolsr   queuer   structr   baser   	intcolumnr   r   r`   r   r   r   r   <module>   s     n