o
    ò©ZhL  ã                   @   sÎ  d dl Z d dlZd dlZd dlZzd dlmZ W n ey#   dZY nw d dlZzd dl	Z
d dlmZ W n eyA   d Z
ZY nw ejjedu ddZejeddZejeddZejeddZd	d
„ Ze jdd„ ƒZG dd„ dejƒZdd„ Zdd„ Zdd„ Zdd„ Zdd„ Zdd„ Z dd„ Z!edd„ ƒZ"edd „ ƒZ#ed!d"„ ƒZ$dUd#d$„Z%ed%d&„ ƒZ&ed'd(„ ƒZ'ed)d*„ ƒZ(d+d,„ Z)ed-d.„ ƒZ*ed/d0„ ƒZ+d1d2„ Z,d3d4„ Z-d5d6„ Z.eej /d7e-e.g¡d8d9„ ƒƒZ0ed:d;„ ƒZ1ejj/d<e 2¡ e 3d=e 2¡ ¡e 4d=e 2¡ i¡gg d>¢d?d@dA„ ƒZ5ejj/dBe 6g dC¢¡dDdE„ e 2¡ e 7¡ fej8e 6g dC¢¡gdFgdGdHdE„ e 4dFe 2¡ i¡e 4dFe 7¡ i¡fgdIdJgd?dKdL„ ƒZ9ejj/dMej:j;dNdE„ gdOdPgd?dQdR„ ƒZ<dSdT„ Z=dS )Vé    N)Úffiz!test needs cffi package installed)Úreasonz"Cannot import released ArrowSchema©Úmatchz!Cannot import released ArrowArrayz'Cannot import released ArrowArrayStreamc                 C   s   t j t  | ¡|¡dkS ©Né   )ÚctypesZ	pythonapiÚPyCapsule_IsValidZ	py_object)ÚcapsuleÚname© r   úN/var/www/html/lang_env/lib/python3.10/site-packages/pyarrow/tests/test_cffi.pyr	   3   s   r	   c              	   c   s4    t  | ¡ zd V  W t  | j¡ d S t  | j¡ w ©N)ÚpaZregister_extension_typeZunregister_extension_typeZextension_name)Zext_typer   r   r   Úregistered_extension_type7   s
   €
r   c                       s<   e Zd Z‡ fdd„Zedd„ ƒZdd„ Zedd„ ƒZ‡  Z	S )	ÚParamExtTypec                    s   || _ tƒ  t |¡d¡ d S )Nz$pyarrow.tests.test_cffi.ParamExtType)Ú_widthÚsuperÚ__init__r   Úbinary)ÚselfÚwidth©Ú	__class__r   r   r   B   s   ÿzParamExtType.__init__c                 C   ó   | j S r   )r   ©r   r   r   r   r   G   s   zParamExtType.widthc                 C   s   t | jƒ ¡ S r   )Ústrr   Úencoder   r   r   r   Ú__arrow_ext_serialize__K   ó   z$ParamExtType.__arrow_ext_serialize__c                 C   s   t | ¡ ƒ}| |ƒS r   )ÚintÚdecode)ÚclsÚstorage_typeZ
serializedr   r   r   r   Ú__arrow_ext_deserialize__N   s   z&ParamExtType.__arrow_ext_deserialize__)
Ú__name__Ú
__module__Ú__qualname__r   Úpropertyr   r   Úclassmethodr$   Ú__classcell__r   r   r   r   r   @   s    
r   c                   C   s"   t jdt  t  ¡ ¡fgddidS )NÚintsó   key1ó   value1©Úmetadata)r   ÚschemaÚlist_Úint32r   r   r   r   Úmake_schemaT   s   ÿr3   c                   C   s   t jdtdƒfgddidS ©NÚexté   r,   r-   r.   )r   r0   r   r   r   r   r   Úmake_extension_schemaY   s   ÿr7   c                   C   s   t jdtdƒjfgddidS r4   )r   r0   r   r#   r   r   r   r   Úmake_extension_storage_schema^   s   ÿr8   c                   C   s   t  dgddgggtƒ ¡S )Nr   é   é*   )r   Úrecord_batchr3   r   r   r   r   Ú
make_batchd   s   r<   c                  C   s8   t ƒ } | d j tjddgt d¡d¡}t |g| ¡S )Nr   s   foos   barr6   ©Útype)r7   r>   Z
wrap_arrayr   Úarrayr   r;   )r0   Zext_colr   r   r   Úmake_extension_batchh   s
   ÿr@   c                  C   s6   t ƒ } t dgddggg| ¡t d g ddggg| ¡gS )Nr   r9   r:   é   é   )r3   r   r;   ©r0   r   r   r   Úmake_batcheso   s   þrD   c              	   C   sv   t  ¡ -}t j || ¡}|D ]}| |¡ qW d   ƒ n1 s!w   Y  | ¡ W  d   ƒ S 1 s4w   Y  d S r   )r   ZBufferOutputStreamÚipcZ
