U
    dª/eë  ã                   @   st   d dl mZ d dlZd dlZd dlmZ ddl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dS )é    )ÚchainN)Úunion_categoricalsé   )ÚProgress)ÚQueryResultc                   @   s    e Zd ZdZdd„ Zdd„ ZdS )ÚNumpyQueryResultzC
    Stores query result from multiple blocks as numpy arrays.
    c                 C   sZ   t |dd ƒ}|d krd S |jrH| jr6| j | ¡ ¡ qV| j | ¡ ¡ n| jsV|j| _d S )NÚblock)	ÚgetattrZnum_rowsÚcolumnarÚdataÚappendZget_columnsÚextendÚget_rowsÚcolumns_with_types)ÚselfÚpacketr   © r   úB/tmp/pip-unpacked-wheel-mds_o03w/clickhouse_driver/numpy/result.pyÚstore   s    zNumpyQueryResult.storec                 C   sž   | j D ]}|  |¡ q| jr€g }t| jŽ D ]R}t|d tjƒrJt |¡}n(t|d t	j
ƒrdt|ƒ}ntt |¡ƒ}| |¡ q*n| j}| jr–|| jfS |S dS )z/
        :return: stored query result.
        r   N)Úpacket_generatorr   r
   Úzipr   Ú
isinstanceÚnpZndarrayZconcatenateÚpdZCategoricalr   Útupler   Úfrom_iterabler   Úwith_column_typesr   )r   r   r   Zcolumn_chunksÚcolumnr   r   r   Ú
get_result   s    


zNumpyQueryResult.get_resultN)Ú__name__Ú
__module__Ú__qualname__Ú__doc__r   r   r   r   r   r   r      s   r   c                       s<   e Zd ZdZ‡ fdd„Zdd„ Zdd„ Z‡ fdd	„Z‡  ZS )
ÚNumpyProgressQueryResultzx
    Stores query result and progress information from multiple blocks.
    Provides iteration over query progress.
    c                    s   t ƒ | _tt| ƒj||Ž d S ©N)r   Úprogress_totalsÚsuperr#   Ú__init__)r   ÚargsÚkwargs©Ú	__class__r   r   r'   B   s    z!NumpyProgressQueryResult.__init__c                 C   s   | S r$   r   ©r   r   r   r   Ú__iter__G   s    z!NumpyProgressQueryResult.__iter__c                 C   sF   t | jƒ}t|dd ƒ}|r6| j |¡ | jj| jjfS |  |¡ q d S )NÚprogress)Únextr   r	   r%   Ú	incrementZrowsZ
total_rowsr   )r   r   Zprogress_packetr   r   r   Ú__next__J   s    
 ÿz!NumpyProgressQueryResult.__next__c                    s   | D ]}qt t| ƒ ¡ S r$   )r&   r#   r   )r   Ú_r*   r   r   r   V   s    z#NumpyProgressQueryResult.get_result)	r   r    r!   r"   r'   r-   r1   r   Ú__classcell__r   r   r*   r   r#   <   s
   r#   c                       s2   e Zd ZdZd	‡ fdd„	Zdd„ Zdd„ Z‡  ZS )
ÚNumpyIterQueryResultzP
    Provides iteration over returned data by chunks (streaming by chunks).
    Fc                    s$   || _ || _d| _tt| ƒ ¡  d S )NT)r   r   Úfirst_blockr&   r4   r'   )r   r   r   r*   r   r   r'   c   s    zNumpyIterQueryResult.__init__c                 C   s   | S r$   r   r,   r   r   r   r-   l   s    zNumpyIterQueryResult.__iter__c                 C   sZ   t | jƒ}t|dd ƒ}|d kr"g S | jrN| jrNd| _|jg}| | ¡ ¡ |S | ¡ S d S )Nr   F)r/   r   r	   r5   r   r   r   r   )r   r   r   Úrvr   r   r   r1   o   s    
zNumpyIterQueryResult.__next__)F)r   r    r!   r"   r'   r-   r1   r3   r   r   r*   r   r4   ^   s
    þ	r4   )Ú	itertoolsr   Znumpyr   Zpandasr   Zpandas.api.typesr   r.   r   Úresultr   r   r#   Úobjectr4   r   r   r   r   Ú<module>   s   1"