U
    āĒ-ey%  ć                   @   sn   d Z ddlZG d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S )a  
Functions to interact with Arrow memory allocated by Arrow Java.

These functions convert the objects holding the metadata, the actual
data is not copied at all.

This will only work with a JVM running in the same process such as provided
through jpype. Modules that talk to a remote JVM like py4j will not work as the
memory addresses reported by them are not reachable in the python process.
é    Nc                   @   s$   e Zd ZdZdZdd Zdd ZdS )Ś_JvmBufferNannyz`
    An object that keeps a org.apache.arrow.memory.ArrowBuf's underlying
    memory alive.
    Nc                 C   s   |  ” }| ”  || _d S ©N)ZgetReferenceManagerZretainŚref_manager)ŚselfŚjvm_bufr   © r   śL/var/www/html/Darija-Ai-Train/env/lib/python3.8/site-packages/pyarrow/jvm.pyŚ__init__&   s    z_JvmBufferNanny.__init__c                 C   s   | j d k	r| j  ”  d S r   )r   Śrelease)r   r   r   r   Ś__del__.   s    
z_JvmBufferNanny.__del__)Ś__name__Ś
__module__Ś__qualname__Ś__doc__r   r	   r   r   r   r   r   r      s   r   c                 C   s(   t | }|  ” }|  ” }tj|||dS )a)  
    Construct an Arrow buffer from org.apache.arrow.memory.ArrowBuf

    Parameters
    ----------

    jvm_buf: org.apache.arrow.memory.ArrowBuf
        Arrow Buffer representation on the JVM.

    Returns
    -------
    pyarrow.Buffer
        Python Buffer that references the JVM memory.
    )Śbase)r   ZmemoryAddressŚcapacityŚpaZforeign_buffer)r   ZnannyŚaddressŚsizer   r   r   Ś
jvm_buffer3   s    r   c                 C   s   |   ” }|  ” rR|dkr t ” S |dkr0t ” S |dkr@t ” S |dkrt ” S n@|dkrbt ” S |dkrrt ” S |dkrt 	” S |dkrt 
” S dS )zĶ
    Convert a JVM int type to its Python equivalent.

    Parameters
    ----------
    jvm_type : org.apache.arrow.vector.types.pojo.ArrowType$Int

    Returns
    -------
    typ : pyarrow.DataType
    é   é   é    é@   N)ŚgetBitWidthZgetIsSignedr   Zint8Zint16Zint32Zint64Zuint8Zuint16Zuint32Zuint64)Śjvm_typeZ	bit_widthr   r   r   Ś_from_jvm_int_typeH   s$    
r   c                 C   s@   |   ”  ” }|dkrt ” S |dkr,t ” S |dkr<t ” S dS )z×
    Convert a JVM float type to its Python equivalent.

    Parameters
    ----------
    jvm_type: org.apache.arrow.vector.types.pojo.ArrowType$FloatingPoint

    Returns
    -------
    typ: pyarrow.DataType
    ZHALFZSINGLEŚDOUBLEN)ŚgetPrecisionŚtoStringr   Zfloat16Zfloat32Zfloat64)r   Ś	precisionr   r   r   Ś_from_jvm_float_typej   s    r!   c                 C   s   |   ”  ” }|dkr.|  ” dks$tt d”S |dkrP|  ” dksFtt d”S |dkrr|  ” dkshtt d”S |d	kr|  ” dkstt d
”S dS )zĶ
    Convert a JVM time type to its Python equivalent.

    Parameters
    ----------
    jvm_type: org.apache.arrow.vector.types.pojo.ArrowType$Time

    Returns
    -------
    typ: pyarrow.DataType
    ŚSECONDr   ŚsŚMILLISECONDŚmsŚMICROSECONDr   ŚusŚ
NANOSECONDŚnsN)ŚgetUnitr   r   ŚAssertionErrorr   Ztime32Ztime64)r   Ś	time_unitr   r   r   Ś_from_jvm_time_type   s    


r-   c                 C   s   |   ”  ” }|  ” }|dk	r$t|}|dkr:tjd|dS |dkrPtjd|dS |dkrftjd|dS |d	kr|tjd
|dS dS )z×
    Convert a JVM timestamp type to its Python equivalent.

    Parameters
    ----------
    jvm_type: org.apache.arrow.vector.types.pojo.ArrowType$Timestamp

    Returns
    -------
    typ: pyarrow.DataType
    Nr"   r#   )Śtzr$   r%   r&   r'   r(   r)   )r*   r   ZgetTimezoneŚstrr   Ś	timestamp)r   r,   Śtimezoner   r   r   Ś_from_jvm_timestamp_type   s    r2   c                 C   s0   |   ”  ” }|dkrt ” S |dkr,t ” S dS )zĢ
    Convert a JVM date type to its Python equivalent

    Parameters
    ----------
    jvm_type: org.apache.arrow.vector.types.pojo.ArrowType$Date

    Returns
    -------
    typ: pyarrow.DataType
    ZDAYr$   N)r*   r   r   Zdate32Zdate64)r   Zday_unitr   r   r   Ś_from_jvm_date_type“   s
    r3   c                 C   sb  t |  ” }|  ” }d}| ” s| ”  ” }|dkr@t ” }nÖ|dkrRt|}nÄ|dkrdt	|}n²|dkrvt 
” }n |dkrt ” }n|dkr t | ” ”}nv|dkr²t ” }nd|d	krÄt|}nR|d
krÖt|}n@|dkrčt|}n.|dkrt | ” | ” ”}ntd |”ntd|  ” }|  ” }| ” r@d}ndd | ” D }t ||||”S )zŪ
    Construct a Field from a org.apache.arrow.vector.types.pojo.Field
    instance.

    Parameters
    ----------
    jvm_field: org.apache.arrow.vector.types.pojo.Field

    Returns
    -------
    pyarrow.Field
    NZNullZIntZFloatingPointZUtf8ŚBinaryZFixedSizeBinaryZBoolZTimeŚ	TimestampŚDateŚDecimalzUnsupported JVM type: {}z:JVM field conversion only implemented for primitive types.c                 S   s"   i | ]}t | ” t | ” qS r   ©r/   ZgetKeyZgetValue©Ś.0Śentryr   r   r   Ś
<dictcomp>ž   s   ’
 zfield.<locals>.<dictcomp>)r/   ŚgetNameŚgetTypeŚ	isComplexZ	getTypeIDr   r   Śnullr   r!   ŚstringŚbinaryZgetByteWidthZbool_r-   r2   r3   Z
decimal128r   ZgetScaleŚNotImplementedErrorŚformatZ
isNullableZgetMetadataŚisEmptyŚentrySetŚfield)Z	jvm_fieldŚnamer   ŚtypZtype_strZnullableŚjvm_metadataŚmetadatar   r   r   rG   Ē   sR    










’’
’rG   c                 C   sJ   |   ” }dd |D }|  ” }| ” r,d}ndd | ” D }t ||”S )zą
    Construct a Schema from a org.apache.arrow.vector.types.pojo.Schema
    instance.

    Parameters
    ----------
    jvm_schema: org.apache.arrow.vector.types.pojo.Schema

    Returns
    -------
    pyarrow.Schema
    c                 S   s   g | ]}t |qS r   )rG   )r:   Śfr   r   r   Ś
<listcomp>  s     zschema.<locals>.<listcomp>Nc                 S   s"   i | ]}t | ” t | ” qS r   r8   r9   r   r   r   r<     s   ’
 zschema.<locals>.<dictcomp>)Z	getFieldsZgetCustomMetadatarE   rF   r   Śschema)Z
jvm_schemaŚfieldsrJ   rK   r   r   r   rN     s    ’rN   c                 C   s   |   ”  ”  ” r*|  ”  ” }td |”t|   ” j}dd t	|  
d”D }t|dkrjtjg |dS |  ” }|  ” }tj ||||”S )z¼
    Construct an (Python) Array from its JVM equivalent.

    Parameters
    ----------
    jvm_array : org.apache.arrow.vector.ValueVector

    Returns
    -------
    array : Array
    zMCannot convert JVM Arrow array of type {}, complex types not yet implemented.c                 S   s   g | ]}t |qS r   )r   )r:   Śbufr   r   r   rM   -  s   ’zarray.<locals>.<listcomp>Fr   )Śtype)ZgetFieldr>   r?   ZgetMinorTyper   rC   rD   rG   rQ   ŚlistZ
getBuffersŚlenr   ŚarrayZgetValueCountZgetNullCountZArrayZfrom_buffers)Z	jvm_arrayZminor_type_strZdtypeŚbuffersŚlengthZ
null_countr   r   r   rT     s     ’’’rT   c                 C   sF   t |  ” }g }|jD ]}| t|  |”” qtjj||j|j	dS )zź
    Construct a (Python) RecordBatch from a JVM VectorSchemaRoot

    Parameters
    ----------
    jvm_vector_schema_root : org.apache.arrow.vector.VectorSchemaRoot

    Returns
    -------
    record_batch: pyarrow.RecordBatch
    )rK   )
rN   Z	getSchemaŚnamesŚappendrT   Z	getVectorr   ZRecordBatchZfrom_arraysrK   )Zjvm_vector_schema_rootZ	pa_schemaZarraysrH   r   r   r   Śrecord_batch9  s    
żrY   )r   Zpyarrowr   r   r   r   r!   r-   r2   r3   rG   rN   rT   rY   r   r   r   r   Ś<module>   s   "<