new_streamÚwriteÚgetvalue)r0   ÚbatchesZsinkÚoutÚbatchr   r   r   Úmake_serializedw   s   
ÿÿ$ürK   c                  C   sV  t  d¡} tt  d| ¡ƒ}t ¡  t ¡ }t t 	¡ ¡}| 
|¡ t ¡ |ks)J ‚~t ¡ |ks2J ‚tj |¡}|t t 	¡ ¡ksCJ ‚t ¡ |ksKJ ‚t tj |¡ W d   ƒ n1 s^w   Y  t 	¡  
|¡ t  dd¡}|| _tjtdd tj |¡ W d   ƒ n1 s‹w   Y  t tj |¡ W d   ƒ d S 1 s¤w   Y  d S )Nústruct ArrowSchema*Ú	uintptr_tzchar[]s   zzzz$Invalid or unsupported format stringr   )r   Únewr    ÚcastÚgcÚcollectr   Útotal_allocated_bytesr1   r2   Ú_export_to_cZDataTypeÚ_import_from_cÚassert_schema_releasedÚformatÚpytestÚraisesÚ
ValueError)Úc_schemaÚ
ptr_schemaÚold_allocatedÚtypZtyp_newZ
bad_formatr   r   r   Útest_export_import_type   s4   

ÿÿþ"ÿr^   c                  C   sä   t  d¡} tt  d| ¡ƒ}t ¡  t ¡ }tjdt 	t 
¡ ¡dd}| |¡ t ¡ |ks/J ‚~t ¡ |ks8J ‚tj |¡}|tjdt 	t 
¡ ¡ddksOJ ‚t ¡ |ksWJ ‚t tj |¡ W d   ƒ d S 1 skw   Y  d S )NrL   rM   ÚtestT)Znullable)r   rN   r    rO   rP   rQ   r   rR   Úfieldr1   r2   rS   ÚFieldrT   rU   )rZ   r[   r\   r`   Z	field_newr   r   r   Útest_export_import_field    s   

""ÿrb   c            	      C   sì  t  d¡} tt  d| ¡ƒ}t  d¡}tt  d|¡ƒ}t ¡  t ¡ }t t 	¡ ¡}tj
dgddgg|d}| ¡ }| |¡ t ¡ |ksFJ ‚~tj ||¡}| ¡ |ksVJ ‚|jt t 	¡ ¡ksbJ ‚t ¡ |ksjJ ‚~~t ¡ |kstJ ‚t tj |t t 	¡ ¡¡ W d   ƒ n1 sw   Y  tj
dgddggt t 	¡ ¡d}| ¡ }| ||¡ ~tj ||¡}| ¡ |ks½J ‚|jt t 	¡ ¡ksÉJ ‚t ¡ |ksÑJ ‚~t ¡ |ksÚJ ‚t tj ||¡ W d   ƒ d S 1 sïw   Y  d S )NrL   rM   ústruct ArrowArray*r   r9   r:   r=   )r   rN   r    rO   rP   rQ   r   rR   r1   r2   r?   Z	to_pylistrS   ZArrayrT   r>   Úassert_array_releasedrU   )	rZ   r[   Úc_arrayÚ	ptr_arrayr\   r]   ÚarrÚpy_valueZarr_newr   r   r   Útest_export_import_array¸   sD   


ÿ""ÿri   c                 C   s<  |d u r| }t  d¡}tt  d|¡ƒ}t ¡  t ¡ }| ƒ  |¡ t ¡ |ks)J ‚tj	 
|¡}||ƒ ks6J ‚t ¡ |ks>J ‚~t ¡ |ksGJ ‚t tj	 
|¡ W d   ƒ n1 sZw   Y  t ¡  |¡ tjtdd tj	 
|¡ W d   ƒ n1 s~w   Y  t tj	 
|¡ W d   ƒ d S 1 s—w   Y  d S )NrL   rM   ú%ArrowSchema describes non-struct typer   )r   rN   r    rO   rP   rQ   r   rR   rS   ÚSchemarT   rU   r2   rW   rX   rY   )Zschema_factoryZexpected_schema_factoryrZ   r[   r\   Ú
schema_newr   r   r   Úcheck_export_import_schemaå   s2   
ÿÿþ"ÿrm   c                   C   ó   t tƒ d S r   )rm   r3   r   r   r   r   Útest_export_import_schema  ó   ro   c                   C   sD   t ttƒ ttdƒƒ t tƒ W d   ƒ d S 1 sw   Y  d S r   )rm   r7   r8   r   r   r   r   r   r   Ú(test_export_import_schema_with_extension
  s   ÿ
"ÿrq   c                  C   s¬   t  d¡} tt  d| ¡ƒ}d}tjt|d tƒ  t	|ƒ¡ W d   ƒ n1 s)w   Y  tjt|d t
j t	|ƒ¡}W d   ƒ n1 sHw   Y  |tƒ ksTJ ‚d S )NrL   rM   z,Passing a pointer value as a float is unsafer   )r   rN   r    rO   rW   ZwarnsÚUserWarningr3   rS   Úfloatr   rk   rT   )rZ   r[   r   rl   r   r   r   Ú'test_export_import_schema_float_pointer  s   
ÿÿrt   c           
      C   s(  t  d¡}tt  d|¡ƒ}t  d¡}tt  d|¡ƒ}t ¡  t ¡ }| ƒ }|j}| 	¡ }| 
|¡ t ¡ |ks9J ‚~tj ||¡}	|	 	¡ |ksIJ ‚|	j|ksPJ ‚t ¡ |ksXJ ‚~	~t ¡ |ksbJ ‚t tj |tƒ ¡ W d   ƒ n1 sww   Y  | ƒ }| 	¡ }| 
||¡ ~tj ||¡}	|	 	¡ |ks™J ‚|	j| ƒ jks¢J ‚t ¡ |ksªJ ‚~	t ¡ |ks³J ‚t tj ||¡ W d   ƒ n1 sÇw   Y  t ¡  
|¡ | ƒ  
|¡ tjtdd tj ||¡ W d   ƒ n1 sòw   Y  t tj ||¡ W d   ƒ d S 1 sw   Y  d S )NrL   rM   rc   rj   r   )r   rN   r    rO   rP   rQ   r   rR   r0   Z	to_pydictrS   ZRecordBatchrT   rd   r3   rU   r2   rW   rX   rY   )
Zbatch_factoryrZ   r[   re   rf   r\   rJ   r0   rh   Z	batch_newr   r   r   Úcheck_export_import_batch$  sX   


ÿÿÿþ$ÿru   c                   C   rn   r   )ru   r<   r   r   r   r   Útest_export_import_batchZ  rp   rv   c                   C   s:   t tdƒƒ ttƒ W d   ƒ d S 1 sw   Y  d S r   )r   r   ru   r@   r   r   r   r   Ú'test_export_import_batch_with_extension_  s   
"ÿrw   c           	      C   sÄ   t ƒ }|d j}|||ƒ}| | ¡ ~~tj | ¡}|j|ks!J ‚t|ƒ}~|t ƒ ks-J ‚td ur`t ƒ }|d j}tj 	|¡ 
¡ }|||ƒ}| | ¡ ~~tj | ¡}| ¡ }~t ||¡ d S d S )Nr   )rD   r0   rS   r   ÚRecordBatchReaderrT   ÚlistÚpdÚTableÚfrom_batchesZ	to_pandasZread_pandasÚtmZassert_frame_equal)	Ú
ptr_streamÚreader_factoryrH   r0   ÚreaderÚ
reader_newZgot_batchesZexpected_dfZgot_dfr   r   r   Ú_export_import_batch_readere  s,   





