o
    i|3                     @  s   d dl mZ d dlmZmZ d dlmZ d dlmZm	Z	m
Z
mZmZmZ d dlmZ d dlmZmZmZmZmZmZmZmZ d dlmZmZmZmZmZ erTd dlm Z  G d	d
 d
ed
 Z!dS )    )annotations)TYPE_CHECKINGAny)	Reference)INITIAL_PARTITION_SPEC_IDPARTITION_FIELD_ID_STARTPartitionFieldPartitionSpec_PartitionNameGenerator_visit_partition_field)Schema)AddPartitionSpecUpdateAssertDefaultSpecIdAssertLastAssignedPartitionIdSetDefaultSpecUpdateTableRequirementTableUpdateUpdatesAndRequirementsUpdateTableMetadata)IdentityTransformTimeTransform	TransformVoidTransformparse_transform)Transactionc                      s   e Zd ZU ded< i Zded< i Zded< i Zded< i Zded< i Zd	ed
< i Z	ded< ded< ded< ded< ded< d>d? fddZ
	d@dAd#d$ZdBd%d&ZdCd(d)ZdDd+d,ZdEd.d/ZdFd1d2ZdGd6d7ZdHd8d9ZdId<d=Z  ZS )J
UpdateSpecr   _transactionzdict[str, PartitionField]_name_to_field_name_to_added_fieldz%dict[tuple[int, str], PartitionField]_transform_to_field_transform_to_added_fieldzdict[str, str]_renameszdict[int, PartitionField]_added_time_fieldsbool_case_sensitivezlist[PartitionField]_addszset[int]_deletesint_last_assigned_partition_idTtransactioncase_sensitivereturnNonec                   s   t  | dd |j jD | _i | _dd |j jD | _i | _g | _	t
 | _|jjp2td | _i | _|| _|| _i | _d S )Nc                 S  s   i | ]}|j |qS  )name.0fieldr-   r-   Y/home/ubuntu/transcripts/venv/lib/python3.10/site-packages/pyiceberg/table/update/spec.py
<dictcomp>@   s    z'UpdateSpec.__init__.<locals>.<dictcomp>c                 S  s   i | ]}|j t|jf|qS r-   )	source_idrepr	transformr/   r-   r-   r2   r3   B   s       )super__init__table_metadataspecfieldsr   r   r   r    r%   setr&   last_partition_idr   r(   r!   r   r$   r"   )selfr)   r*   	__class__r-   r2   r9   >   s   

zUpdateSpec.__init__Nsource_column_namestrr6   str | Transform[Any, Any]partition_field_name
str | Nonec                 C  s  t |}|| jj | j}t|trt|}|j	j
}||s/t| d| d|j	j |j	jt|f}| j|}|rT| ||rTtd|j d| d| d| j|}	|	rdtd|	j | |j	j|f|}
|
j| jv r|td|
j t|
jtr| j|
j}|rtd	|
j d
|j |
| j|
j< |
| j|< | j|
j}|r|
j| jvrt|jtr| |j|jd t|j  ntd|j |
| j|
j< | j|
 | S )Nz cannot transform z values from zDuplicate partition field for $z=$z, $z already existszAlready added partition: z)Already added partition field with name: z!Cannot add time partition field: z conflicts with _z+Cannot add duplicate partition field name: ) r   bindr   r:   schemar$   
isinstancerC   r   r1   
field_typecan_transform
ValueErrorr.   field_idr5   r   get_is_duplicate_partitionr    _partition_fieldr   r6   r   r"   r4   r   r&   r   rename_fieldr%   append)r?   rB   r6   rE   ref	bound_refoutput_typetransform_keyexisting_partition_fieldadded	new_fieldexisting_time_fieldr-   r-   r2   	add_fieldN   sB   


zUpdateSpec.add_fieldc                 C  s   |  |t d S N)r\   r   )r?   rB   r-   r-   r2   add_identity~   s   zUpdateSpec.add_identityr.   c                 C  sl   | j |}|rtd| | j|}|rtd| | j|}|s-td| | j|j | S )Nz Cannot delete newly added field zCannot rename and delete field zNo such partition field: )r   rO   rM   r!   r   r&   addrN   )r?   r.   rY   renamedr1   r-   r-   r2   remove_field   s   zUpdateSpec.remove_fieldnew_namec                 C  s   | j |}|rt|jtr| ||d t|j S | j|}|r't	d| j |}|s6t	d| |j| j
v rCt	d| || j|< | S )NrG   z'Cannot rename recently added partitionszCannot find partition field z)Cannot delete and rename partition field )r   rO   rJ   r6   r   rR   rC   rN   r   rM   r&   r!   )r?   r.   rb   existing_fieldrY   r1   r-   r-   r2   rR      s   
zUpdateSpec.rename_fieldr   c                 C  s   |   }d}d}| jjj|jkr?|j| jj vr$t|dtddf}nt|jdf}| jjj}| jjj}t	|dt
|df}||fS )Nr-   )r;   )spec_id)last_assigned_partition_id)default_spec_id)_applyr   r:   rg   re   specsr   r   r>   r   r   )r?   new_specupdatesrequirements%required_last_assigned_partitioned_idrg   r-   r-   r2   _commit   s   

