o
    5ti                     @   s   d Z ddlZddlmZ ddlmZ ddlZ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 eeef Zeeef ZdedefddZG dd deZdS )zA
.. codeauthor:: Tsuyoshi Hombashi <tsuyoshi.hombashi@gmail.com>
    N)	Generator)Any)ColumnDataProperty)Typecode   )EmptyValueError   )to_error_message)AbstractTableWriter	column_dpreturnc                 C   s  | j tjtjtjtjfv rddiS | j tjkrddiS | j tjkr&dddS | j tjkr0ddiS | j tj	kr:ddiS | j tj
krDdd	iS | j tjkr| jd usQJ | jd
krZddiS | jdkrcddiS | jdkrlddiS | jdkruddiS td| jddtd| j  )Ntypekeywordtextdatedate_optional_time)r   formatdoublebooleanip   byte   short    integer@   longz1too large integer bits: expected<=64bits, actual=dbitszunknown typecode: )typecoder   NONENULL_STRINGINFINITYNANSTRINGDATETIMEREAL_NUMBERBOOL
IP_ADDRESSINTEGER
bit_length
ValueError)r    r-   W/home/ubuntu/.local/lib/python3.10/site-packages/pytablewriter/writer/_elasticsearch.py_get_es_datatype   s>   




r/   c                       s  e Zd ZdZdZedefddZedefddZ	edef fdd	Z
e
jd
eddfdd	Z
edefddZejd
eddfddZdeddf fddZdddZdeeeeeeef f f fddZdefddZdeddfddZdddZ  ZS )ElasticsearchWriteram  
    A table writer class for Elasticsearch.

    :Dependency Packages:
        - `elasticsearch-py <https://github.com/elastic/elasticsearch-py>`__

    .. py:attribute:: index_name
        :type: str

        Alias attribute for |table_name|.

    .. py:attribute:: document_type
        :type: str
        :value: "table"

        Specify document type for indices.

    .. py:method:: write_table()

        Create an index and put documents for each row to Elasticsearch.

        You need to pass an
        `elasticsearch.Elasticsearch <https://elasticsearch-py.rtfd.io/en/master/api.html#elasticsearch>`__
        instance to |stream| before calling this method.
        |table_name|/:py:attr:`~pytablewriter.ElasticsearchWriter.index_name`
        used as the creating index name,
        invalid characters in the name are replaced with underscores (``'_'``).
        Document data types for documents are automatically detected from the data.

        :raises ValueError:
            If the |stream| has not elasticsearch.Elasticsearch instance.
        :Example:
            :ref:`example-elasticsearch-table-writer`
    elasticsearchr   c                 C      | j S N)FORMAT_NAMEselfr-   r-   r.   format_nameg      zElasticsearchWriter.format_namec                 C   s   dS )NTr-   r5   r-   r-   r.   support_split_writek   s   z'ElasticsearchWriter.support_split_writec                    s   t  jS r3   )super
table_namer5   	__class__r-   r.   r;   o   s   zElasticsearchWriter.table_namevalueNc              
   C   sr   ddl m}m} ddlm} z||jdd| _W d S  |y8 } z|j|ju r,d| _n W Y d }~d S d }~ww )Nr   )ErrorReasonValidationErrorr   )ElasticsearchIndexNameSanitizer_)replacement_text )	pathvalidater?   r@   	sanitizerrA   sanitize_table_namereason	NULL_NAME)r6   r>   r?   r@   rA   er-   r-   r.   r;   s   s   c                 C   r2   r3   r;   r5   r-   r-   r.   
index_name   r8   zElasticsearchWriter.index_namec                 C   s
   || _ d S r3   rL   )r6   r>   r-   r-   r.   rM      s   
kwargsc                    sT   t  jdi | d | _d| _d| _d| _ttj	| _
ttjj| j_d| _d S )NFTtabler-   )r:   __init__stream
is_paddingis_formatting_float_is_require_table_namecopydeepcopydatapropertyNOT_QUOTING_FLAGS_quoting_flagsDefaultValueTYPE_VALUE_MAP_dp_extractortype_value_mapdocument_type)r6   rN   r<   r-   r.   rP      s   
zElasticsearchWriter.__init__c                 C      d S r3   r-   r5   r-   r-   r.   write_null_line      z#ElasticsearchWriter.write_null_linec                 C   s:   i }t | j| jD ]
\}}t|||< q	d| jd|iiiS )Nmappings
properties)zipheaders_column_dp_listr/   r^   )r6   rc   headerr   r-   r-   r.   _get_mappings   s   z!ElasticsearchWriter._get_mappingsc                 #   sJ    t jt jt jt jf | jD ]} fdd|D }tt| j|V  qd S )Nc                    s$   g | ]}|j  vr|jn| qS r-   )r    datato_str).0value_dpstr_datatyper-   r.   
<listcomp>   s    z1ElasticsearchWriter._get_body.<locals>.<listcomp>)	r   r&   r)   r#   r$   _table_value_dp_matrixdictrd   re   )r6   value_dp_listvaluesr-   rm   r.   	_get_body   s   

zElasticsearchWriter._get_bodyc                 K   s4  dd l }t| j|jstdz|   W n ty&   | jj	d Y d S w | 
  |  }z| jjj| j|d}| jj	| W n! |jyc } z|jD ]}|dkr]| jj	t| qN d }~ww |  D ]/}z| jj| j|d W qh |jjy } z| jjt| d|  W Y d }~qhd }~ww d S )Nr   z6stream must be an elasticsearch.Elasticsearch instancezno tabular data found)indexbodyindex_already_exists_exceptionz, body=)r1   
isinstancerQ   Elasticsearchr,   _verify_value_matrixr   _loggerloggerdebug_preprocessrh   indicescreaterM   TransportErrorerrorsr	   rt   ru   
exceptionsRequestErrorerror)r6   rN   esrb   resultrK   r   rv   r-   r-   r.   _write_table   s<   
(z ElasticsearchWriter._write_tablec                 C   r_   r3   r-   r5   r-   r-   r.   _write_value_row_separator   ra   z.ElasticsearchWriter._write_value_row_separator)r   N)__name__
__module____qualname____doc__r4   propertystrr7   boolr9   r;   setterrM   r   rP   r`   rq   
Propertiesrh   r   rt   r   r   __classcell__r-   r-   r<   r.   r0   A   s*    #
&!r0   )r   rU   collections.abcr   typingr   rW   r   typepyr   r   r   _msgfyr	   _table_writerr
   rq   r   DataTyper   r/   r0   r-   r-   r-   r.   <module>   s    +