ôr‚   c                 C   s   t j t| |ƒ¡S r   )r   rE   Úopen_streamrK   ©r0   rH   r   r   r   Úmake_ipc_stream_reader…  s   r…   c                 C   s   t j | |¡S r   )r   rx   r|   r„   r   r   r   Úmake_py_record_batch_reader‰  r   r†   r   c                 C   sz   t  d¡}tt  d|¡ƒ}t ¡  t ¡ }t|| ƒ t ¡ |ks"J ‚t	 tj
 |¡ W d   ƒ d S 1 s6w   Y  d S )Nústruct ArrowArrayStream*rM   )r   rN   r    rO   rP   rQ   r   rR   r‚   Úassert_stream_releasedrx   rT   )r   Úc_streamr~   r\   r   r   r   Útest_export_import_batch_reader  s   

"ÿrŠ   c                  C   sB  t  d¡} tt  d| ¡ƒ}t dt ¡ fg¡}tjg d¢g|dtjg d¢g|dg}t||ƒ}tj	 
|d d… ¡}| |¡ ~tj |¡}| ¡ }||d ksRJ ‚tjtd	d
 | ¡  W d   ƒ n1 shw   Y  tj	 
|d d… ¡}| |¡ ~tj |¡}tjtd	d
 | ¡  W d   ƒ d S 1 sšw   Y  d S )Nr‡   rM   Úfoo)r   r9   r6   rC   )é   rA   rB   iðÿÿÿr   z<Expected to be able to read 16 bytes for message body, got 8r   )r   rN   r    rO   r   r0   r2   r;   rK   rE   rƒ   rS   rx   rT   Úread_next_batchrW   rX   ÚOSErrorZread_all)r‰   r~   r0   rH   Úbufr€   r   rJ   r   r   r   Ú test_imported_batch_reader_error¡  s6   
