o
    uyi2                     @  s   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 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 d dlmZm Z m!Z!m"Z"m#Z# er^d dl$m%Z% G d	d
 d
ed
 Z&dS )    )annotations)TYPE_CHECKINGAnyDictListOptionalSetTupleUnion)	Reference)INITIAL_PARTITION_SPEC_IDPARTITION_FIELD_ID_STARTPartitionFieldPartitionSpec_PartitionNameGenerator_visit_partition_field)Schema)AddPartitionSpecUpdate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fieldr2   r2   ^/home/ubuntu/maya3_transcribe/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 r2   )	source_idrepr	transformr4   r2   r2   r7   r8   A   s       )super__init__table_metadataspecfieldsr"   r#   r$   r%   r*   setr+   last_partition_idr   r-   r&   r!   r)   r'   )selfr.   r/   	__class__r2   r7   r>   =   s   

zUpdateSpec.__init__Nsource_column_namestrr;   Union[str, Transform[Any, Any]]partition_field_nameOptional[str]c                 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)   
isinstancerH   r   r6   
field_typecan_transform
ValueErrorr3   field_idr:   r$   get_is_duplicate_partitionr%   _partition_fieldr#   r;   r   r'   r9   r"   r+   r   rename_fieldr*   append)rD   rG   r;   rJ   ref	bound_refoutput_typetransform_keyexisting_partition_fieldadded	new_fieldexisting_time_fieldr2   r2   r7   	add_fieldM   sB   


zUpdateSpec.add_fieldc                 C  s   |  |t d S N)ra   r   )rD   rG   r2   r2   r7   add_identity}   s   zUpdateSpec.add_identityr3   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#   rT   rR   r&   r"   r+   addrS   )rD   r3   r^   renamedr6   r2   r2   r7   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 )NrL   z'Cannot rename recently added partitionszCannot find partition field z)Cannot delete and rename partition field )r"   rT   rO   r;   r   rW   rH   rS   r#   rR   r+   r&   )rD   r3   rg   existing_fieldr^   r6   r2   r2   r7   rW      s   
zUpdateSpec.rename_fieldr   c                 C  st   |   }d}d}| jjj|jkr6|j| jj vr$t|dtddf}nt|jdf}| jjj}t	|df}||fS )Nr2   )r@   )spec_id)last_assigned_partition_id)
_applyr!   r?   default_spec_idrj   specsr   r   rC   r   )rD   new_specupdatesrequirements%required_last_assigned_partitioned_idr2   r2   r7   _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 )NrN   r   r3   rH   r9   r,   r;   Transform[Any, Any]partition_namesSet[str]r0   r1   c                 S  s*   ddl m} ||||| | || d S )Nr   )validate_partition_name)pyiceberg.partitioningrw   rd   )rN   r3   r9   r;   ru   rw   r2   r2   r7   _check_and_add_partition_name   s   z8UpdateSpec._apply.<locals>._check_and_add_partition_namerS   r   c                   s    | |||| t ||||S rb   )r   )rN   r9   rS   r3   r;   ru   ry   r2   r7   _add_new_field   s   z)UpdateSpec._apply.<locals>._add_new_fieldr<   )r9   rS   r;   r3   rj   )rN   r   r3   rH   r9   r,   r;   rt   ru   rv   r0   r1   )rN   r   r9   r,   rS   r,   r3   rH   r;   rt   ru   rv   r0   r   )rB   r!   r?   r@   rA   rS   r+   r&   rT   r3   rN   r9   r;   rX   format_versionr   r*   r   r   r   rn   valuescompatible_withrj   )rD   r{   partition_fieldsru   r6   re   r_   added_fieldro   new_spec_idr@   r2   rz   r7   rl      s   

	

	

	




zUpdateSpec._applyr\   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   r<   unassigned_field_name)r!   r?   r|   rn   r}   rA   rX   r9   r:   r;   r3   r   rS   _new_field_idr   rN   r   )
rD   r\   r3   r9   r;   historical_fieldsr@   r6   new_field_id	tmp_fieldr2   r2   r7   rV   	  s"   
zUpdateSpec._partition_fieldc                 C  s   |  j d7  _ | j S )Nr<   )r-   )rD   r2   r2   r7   r     s   zUpdateSpec._new_field_idrt   partition_fieldc                 C  s   |j | jvo
|j|kS rb   )rS   r+   r;   )rD   r;   r   r2   r2   r7   rU      s   z"UpdateSpec._is_duplicate_partition)T)r.   r   r/   r(   r0   r1   rb   )rG   rH   r;   rI   rJ   rK   r0   r    )rG   rH   r0   r    )r3   rH   r0   r    )r3   rH   rg   rH   r0   r    )r0   r   )r0   r   )r\   r   r3   rK   r0   r   )r0   r,   )r;   rt   r   r   r0   r(   )__name__
__module____qualname____annotations__r"   r#   r$   r%   r&   r'   r>   ra   rc   rf   rW   rs   rl   rV   r   rU   __classcell__r2   r2   rE   r7   r    0   s.   
 
0




Y
r    N)'
__future__r   typingr   r   r   r   r   r   r	   r
   pyiceberg.expressionsr   rx   r   r   r   r   r   r   pyiceberg.schemar   pyiceberg.table.updater   r   r   r   r   r   r   pyiceberg.transformsr   r   r   r   r   pyiceberg.tabler   r    r2   r2   r2   r7   <module>   s   ( $	