o
    i                     @  s   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	m
Z
mZmZ d dlmZ dZG dd	 d	Zd ddZd!ddZd"ddZd#ddZG dd dZdS )$    )annotations)bisect_left)EqualTo)_InclusiveMetricsEvaluator)INITIAL_SEQUENCE_NUMBERPOSITIONAL_DELETE_SCHEMADataFileManifestEntryRecordic                   @  s<   e Zd ZdZdZdddZdddZdddZdddZdS )PositionDeleteszCCollects position delete files and indexes them by sequence number._buffer_seqs_filesreturnNonec                 C  s   g | _ g | _g | _d S Nr   self r   _/home/ubuntu/transcripts/venv/lib/python3.10/site-packages/pyiceberg/table/delete_file_index.py__init__"   s   
zPositionDeletes.__init__delete_filer   seq_numintc                 C  s&   | j d u r	td| j ||f d S )NzCannot add files after indexing)r   
ValueErrorappend)r   r   r   r   r   r   add'   s   
zPositionDeletes.addc                 C  s>   | j d urt| j dd d| _dd | jD | _d | _ d S d S )Nc                 S  s   | d S )N   r   )filer   r   r   <lambda>.   s    z1PositionDeletes._ensure_indexed.<locals>.<lambda>)keyc                 S  s   g | ]\}}|qS r   r   ).0_seqr   r   r   
<listcomp>/       z3PositionDeletes._ensure_indexed.<locals>.<listcomp>)r   sortedr   r   r   r   r   r   _ensure_indexed,   s
   

zPositionDeletes._ensure_indexedr%   list[DataFile]c                 C  s6   |    | js	g S t| j|}dd | j|d  D S )Nc                 S  s   g | ]\}}|qS r   r   )r#   r   r$   r   r   r   r&   7   r'   z1PositionDeletes.filter_by_seq.<locals>.<listcomp>)r)   r   r   r   )r   r%   	start_idxr   r   r   filter_by_seq2   s
   zPositionDeletes.filter_by_seqNr   r   )r   r   r   r   r   r   )r%   r   r   r*   )	__name__
__module____qualname____doc__	__slots__r   r   r)   r,   r   r   r   r   r      s    


r   r   r   r   boolc                 C  s(   | j }| j}|r
|sdS t|v ot|v S )NF)lower_boundsupper_boundsPATH_FIELD_ID)r   lowerupperr   r   r   _has_path_bounds:   s
   r9   	data_filec                 C  s(   t | sdS tttd|j}|| S )NT	file_path)r9   r   r   r   r;   eval)r   r:   	evaluatorr   r   r   _applies_to_data_fileC   s   
r>   
str | Nonec              	   C  sf   | j }| j}|r
|sdS |t}|t}|r1|r1||kr1z|dW S  ttfy0   Y dS w dS )zBReturn the path, if the path bounds evaluate to the same location.Nzutf-8)r4   r5   getr6   decodeUnicodeDecodeErrorAttributeError)r   r4   r5   r7   r8   r   r   r   _referenced_data_file_pathK   s   

rD   spec_idr   	partitionRecord | Nonetuple[int, Record]c                 C  s   |r| |fS | t  fS r   r
   )rE   rF   r   r   r   _partition_key_   s   
rI   c                   @  s<   e Zd ZdZdddZdddZddddZddddZd	S )DeleteFileIndexzGIndexes position delete files by partition and by exact data file path.r   r   c                 C  s   i | _ i | _d S r   _by_partition_by_pathr   r   r   r   r   h   s   
zDeleteFileIndex.__init__r3   c                 C  s   | j  o| j S r   rK   r   r   r   r   is_emptyl   s   zDeleteFileIndex.is_emptyNmanifest_entryr	   partition_keyrG   c                 C  sl   |j }|jpt}t|}|r| j|t }||| d S t|j	p#d|}| j
|t }||| d S Nr   )r:   sequence_numberr   rD   rM   
setdefaultr   r   rI   rE   rL   )r   rO   rP   r   r%   target_pathdeletesr"   r   r   r   add_delete_fileo   s   
zDeleteFileIndex.add_delete_filer   r   r:   r   set[DataFile]c           
      C  s   |   rt S t }|jpd}t||}| j|}|r.||D ]}t||r-|| q!| j	|j
}	|	r?||	| |S rQ   )rN   setrE   rI   rL   r@   r,   r>   r   rM   r;   update)
r   r   r:   rP   rU   rE   r"   partition_deletesr   path_deletesr   r   r   for_data_file|   s   



zDeleteFileIndex.for_data_filer-   )r   r3   r   )rO   r	   rP   rG   r   r   )r   r   r:   r   rP   rG   r   rW   )r.   r/   r0   r1   r   rN   rV   r\   r   r   r   r   rJ   e   s    

rJ   N)r   r   r   r3   )r   r   r:   r   r   r3   )r   r   r   r?   )rE   r   rF   rG   r   rH   )
__future__r   bisectr   pyiceberg.expressionsr   pyiceberg.expressions.visitorsr   pyiceberg.manifestr   r   r   r	   pyiceberg.typedefr   r6   r   r9   r>   rD   rI   rJ   r   r   r   r   <module>   s   

	