zUpdateSpec._commitr	   c                   s  ddd d fdd}g }t  }| jj jD ]p}|j| jvrQ| j|j	}|r:|| jj
 |j|j||j|}n|| jj
 |j|j|j	|j|}|| q| jjjdkr| j|j	}|rr|| jj
 |j|j|t |}n|| jj
 |j|j|j	t |}|| q| jD ]"} | jj
 |j	|j|j| t|j|j|j|j	d}|| qt| }t}	| jj  D ]}
||
r|
j}	 n|	|
jkr|
jd }	qt|d|	iS )NrI   r   r.   rC   r4   r'   r6   Transform[Any, Any]partition_namesset[str]r+   r,   c                 S  s*   ddl m} ||||| | || d S )Nr   )validate_partition_name)pyiceberg.partitioningrr   r_   )rI   r.   r4   r6   rp   rr   r-   r-   r2   _check_and_add_partition_name   s   z8UpdateSpec._apply.<locals>._check_and_add_partition_namerN   r   c                   s    | |||| t ||||S r]   )r   )rI   r4   rN   r.   r6   rp   rt   r-   r2   _add_new_field   s   z)UpdateSpec._apply.<locals>._add_new_fieldr7   )r4   rN   r6   r.   re   )rI   r   r.   rC   r4   r'   r6   ro   rp   rq   r+   r,   )rI   r   r4   r'   rN   r'   r.   rC   r6   ro   rp   rq   r+   r   )r=   r   r:   r;   r<   rN   r&   r!   rO   r.   rI   r4   r6   rS   format_versionr   r%   r   r	   r   ri   valuescompatible_withre   )r?   rv   partition_fieldsrp   r1   r`   rZ   added_fieldrj   new_spec_idr;   r-   ru   r2   rh      s   

	

	

	




zUpdateSpec._applyrW   tuple[int, Transform[Any, Any]]r   c           
      C  s   | j jjdkrJ|\}}g }| j j  D ]}|jD ]}|| qq|D ]$}|j|krIt|j	t|krI|d u s>|j
|krIt||j||j
  S q%|  }|d u rht|d ||d d}	t| j j |	t }t|d ||d |S )N   r   r7   unassigned_field_name)r   r:   rw   ri   rx   r<   rS   r4   r5   r6   r.   r   rN   _new_field_idr   rI   r
   )
r?   rW   r.   r4   r6   historical_fieldsr;   r1   new_field_id	tmp_fieldr-   r-   r2   rQ     s"   
zUpdateSpec._partition_fieldc                 C  s   |  j d7  _ | j S )Nr7   )r(   )r?   r-   r-   r2   r   !  s   zUpdateSpec._new_field_idro   partition_fieldc                 C  s   |j | jvo
|j|kS r]   )rN   r&   r6   )r?   r6   r   r-   r-   r2   rP   %  s   z"UpdateSpec._is_duplicate_partition)T)r)   r   r*   r#   r+   r,   r]   )rB   rC   r6   rD   rE   rF   r+   r   )rB   rC   r+   r   )r.   rC   r+   r   )r.   rC   rb   rC   r+   r   )r+   r   )r+   r	   )rW   r}   r.   rF   r+   r   )r+   r'   )r6   ro   r   r   r+   r#   )__name__
__module____qualname____annotations__r   r   r   r    r!   r"   r9   r\   r^   ra   rR   rn   rh   rQ   r   rP   __classcell__r-   r-   r@   r2   r   1   s.   
 
0




Y
r   N)"
__future__r   typingr   r   pyiceberg.expressionsr   rs   r   r   r   r	   r
   r   pyiceberg.schemar   pyiceberg.table.updater   r   r   r   r   r   r   r   pyiceberg.transformsr   r   r   r   r   pyiceberg.tabler   r   r-   r-   r-   r2   <module>   s    (