ÿ

ÿ
ý
ÿ
"ýr   Úobjr‹   )r>   r`   r0   )Zidsc                 C   s’   t  ¡  t ¡ }|  ¡ }t|dƒdksJ ‚t ¡ |ksJ ‚t| ƒ |¡}|| ks*J ‚t ¡ |ks2J ‚|  ¡ }t ¡ |ks>J ‚~t ¡ |ksGJ ‚d S )Nó   arrow_schemar   )rP   rQ   r   rR   Ú__arrow_c_schema__r	   r>   Ú_import_from_c_capsule)r‘   r\   r
   Zobj_outr   r   r   Útest_roundtrip_schema_capsuleÄ  s   r•   z&arr,schema_accessor,bad_type,good_type)ÚaÚbÚcc                 C   r   r   r=   ©Úxr   r   r   Ú<lambda>Û  ó    r›   rš   )Únamesc                 C   r   r   rC   r™   r   r   r   r›   Þ  rœ   r?   r;   c           
      C   s  t  ¡  t ¡ }t| ƒj}|  ¡ \}}t|dƒdksJ ‚t|dƒdks%J ‚|||ƒ}| | ¡s1J ‚t ¡ |ks9J ‚~t ¡ |ksBJ ‚|  ¡ }t ¡ |ksNJ ‚~t ¡ |ksWJ ‚t	j
tdd |  | ¡ ¡ W d   ƒ n1 spw   Y  |  | ¡ ¡\}}	|||	ƒ}||ƒ|ks‹J ‚d S )Nr’   r   s   arrow_arrayz-Could not cast.* string to requested .* int32r   )rP   rQ   r   rR   r>   r”   Z__arrow_c_array__r	   ÚequalsrW   rX   rY   r“   )
rg   Zschema_accessorZbad_typeZ	good_typer\   Zimport_arrayZschema_capsuler
   Zarr_outZarray_capsuler   r   r   Útest_roundtrip_array_capsuleÚ  s2   


ÿþÿ
rŸ   Úconstructorc                 C   s   t j || ¡S r   )r   r{   r|   r„   r   r   r   r›     s    ZrecordbatchreaderÚtablec                 C   sp  t ƒ }|d j}t ¡  t ¡ }| ||ƒ}| ¡ }t|dƒdks"J ‚tj 	|¡}|j|ks/J ‚t
|ƒ}t|ƒt|ƒks=J ‚t||ƒD ]\}}	| |	¡sMJ ‚qB~~~~	~t ¡ |ks[J ‚| ||ƒ}t dt ¡ i¡}
t t¡ | |
 ¡ ¡ W d   ƒ n1 s€w   Y  t dt t ¡ ¡i¡}| | ¡ ¡}tj 	|¡}|j|ks¥J ‚t||ƒD ]\}}	| |	¡sµJ ‚qªd S )Nr   ó   arrow_array_streamr   r+   )rD   r0   rP   rQ   r   rR   Ú__arrow_c_stream__r	   rx   r”   ry   ÚlenÚziprž   r2   rW   rX   ÚNotImplementedErrorr“   r1   )r    rH   r0   r\   r‘   r
   Úimported_readerZimported_batchesrJ   ÚexpectedZ
bad_schemaZmatching_schemar   r   r   Útest_roundtrip_reader_capsule  s6   



ÿÿr©   c                  C   s†   t ƒ } |  ¡ }t|dƒdksJ ‚tj |¡}|j| jksJ ‚| ¡  | ¡s'J ‚t	 
t¡ | ¡  W d   ƒ d S 1 s<w   Y  d S )Nr¢   r   )r<   r£   r	   r   rx   r”   r0   r   rž   rW   rX   ÚStopIteration)rJ   r
   r§   r   r   r   Ú#test_roundtrip_batch_reader_capsule0  s   
"ÿr«   r   )>Ú
contextlibr   rP   Zpyarrowr   Zpyarrow.cffir   ÚImportErrorrW   Zpandasrz   Zpandas.testingZtestingr}   ÚmarkZskipifZ
needs_cffirX   rY   rU   rd   rˆ   r	   Úcontextmanagerr   ZExtensionTyper   r3   r7   r8   r<   r@   rD   rK   r^   rb   ri   rm   ro   rq   rt   ru   rv   rw   r‚   r…   r†   ZparametrizerŠ   r   r2   r`   r0   r•   r?   Ústringr;   rŸ   rx   r|   r©   r«   r   r   r   r   Ú<module>   s¼   ÿÿÿÿÿÿ

 


, 



6

 ÿÿ
"ÿþ
 üþø
	"ýü
&